ESP8266 Урок 16. Wi-Fi. STA. UDP Server



Продолжаем работу по приёму и передаче данных по Wi-Fi.

На данном также мы поработаем с протоколом транспортного уровня UDP, только напишем теперь мы уже сервер. Теперь мы не будем знать ни IP-адрес, не номер порта клиента, который нам будет присылать пакеты с датаграммами, поэтому нам придётся как-то их узнавать, чтобы в ответ посылать пакеты данным клиентам.

Модуль наш также будет работать в режиме станции.

Схема наша не изменилась — отладочная плата, подключенная к ПК по USB

 

 

Проект мы создадим на основе проекта прошлого занятия с именем ESPCONN_UDP_CLIENT и назовём его ESPCONN_UDP_SERVER.

Настройку станции в функции user_init мы не трогаем, хотя на первый взгляд может возникнуть сомнение, почему мы по-прежнему запускаем DHCP-клиент, а не сервер, ведь у нас же сервер. Но сервер у нас будет именно UDP, а не DHCP. DHCP-сервер будет подниматься тогда, когда мы будем настраивать наш модуль в режиме точки доступа и мы будем уже не получать адрес IP, а раздавать их другим узлам.

У функции обратного вызова таймера wifi_check_ip тело также не меняется, изменения начинаем вносить в теле функции udp_connect, в которой для начала удалим объявления переменной и массивов, они нам теперь не потребуются

 

uint32_t ip;

char data[] = «Hello\r\n»;

char udpserverip[15] = {};

 

Забьём нулями переменную структуры, которая также является полем переменной другой структуры

 

 

Вот эти строки также удалим

 

os_sprintf(udpserverip, «%s», UDPSERVERIP);

ip = ipaddr_addr(udpserverip);

os_memcpy(pConn.proto.udp->remote_ip, &ip, 4);

 

Локальным портом теперь будет порт сервера, так как у нас и есть сервер

 

pConn.proto.udp->local_port = UDPSERVERPORT;

 

А удалённый порт мы не назначаем, он останется нулевым, так как выше мы забили нулями всё поле. Следовательно, данную строку мы также удаляем

 

pConn.proto.udp->remote_port = UDPSERVERPORT;

 

 

Ну и также удалим отправку строки, так как отправлять нам её пока некому, к нам ещё не постучался ни один клиент

 

espconn_send(&pConn, (uint8_t*)data, strlen(data));

 

Переходим в функцию обратного вызова приёма пакетов udp_client_udp_recv_cb, в теле которой перед нами теперь встала задача определить адрес и номер порта клиента, приславшего пакет с датаграммой.

Объявим указатель на переменную типа вот такой структуры

 

 

Также объявим указатель на переменную известной нам структуры, которая будет уже отвечать за данные клиента и приравняем данный указатель указателю на аргументы из первого параметра функции

 

 

Убедимся, что мы приняли именно пакет UDP, и только в этом случае выполним код, находящийся ниже

 

 

 

В начале тела данного условия с помощью специальной функции библиотеки espconn возьмём информацию о клиенте из переменной структуры, взятой из параметров функции, и поместим её в переменную типа другой структуры. В случае удачного возврата из функции выведем в терминальную программу адрес и номер порта клиента, отправившего нам пакет

 

 

В противном случае выведем сообщение о том, что определить адрес клиента не удалось

 

 

После вывода в терминальную программу текста принятой датаграммы занесём данные клиента в переменную глобальной структуры

 

 

Вот теперь, скорее всего, наш ответный пакет отправится по нужному адресу.

Проверим это, собрав проект и прошив контроллер, а также запустив терминальную программу и соединившись с платой и запустив программу netcat со следующими параметрами

 

 

Попробуем отправить сообщение нашему серверу

 

 

Сервер благополучно ответил клиенту.

Также мы видим в терминальной программе адрес и номер порта клиента, а также длину и текст принятого от него сообщения

 

 

Также можно посмотреть, как происходит обмен, в программе анализа трафика Wireshark

 

 

 

 

 

Всё передаётся без ошибок. Отлично!

Таким образом, на данном уроке мы создали простой, но уверенно функционирующий сервер UDP, также мы научились в функции обратного вызова приёма пакета от клиента определять адрес и номер порта отправителя.

Всем спасибо за внимание!

 

 

Предыдущий урок Программирование МК ESP8266 Следующий урок

 

Исходный код

 

 

Модуль ESP NodeMCU можно купить здесь: Модуль ESP NodeMCU

Различные модули ЕSP8266 можно приобрести здесь Модули ЕSP8266

Переходник USB to TTL можно приобрести здесь ftdi ft232rl

Многофункциональный переходник CJMCU FT232H USB к JTAG UART FIFO SPI I2C можно приобрести здесь ftdi ft232rl

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

ESP8266 Wi-Fi. STA. UDP Server

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*