Иной раз возникает такая ситуация, что надо получить информационный доступ к устройству, которое висит под потолком или примонтированно за окном. Конструктив не позволяет протянуть провод через дверь или за окно. Очевидно, что в таких случаях надо наладить какой-то беспроводной интерфейс. Варианты могут быть такие: IR, LoRa, GFSK, BLE, UWB, WiFi.
В этом тексте я расскажу, как можно запустить беспроводную консоль на микроконтроллере.
Постановка задачи
Соединить микроконтроллер и ESP-01 трансивер. Запустить TCP сервер. Подключиться через PuTTY. Организовать беспроводную консоль.
Определения
алгоритм — последовательность действий.
программа — алгоритм реализованный на языке программирования
процесс — работающая программа в памяти
порт – это числовой идентификатор (16 бит), используемый в протоколе TCP/UDP для связи между процессами на разных компьютерах в сети. Порт позволяет приложениям идентифицировать друг друга и обмениваться данными, обеспечивая надежную и упорядоченную передачу информации.
IP‑адрес — 32-битное число идентифицирующее компьютер в сети.
сокет (socket) — программный интерфейс для обмена данными между процессами. Процессы могут выполняться как на одном компьютере, так и на разных устройствах, связанных сетью. Со стороны программиста сокет это пара чисел: IP адрес и порт.
Что надо из оборудования?
Наименование | Назначение |
NUCLEO-F401RE | Плата с микроконтроллером и программатором |
ESP-01 | WiFi трансивер |
Переходник для ESP-01 | Чтобы использовать только 4 провода для соединения MCU и ESP-01 |
Кабель USB-mini | чтобы соединить LapTop и PCB |
LapTop или смартфон | Для открытия TCP клиента |
Надо собрать вот такую схему

Надо также купить синий переходник для ESP-01 трансивера

Что надо из софтвера?
Название программы | Назначение |
PuTTY | GUI TCP клиент для PC |
TeraTerm | GUI serial port клиент для PC |
NetCat (nc) | консольный TCP клиент для PC |
telnet | консольный TCP клиент |
nmap | консольный сканер сети |
ping | утилита проверки Link-a |
arp | утилита для сопоставления IP адресов MAC адресам |
Реализация
Чтобы запустить TCP сервер на ESP-01 надо выполнять вот эту последовательность команд.
Order | AT-Команда | Пояснение | Ответ |
0 | AT+RST | перезагрузка модуля | лог загрузки |
1 | AT | проверка UART соединения- запустился ли модуль. | OK |
2 | ATE0 | Отключить UART эхо | OK |
3 | AT+CWMODE=1 | Переключиться на режим станции. Модуль сможет подключаться к точке доступа. | OK |
4 | AT+CIPMUX=1 | Разрешить множественное соединение | OK |
5 | AT+CWJAP="ssid","pass" | Подключится к маршрутизатору | WIFI GOT IP |
6 | AT+CIPSTA? | Запрашивает информацию о IP-адресе станции ESP8266 (модуль работает как станция). | OK |
7 | AT+CIPSERVER=1 | Запустить сервер, по умолчанию используется порт 333. | OK |
8 | AT+CIPSEND=id,length | Устанавливает длину отправляемых данных в байтах. Применяется для нормальной отправки, режим множественных соединений. | OK |
Вот типичные ответы на AT-команды
-----------------------------------------------
AT+RST
OK
ets Jan 8 2013,rst cause:1, boot mode:(3,5)
load 0x40100000, len 2592, room 16
tail 0
chksum 0xf3
load 0x3ffe8000, len 764, room 8
tail 4
chksum 0x92
load 0x3ffe82fc, len 676, room 4
tail 0
chksum 0x22
csum 0x22
2nd boot version : 1.7(5d6f877)
SPI Speed : 40MHz
SPI Mode : DOUT
SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000
---------------------------
AT
OK
---------------------------
ATE0
OK
---------------------------
AT+CWMODE=1
OK
---------------------------
AT+CIPMUX=1
OK
---------------------------
AT+CWJAP="ssid","pass"
WIFI DISCONNECT
WIFI CONNECTED
WIFI GOT IP
OK
---------------------------
AT+CIPSTA?
+CIPSTA:ip:"192.168.1.33"
+CIPSTA:gateway:"192.168.1.1"
+CIPSTA:netmask:"255.255.255.0"
OK
---------------------------
AT+CIPSERVER=1
OK
---------------------------
В случае установки соединения ESP-01 отправит на MCU в UART строку 0,CONNECT
Если PuTTY отправит строку hello_from_lapTop, то ESP-01 отправит в UART вот такие две строки:
+IPD,0,17:hello_from_lapTop
+IPD,0,2:
Тут 0- номер соединения, 17- количество байт в принятой строке, hello_from_lapTop — сами принятые полезные данные.
При приеме данных от сокета их надо передать на парсер CLI. CLI все выходные результаты пишет в очередь байтов. Далее отдельный конечный автомат отправки извлекает из очереди байты на отправку и передает их в WiFi трансивер по протоколу AT-команд ESP-01.
Установка соединения
Чтобы начать передавать данные по WiFi надо выполнить следующие действия:
порядок | Действие |
1 | Подключиться к ESP-01 трансиверу по UART |
2 | Переключить ESP-01 в режим станции |
3 | Разрешить множество подключений к серверу на ESP-01 |
4 | Подключиться к маршрутизатору |
5 | Получить IP адрес |
6 | Открыть TCP сокет |
Установкой соединения занимается отдельный конечный автомат управления link-ом. Вот его граф

Отправка данных MCU->ESP-01
Чтобы микроконтроллер отправил на PuTTY строку надо выполнить две отдельные команды: передать заголовок (с указанием размера) и передать сами данные. Выглядит это так:
AT+CIPSEND=0,10
OK
>
Recv 10 bytes
SEND OK
Тут AT+CIPSEND=0,10 это заголовок. После его отправки надо дождаться сначала OK затем дождаться появления курсора. Затем посылать сырой массив с данными. Как только ESP-01 примет указанное в заголовке количество байт появится сообщение Recv N bytes. После успешной отправки модуль ответит SEND OK.
Отправка данных в сущности представляет из себя диалог между микроконтроллером и WiFi трансивером. На стороне микроконтроллерной прошивки надо реализовать вот такой конечный автомат.

Этот автомат должен крутиться только в состоянии CONNECTED.
Проверка связи
И вот вы подали на отладочную плату электропитание и она как будто бы запустила TCP сервер. Как же понять на каком он IP адресе оказалась ESP-01? Тут можно открыть cmd консоль и выполнить команду arp -a. Это протокол, который ставит IP адресам их MAC адреса. Методом исключения можно выявить IP ESP-01.

Затем можно убедиться, что конкретный IP в самом деле отвечает выполнив команду
ping 192.168.1.35 -c 3 -i 2

Теперь надо понять на каком порте работает сервер внутри 192.168.1.35. Это можно выполнить утилитой nmap
nmap -sS -p 1-65535 192.168.1.35

Зная IP и порт (333) можно на стороне LapTop запустить TCP клиент. Это можно сделать в программе PuTTY. Поверх TCP будет просто текст команд для консоли и выводной текст консоли.

Так можно подключаться к CLI серверу, что работает внутри прошивки STM32 через IP адрес ESP-01 модуля.

Когда работает PuTTY терминал, TCP данные отправляются только при нажатии на кнопку Enter. То есть внутри PuTTY уже присутствует однострочный текстовый редактор (string reader). Вот так в открывшейся TCP CLI можно проверить версию прошивки на удалённом микроконтроллере.

Можно посмотреть диагностику GPIO.

На стороне MCU есть ещё отдельная UART-CLI и она показывает, как ESP-01 отражает события открытия и закрытия сокета.

Достоинства CLI через ESP-01
++ Это дешево. Вам надо только модуль ESP-01 за $1 USD. Вся остальная инфраструктура уже есть. Это маршрутизатор, смартфон, LapTop. Вам не нужен никакой другой переходник с USB на какой-н там GFSK или LoRa или еще что-н.
++ Благодаря WiFi консоли вы можете управлять микроконтроллером деже с мобильного телефона благодаря Andriod приложению TCP Client.

Вертикальный экран.

Итог
Удалось настроить доступ к микроконтроллерной CLI через WiFi. Удалось организовать беспроводную CLI между LapTop и микроконтроллером.
Как видите, для CLI на MCU даже не обязательно нужен интерфейс UART. CLI можно пустить даже по протоколу TCP.
Акронимы
Акроним | Расшифровка акронима |
CLI | command-line interface |
MCU | Microcontroller |
WiFi | wireless fidelity |
UART | Universal asynchronous receiver-transmitter |
TCP | Transmission Control Protocol |
Ссылки
Текст | URL |
ESP8266: справочник по командам AT | https://microsin.net/adminstuff/hardware/esp8266-at-commands-reference.html |
Nmap — руководство для начинающих | |
Nmap. Начало использования @netherneon | |
Шпаргалочка по применению Nmap | https://www.securitylab.ru/blog/personal/Bitshield/354239.php |
Дружимся с ESP @Rightech_IoT | |
Синтаксический разбор CSV строчек |
Вопросы
Зачем нужен IP адрес, если есть MAC?
Зачем нужен номер port, если есть PID процесса?