• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как сделать TCP сервер?

Valeriy

New member
Здравствуйте. Я хочу сделать TCP сервер: ESP8266 -> UART -> STM32. Использую AT команды.
Включаю сервер:
"AT+CIPSERVER=1,80" -> ... ready
"AT+CIFSR" -> ... 192.168.4.1 OK
Подключаюсь к esp по WiFi
На компьютере запускаю клиент, пишу IP и ПОРТ. Пинг вроде проходит, но установить соединение не получается - error 10061. Объясните пожалуйста простыми словами, что необходимо чтобы организовать обмен данными по TCP? Я так понимаю, данные должны приходить ко мне на UART?
Могу ли я изменить IP сервера? Прошивка заводская (0018000902). Заранее всем спасибо.
 

JustACat

Moderator
Команда форума
Andy Korg, Не, ну если человек хочет именно TCP-сервер, то это много чего может значить, не только TCP2UART, как мне кажется... Или ошибаюсь?
Valeriy, расскажите подробнее, чего вы хотите добиться? Настроить ESP8266 одноразово с ПК, и чтобы она автоматом создавала сервер, а на STMке чтобы это все виделось как прозрачный мост TCP2UART? Или все таки планируется управление ESPшкой с вашей STMки?
Если второе, то, похоже, вы не до конца разобрались с AT командами...
Попробуйте сначала с ПК это все провернуть и разобраться полностью в AT командах. Там не все и не всегда прозрачно и логично в них, я сам некоторые вещи даже за баги принимал, а потом смотрю в инструкцию - нет, там это описано как функция :)
Ну и я бы рекомендовал обновить прошивку ESP на 0.21 и уже с ней разбираться (поведение от прошивки к прошивке меняется).
 

pvvx

Активный участник сообщества
Здравствуйте. Я хочу сделать TCP сервер: ESP8266 -> UART -> STM32. Использую AT команды.
Включаю сервер:
"AT+CIPSERVER=1,80" -> ... ready
"AT+CIFSR" -> ... 192.168.4.1 OK
Подключаюсь к esp по WiFi
На компьютере запускаю клиент, пишу IP и ПОРТ. Пинг вроде проходит, но установить соединение не получается - error 10061. Объясните пожалуйста простыми словами, что необходимо чтобы организовать обмен данными по TCP? Я так понимаю, данные должны приходить ко мне на UART?
Могу ли я изменить IP сервера? Прошивка заводская (0018000902). Заранее всем спасибо.
Для этого надо купить готовый модуль http://www.usriot.com/Product/cat-11.html . Там это уже соединено и всё написано.
Я свою "свалку-Web" и не довожу до рабочего варианта, абы не лишить такие фирмочки работы :).
 

Valeriy

New member
Или все таки планируется управление ESPшкой с вашей STMки?
Если второе, то, похоже, вы не до конца разобрались с AT командами...
Да нужен TCP сервер, который будет управляться через AT команды STMкой. Модули хочу подключить в локальную сеть к точке доступа, если я правильно понимаю (в сетевых технологиях у меня три дня опыта=)) они должны быть серверами со статичным ip. Но я ни как не могу разобраться как через AT команды настроить статичный ip. Заводская прошивка имеет такую функцию, или допиливать придется?

upd: Обновил прошивку, запустил сервер, ip оказывается меняется в настройках точки доступа. Программа ESPlorer очень помогла.
 
Последнее редактирование:

JustACat

Moderator
Команда форума
Да, такая функциональность есть. Так что вам нужно просто тщательнее по разбираться с документаций, и раз вы решили делать именно так, то конкретно в документации на AT прошивку.
Возьмите вот отсюда http://esp8266.ru/downloads/ обязательно эти два файла:
http://esp8266.ru/download/esp8266-doc/4A-AT-Espressif AT Instruction Set_v0.21.pdf
http://esp8266.ru/download/esp8266-doc/4B-AT-Espressif AT Command Examples_v0.3.pdf
И изучите их.

НО! Обязательно обновите прошивку на ESP на 0.21.
И пробуйте сначала все это делать через терминал с ПК (пока что без STM), я не совсем понял, так вы делаете, или сразу с STM пытаетесь.
То есть стоит делать по порядку, сначала добиться, чтобы ESP заработала в нужном режиме, а уже потом переводить все на управление с STM, иначе слишком много узких мест, вплоть до того, что где-то могут какие-то быть задержки неверные.
Для этого советую на ПК использовать одну и программ у меня в подписи которые.

Далее, по существу.
Определитесь, каким образом вы хотите реализовать статичный IP на ESP. Как минимум есть два:
1) либо ESP получает IP при подключении от вашего роутера/маршрутизатора, а тот в свою очередь выдает ей статичный IP по ее MAC-адресу (это настраивается в параметрах роутера)
2) либо ESP сама присваивает себе статичный IP адрес после подключения к роутеру, но тут возможен казус: у вас в сети этот IP может быть уже занят, назначен вашим же роутером какому-то другому устройству, тогда ничего хорошего из этого не выйдет, а ESP не будет этого знать

Я пользуюсь 1 вариантом. Минус его в том, что для каждой новой ESP приходится добавлять строчку в настройки вашего маршрутизатора. Обычно это делается где-то в разделе DHCP -> Резервирование IP адресов. Либо еще может быть Привязка IP- и MAC-адресов. У меня на роутере есть обе, я пользуюсь первой.

На самом деле есть и более сложные варианты с каким-то дополнительным координатором в сети, но, дума, пока вам не стоит за них браться.

Итак, вот, например, лог работы в ESPlorer.
Переносы строк подредактировал, чтобы сократить простыню.
Ну и вставил кое-где свои комментарии после // то есть команда должна быть отправлена без пробела в конце и обязательно с CR+LF.

Код:
PORT OPEN 115200 // открыли порт кнопкой

AT // проверили работу модуля
OK

AT+GMR // проверили версию прошивки
AT version:0.22.b1.0
SDK version:0.9.6(b1)
OK

AT+CWJAP? // проверили подключение к WiFi
No AP // его нету
OK

AT+CWMODE=1 // перевели в режим Station
OK

AT+CWDHCP=1,1 // включили в режиме Station работу DHCP, а если быть точным, то дали команду ESP получить IP от маршрутизатора
OK

AT+CWLAP // получаем список AP в пределах видимости
+CWLAP:(3,"тутSSIDмоейточкидоступа",-61,"тутMACмоейточкидоступа",4)
OK

AT+CWJAP="тутSSIDмоейточкидоступа","тутпарольмоейточкидоступа" // подаем команду подключиться к нашей точке
OK

AT+CWJAP? // снова проверили подключение к WiFi
+CWJAP:"тутSSIDмоейточкидоступа" // теперь оно есть
OK

AT+RST // презагружаем модуль, чтобы все закрепить
OK

ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x40100000, len 1320, room 16
tail 8
chksum 0xb8
load 0x3ffe8000, len 776, room 0
tail 8
chksum 0xd9
load 0x3ffe8308, len 412, room 0
tail 12
chksum 0xb9
csum 0xb9

2nd boot version : 1.3(b3)
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size : 4Mbit
jump to run user1

rlЋя
ready // вот модуль и перезагрузился

AT+CWJAP? // еще раз проверили подключение к WiFi, оно сохранилось и после перезагрузки снова поднялось, автоматом
+CWJAP:"тутSSIDмоейточкидоступа"
OK

AT+CIPSTA? // спрашиваем IP адрес, который наша ESP получила от роутера
+CIPSTA:"192.168.168.7" // а вот и он
OK

// если бы до этого у нас была команда AT+CWDHCP=1,0 - то адрес мы не получали бы от роутера по DHCP, а взяли бы себе сами, попробуем?

AT+CWDHCP=1,0 // посылаем команду на отключение режима DHCP
OK

AT+RST // перезагружаем для применения настроек
OK

ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x40100000, len 1320, room 16
tail 8
chksum 0xb8
load 0x3ffe8000, len 776, room 0
tail 8
chksum 0xd9
load 0x3ffe8308, len 412, room 0
tail 12
chksum 0xb9
csum 0xb9

2nd boot version : 1.3(b3)
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size : 4Mbit
jump to run user1

rlЋя
ready // модуль перезагрузился и готов

AT+CWJAP? // проверяем подключение к WiFi
No AP // нет подключения, что за фигня?
OK

AT+CWLAP // проверяем доступные точки
+CWLAP:(3,"тутSSIDмоейточкидоступа",-61,"тутMACмоейточкидоступа",4) // есть наша точка, так в чем же дело?
OK

AT+CWJAP="тутSSIDмоейточкидоступа","тутпарольмоейточкидоступа" // пробуем к ней подключиться
+CWJAP:1
FAIL // фейл, с чего вдруг?

AT+CIPSTA? // проверяем IP который у нас сохранен в память для самоприсвоения при подключении
+CIPSTA:"0.0.0.0" // вот она где собака порылась, в памяти у нас сохранен IP 0.0.0.0 - он некорректен, а так как мы отключили получение IP от роутера по DHCP, то модуль просто не может подключиться с кривым IP
OK

AT+CIPSTA="192.168.168.91" // назначаем нашему ESP сами IP адрес (лишь бы он был свободен и подходил к нашей сети, у меня сеть 192.168.168.0 - 192.168.168.255)
OK

AT+RST // перезагружаем для применения настроек
OK

ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x40100000, len 1320, room 16
tail 8
chksum 0xb8
load 0x3ffe8000, len 776, room 0
tail 8
chksum 0xd9
load 0x3ffe8308, len 412, room 0
tail 12
chksum 0xb9
csum 0xb9

2nd boot version : 1.3(b3)
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size : 4Mbit
jump to run user1

rlЋя
ready // модуль перезагрузился и готов

AT+CIPSTA? // проверяем IP который у нас сохранен в память для самоприсвоения при подключении
+CIPSTA:"192.168.168.91" // наши настройки сохранились, хорошо
OK

AT+CWJAP? // проверяем подключение к WiFi
+CWJAP:"тутSSIDмоейточкидоступа" // опа, оно поднялось само, теперь конфликта IP нет
OK

// далее можно по пинговать модуль с чего-то в этой же сети, например, с ПК из командной строки cmd
C:\Windows\System32>ping 192.168.168.91

Обмен пакетами с 192.168.168.91 по с 32 байтами данных:
Ответ от 192.168.168.91: число байт=32 время=67мс TTL=255
Ответ от 192.168.168.91: число байт=32 время=84мс TTL=255
Ответ от 192.168.168.91: число байт=32 время=2мс TTL=255
Ответ от 192.168.168.91: число байт=32 время=32мс TTL=255

Статистика Ping для 192.168.168.91:
    Пакетов: отправлено = 4, получено = 4, потеряно = 0
    (0% потерь)
Приблизительное время приема-передачи в мс:
    Минимальное = 2мсек, Максимальное = 84 мсек, Среднее = 46 мсек

// Ну вот, модуль пингуется, все отлично, можно идти дальше, снова возвращаемся в ESPlorer

AT+CWDHCP=1,1 // Я переключусь обратно на получение IP от роутера, мне так удобнее
OK

AT+RST // рестарт
OK

ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x40100000, len 1320, room 16
tail 8
chksum 0xb8
load 0x3ffe8000, len 776, room 0
tail 8
chksum 0xd9
load 0x3ffe8308, len 412, room 0
tail 12
chksum 0xb9
csum 0xb9

2nd boot version : 1.3(b3)
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size : 4Mbit
jump to run user1

rlЋя
ready // модуль готов

AT+CWJAP? // проверка подключения
+CWJAP:"тутSSIDмоейточкидоступа"
OK

AT+CIPSTA? // проверка IP
+CIPSTA:"192.168.168.7" // IP назначен - запомнили его
OK

// тут можно снова по пинговать, у меня пингуется
// дальше нам надо поднять сервер
// для работы TCP сервера на ESP по документации у нас должно быть CIPMODE=0 и CIPMUX=1
// причем это должно быть именно в таком порядке и именно до поднятия сервера, иначе оно просто не выставится

AT+CIPMODE=0 // выставляем CIPMODE
OK

AT+CIPMUX=1 // выставляем CIPMUX
OK

AT+CIPMODE? // проверяем CIPMODE
+CIPMODE:0
OK

AT+CIPMUX? // проверяем CIPMUX
+CIPMUX:1
OK

// все выставлено верно, можно сначала начать с проверки, может оно уже верно выставлено ;)

AT+CIPSERVER=1,80 // поднимаем (1) TCP сервер на порту (80)
OK

// вот, собственно, то, чего вы хотите, теперь можно попробовать с какой-нибудь программы подключиться к нашему серверу
// параметры такие: TCP на IP 192.168.168.7 и порт 80
// я попробую через hercules отсюда http://www.hw-group.com/products/hercules/index_en.html
// в режиме TCP client ввожу IP и порт и жму Connect
// после подключения нажимаю отправить строку "hello ESP"
// При этом в ESPlorer вижу следующее:

0,CONNECT // подключился клиент на соединение с индексом (0)

+IPD,0,9:hello ESP // по соединению с индексом (0) получили (9) байт данных и сами байты "hello ESP" - ровно 9 символов

// попробуем отправить что-то в ответ, набираем в ESPlorer команды
AT+CIPSEND=0,5 // отправить в соединение с индексом (0) сообщение длинной (5) байт
OK
> // ESP ждет от нас ровно 5 байт! важно теперь отправить ровно 5 символов/байт

hi! // я отправляю "hi!", но так как в ESPlorer выставлено добавлять CR и LF к каждому сообщению, то как раз получается 5 символов в сумме
SEND OK // ESP отрапортовал, что отправил

// далее в hercules отключусь - Diconnect
// в ESPlorer получу:

0,CLOSED // клиент отключен на соединении с индексом (0)
Вот, как-то так :) А вот так выглядит окошко hercules после этих действ:
2015-03-06_011734.png

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

Как это обыграть? Ну придется это все мониторить в самой STM'ке. Следить за тем, что и как отвечает ESP и на какие команды.
После ребута ESP (по вашей инициативе, либо если сама взбрыкнет) обязательно проверять все параметры: подключение к WiFi, выданный IP, установку режимов CIPMUX и CIPMODE, поднят ли сервер (после ребута сам он не поднимается).

Пробуйте!
 

JustACat

Moderator
Команда форума
Valeriy, пока писал, вы уже сами разобрались, что ж, хорошо!
Может кому-то еще мой пример когда-то поможет :)
 

tolyan23

New member
Как сделать TCP сервер при непосредственном программировании ESP нашел только 2 функции espconn_accept и espconn_regist_time (понятно что сначала нужно подключится по wifi это уже сделано)
 

Victor

Administrator
Команда форума
Как сделать TCP сервер при непосредственном программировании ESP нашел только 2 функции espconn_accept и espconn_regist_time (понятно что сначала нужно подключится по wifi это уже сделано)
Посмотрите в UDK в примерах [inline]C:\Espressif\examples\esphttpd\[/inline] и этот проект
 

J.D.Jou

New member
Вот момент с прозрачным UART2TCP Для меня остался секретом ибо АТ команда SEVETRANCELINK не выполняется стреляет EEROR
По сути задача передавать данные с квадрокоптера на программу Tower. Когда конфигурирую в ручную TCP то общение идет между модулем и программой ну и соответственно мне нужно сохранить режим TCP после выключения питания. Прошивка ESP8266 AT25 sdk v 1.0.1
 

jurik2007

New member
Вам нужен TCP2UART Можете использовать прошивку pvvx если он не против :)
После отключения питания от устройства оно переходит в режи Single , т.е tcp сервер на нем не работает.
пробовал ставить прошивку pvvx - вообще в терминале ничего не показывает.
поставил последнюю с этого сайта.
суть в том что мне этот вайфай девайс нужен для настройки ГБО .
т.е с газомозга машины по УАРТ снимаются сигналы , и передаются по вайфай на комп , где стоит вирт ком порт , который цепляется в вайфай 8266.
как я ни пытался - после сброса напряжения все возвращается - т.е тцп сервер не работает
МОЖНО ЛИ КАК ТО АВТОМАТОМ ЕГО ЗАПУСКАТЬ ?
извините если сложно описал свою проблему!
 

iliassin

New member
Здравствуйте. Приобрел модуль ESP-07. Запускаю на нем сервер с помощью AT команд так:

AT+CIPMODE=0 (сервер может принимать и отправлять данные)
AT+CIPMUX=1 (устанавливаем режим множественных соединений)
AT+CIPSERVER=1,8888 (запускаем открытый сервер на порту 8888)

Написал программу-клиент на дельфи. Все работает, сообщения от клиента сервер принимает и передает сообщения клиенту нормально. Но стоит отключить питание модуля и все настройки приходится делать заново(. Можно ли как-то сохранить настройки в ESP?

AT version:0.40.0.0(Aug 8 2015 14:45:58)
SDK version:1.3.0
Ai-Thinker Technology Co.,Ltd.
Build:1.3.0.2 Sep 11 2015 11:48:04

И еще вопрос... Я подключаю ESP-07 через UART к atmega8 и просто хочу с компьютера отправлять через Wifi команды микроконтроллеру, который их будет обрабатывать и делать, какие-то действия. Сейчас это все работает и получается, только ESP каждый раз приходится заново настраивать. Может есть другой способ реализации (не такой как делаю я)?
 
В AT прошивке весь смысл в этом настраивании. На то они и AT команды. Пусть мега8 и настраивает ESP-07. Либо же идем и пишем свою прошивку.
 

Victor

Administrator
Команда форума
Здравствуйте. Приобрел модуль ESP-07. Запускаю на нем сервер с помощью AT команд так:
Написал программу-клиент на дельфи. Все работает, сообщения от клиента сервер принимает и передает сообщения клиенту нормально. Но стоит отключить питание модуля и все настройки приходится делать заново(. Можно ли как-то сохранить настройки в ESP?
В некоторых командах да, можно.
Смотрите описание (немного старое описание, но основное там все есть), смотрите команды: там где CUR (current) для текущей сессии, а DEF (default) будет и после перезагрузки. Например, [inline]AT+UART_DEF[/inline]
 

iliassin

New member
Спасибо, за помощь, видимо и правда придется делать так чтобы mega сама настраивала ESP.
 
Сверху Снизу