ESP8266 Урок 28. FreeRTOS. Wi-Fi. STA. TCP Client. Приём и передача пакетов

 

 

 

Продолжаем работу по программированию микроконтроллера ESP8266 с использованием операционной системы реального времени FREEFTOS, а также продолжаем работу с протоколом TCP (Transmission Control Protocol). И на данном уроке мы уже попробуем не просто соединиться с сервером и передать тестовый пакет, но и также, передавая пакеты, мы попробуем такие пакеты ещё и принять. Мы также этим раньше занимались с использованием других контроллеров, поэтому нам будет гораздо легче справиться с нашей задачей.

Схема наша осталась прежняя

 

 

А проект мы, соответственно, за основу возьмём из прошлого урока с именем WIFI_STA_TCP_CLIENT_CONNECT_RTOS и дадим ему новое имя WIFI_STA_TCP_CLIENT_RTOS.

Откроем наш проект в Eclipse и в файле wifi.c сначала объявим глобальную структуру для передачи параметров в задачу приёма пакета, а также объявим переменную типа данной структуры

 

 

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

 

 

Присвоим указатель на параметры задачи нашему указателю

 

 

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

 

 

Присвоим указатель на наш буфер соответствующему указателю очереди дисплея, а также присвоим позицию, взятую из параметра, аналогичному полю очереди

 

 

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

 

 

Добавим бесконечный цикл, в котором попытаемся принять пакет

 

 

Здесь мы будем висеть до тех пор, пока не примем пакет либо пока не истекут 1000 милисекунд в соответствии с нашими настройками сокета.

Данная функция возвращает количество принятых байтов в пакете или -1 в случае ошибки.

Для интереса отправим в терминальную программу значение данного параметра

 

 

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

 

 

Добавим глобальную очередь для передачи флага состояния из другой задачи

 

xQueueHandle xQueue, xQueueClose;

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

 

 

Ниже создадим задачу, проинициализировав сначала параметры

 

 

Подождём 2 секунды

 

 

С интервалом в 2 секунды передадим пакет серверу

 

 

Выйдем из цикла и из условия и удалим вот эти старые строки

 

vTaskDelay( 2000 / portTICK_RATE_MS);

snprintf(str1, sizeof(str1), "Hello from ESP!!!\n");

write(sockfd,(void *) str1,strlen(str1));

vTaskDelay( 2000 / portTICK_RATE_MS);

shutdown(sockfd, 0);

 

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

 

 

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

 

 

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

 

xQueueHandle xQueue, xQueueClose, xQueueCloseAsk;

 

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

 

 

Если вернулась единица, то отправим соответствующее уведомление в терминальную программу и выйдем из цикла

 

 

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

 

 

В функции инициализации init_esp_wifi создадим наши обе очереди

 

 

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

 

 

В принципе, мы можем теперь проверить соединение с сервером, отправку пакетов и разрыв соединения после передачи десяти пакетов.

Запустим сначала wireshark и отфильтруемся по сетевому адресу нашего модуля (как это делать, мы давно знаем), затем в netcat дадим команду на прослушку порта и перезагрузим наш модуль, соответственно перед этим не забыв его прошить.

Посмотрим, как приходят пакеты

 

 

Посмотрим, как отобразился процесс в анализаторе трафика

 

 

Всё прекрасно соединяется, передаётся и разъединяется.

Осталось нам лишь научить наш клиент принимать пакеты.

В этой же функции добавим ветку else в условие валидности принятого пакета, в теле которой мы соберём в массив из пакета все символы и отправим его на дисплей

 

 

Соберём код, прошьём контроллер, отправив перед этим команду в netcat, и во время передачи пакетов из командной строки попытаемся что-то передать клиенту

 

 

Убедимся, что наш клиент принял пакет, увидев такой же текст на дисплее

 

 

В момент разрыва соединения с сервером мы также увидим на дисплее соответствующую надпись

 

 

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

 

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

 

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

 

Исходный код

 

 

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

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

Дисплей LCD 20×4 можно приобрести здесь Дисплей LCD 20×4

Дисплей LCD 16×2

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

 

 

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

 

ESP8266 FreeRTOS. Wi-Fi. STA. TCP Client. Приём и передача пакетов

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

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

*