• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
 
Сверху Снизу