Инструменты пользователя

Инструменты сайта


prog:ethernet:tcpip

Тест стандартного примера TCPIP

TCP/IP - это аббревиатура термина Transmission Control Protocol/Internet Protocol (Протокол управления передачей/Протокол Internet). В терминологии вычислительных сетей протокол - это заранее согласованный стандарт, который позволяет двум компьютерам обмениваться данными. Фактически TCP/IP не один протокол, а несколько. Именно поэтому вы часто слышите, как его называют набором, или комплектом протоколов, среди которых TCP и IP - два основных.

Поправка проекта

В стандартном примере из пака есть небольшая ошибка. При настройке генератора HSE2, используемого для тактирования блока PHY, установлен режим BYPASS, поскольку на отладочных платах первых ревизий устанавливался генератор на 25 МГц. Затем, начиная со 2-ой и более поздних ревизий платы, стали устанавливать осциллятор на 25 МГц. Следовательно, вместо режима BYPASS необходимо использовать режим осциллятора при настройке HSE2. Для этого поправляем аргумент функции RST_CLK_HSE2config ().
RST_CLK_HSE2config(RST_CLK_HSE2_Bypass); 
Заменяем на:
RST_CLK_HSE2config(RST_CLK_HSE2_ON);

Работа с командной строкой

После небольшой корректировки примера убедимся работоспособности. Данный проект реализует эхо-сервер на основе TCP/IP протокола. То есть мы отправим пакеты на МК и получим их обратно. Работать будем с командной строкой Windows и командой ping. Другими словами, будем пинговать наш контроллер. Соединять будем с ПК с помощью патч-корда, идущего в комплекте с отладочной платой. С помощью сочетания клавиш win+R открываем окно "выполнить", прописываем команду cmd. Посмотрим IP адрес нашего компьютера с помощью команды

ipconfig –all

На картинке видим IP. Здесь нужно понимать важную особенность, что в данный момент компьютер подключен к сети с выходом в интернет. В настройках соединения по локальной сети стоит получение IP адреса автоматически, это означает, когда мы выдернем провод интернета из компьютера и подключим плату МК, этот IP приблизительно через 1 минуту изменится. То есть компьютер будет посылать запросы маршрутизатору в сеть «Кто Я?» и, поскольку ответа он не получит, наш ip изменится с динамического на статический.

Воспользуемся ARP-таблицей. ARP — протокол сетевого уровня, предназначенный для преобразования IP-адресов (адресов сетевого уровня) в MAC-адреса (адреса канального уровня) в сетях TCP/IP. ARP-таблица отображает IP и MAC подключенных к серверу сетевых устройств. Чтобы отобразить таблицу воспользуемся командной:

arp -a

Отобразились все ip, подключенные к серверу, и как можно заметить, в нашей подсети 1ХХ.ХХ.Х.XX все ip динамические.

Ping

Подключаем микроконтроллер(отладочную плату) к ПК с помощью патч- корда. Как было объяснено в предыдущем разделе IP адрес ПК изменяется, после того как он отсоединен его от сети интернета. Для того чтобы запинговать МК необходимо, чтобы и контроллер и ПК находились обязательно в одной локальной сети.

Откроем проект в Keil и перейдем к заголовочному файлу tcpip.h, в котором задается IP адрес МК.

#define MYIP_1               192                 // our internet protocol (IP) address
#define MYIP_2               168
#define MYIP_3               38
#define MYIP_4               2

Проверяем ещё раз наш IP-адрес командой ipconfig.

Видим, что IP нашего ПК изменился. Также обращаем внимание на маску подсети, значение которой говорит нам о том, что первые два числа узлов МК и ПК должны совпадать. Следовательно, меняем параметры MYIP на следующие:

#define MYIP_1               169                 // our internet protocol (IP) address
#define MYIP_2               254
#define MYIP_3               40
#define MYIP_4               22              

Первые два значения совпадают. Загружаем прошивку в камень, выполняем команду

ping 169.254.40.22            

И наблюдаем успешную отработку микроконтроллером ICMP Echo-Request пакетов. Теперь можно вновь обратиться к ARP таблице (команда ARP–a), где мы обнаружим наш МК.

Клиенты TCP: Hercules

Hercules - это удобная терминальная программа для работы как с последовательными интерфейсами, так и с UDP/IP и TCP/IP - соединениями в режиме "клиент", и в режиме "сервер". Это как раз то, что нам нужно! Найти программу можно в интернете. Запустив программу, переходим во вкладку TCP Client, вводим наш IP и пробуем пинговать. Контроллер реагирует.

Теперь установим соединение по TCP/IP с нашим МК. Такое соединение в данном протоколе устанавливается с помощью "тройного рукопожатия". Для соединения очень важно указать порт. Поскольку мы устанавливаем TELNET-соединение, номер порта определён в файле tcpip.h следующим параметром:

#define TCP_PORT_TELNET		 23

Задаём соответствующее значение в программе и подключаемся, оставив IP неизменным.

После установления соединения в нижнем поле вводим текст для посылки в контроллер и нажимаем Send. В основном окне программы Received/Send data видим отправленное сообщение, выделенное фиолетовым цветом, а то, что отвечает микроконтроллер - чёрным.

Клиенты TCP: PuTTY

Протестируем пример на другом, более известном и свободно распространяемом клиенте для различных протоколов удалённого доступа - PuTTY. Указываем опять тот же IP адрес и соответствующий порт, выбираем тип соединения - TELNET.

И тестируем! Все символы, введённые с клавиатуры, МК тут же возвращает обратно.

Страница HTML

Есть интересный проект под МК 1986ВЕ3Т, который является небольшой модификацией стандартного примера. В нём ПК соединяется с МК по TCP/IP, а последний, в свою очередь, отправляет html-страницу, которую можно открыть в браузере, на компьютер. На страничке выводится информация о МК Миландра серии Авиа, а также реализована возможность светодиодной индикации на плате. Для реализации такого проект в стандартный пример были внесены небольшие изменения:

  • добавлен код html страницы в массив DataOut[],
  • сделана инициализация диодов и добавлена функция для обработки присылаемых с ПК данных для индикации.

(Проект выложен на GitHub.)

Но обо всём по порядку. Для начала, изменим значение TCPLocalPort в файле tcpip.c:

TCPLocalPort = TCP_PORT_HTTP;

Поскольку раньше МК возвращал нам то, что мы отправили, по принципу стандартного "ЭХО", сейчас мы изменим аргументы функции TCPTransmitTxBuffer

TCPTransmitTxBuffer(TCPRxDataCount, (uint8_t *)(((uint8_t *)&InputFrame[0]) + TCP_DATA_OFS));

следующим образом:

TCPTransmitTxBuffer((sizeof(DataOut) - 1), (uint8_t *) DataOut);

где функция (sizeof(DataOut) -1) (вычитание единицы необходимо для того, чтобы не учитывать символ '\0', который компилятор автоматически подставляет для обозначения конца строки) реализует подсчёт символов массива DataOut (в нём содержится HTML код нашей странички) и возвращает результат как аргумент функции TCPTransmitTxBuffer(); второй аргумент является указателем на наш массив данных DataOut. Также после отправки данных с помощью функции TCPTransmitTxBuffer(…) необходимо вызвать функцию TCPClose(), чтобы указать браузеру об окончании передачи страницы.

Теперь при обращении из браузера по IP адресу МК будет загружаться страничка из массива DataOut.

HTML страничка также подразумевает управление МК, а именно, зажигание светодиодов на плате с помощью передачи параметров кнопками "LED1 ON", "LED1 OFF" и другими. Чтобы МК воспринимал параметры, отправляемые ему с ПК, добавим функцию светодиодной индикации Drive_Led() в проект, листинг приведён ниже.

void Drive_Led(void)
{
  uint8_t *Key = (uint8_t *) &(EthernetTCPIP_Frame->Data);
  uint32_t i, s = 0;
 
  for (i = 0; (i < TCPRxDataCount) && s == 0; i++)
  {
    if (*Key == 'L')
     if (*(Key + 1) == 'e')
	if (*(Key + 2) == 'd')
         switch (*(Key + 3))
         {
           case '1' :
           {
	     if(*(Key + 4) == '1')
		PORT_SetBits(MDR_PORTB, PORT_Pin_0);
	     else if(*(Key + 4) == '0')
		PORT_ResetBits(MDR_PORTB, PORT_Pin_0);
	     s = 1; // Выйти из цикла for
             break;
           }
           case '2' : 
           {
	     if(*(Key + 4) == '1')
		PORT_SetBits(MDR_PORTB, PORT_Pin_1);
	     else if(*(Key + 4) == '0')
		PORT_ResetBits(MDR_PORTB, PORT_Pin_1);
	     s = 1; // Выйти из цикла for
             break;
           }
         }
    Key++;
  }
}

Прокси сервер

Чтобы локально зайти на нашу страничку в браузере, нам необходимо отключить использование прокси-сервера. Сделаем это следующим образом:

1. Воспользуемся комбинацией Win + R, введём команду Inetcpl.cpl.

2. В открывшемся меню перейдём на вкладку «Подключения» и выберем «Настройка сети».

Далее на выбор предлагается два варианта:

3(а). Необходимо снять галочку с пункта использовать прокси-сервер для локальных подключений.

3(б). Или же добавить наш IP адрес контроллера в список исключений, выбрав "Дополнительно" и внеся его в исключения.

Страничка выглядит так:

P.S. В HTML коде страницы рисунки добавлены как ссылки, загружаемые из интернета, поэтому если Вы отключите компьютер от глобальной сети, чтобы соединиться локально с микроконтроллером, на странице рисунки отображаться не будут.

prog/ethernet/tcpip.txt · Последние изменения: 2019/03/04 15:10 — katya