ESP c AT-прошивкой выносит мозг :(

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вводные: AT-прошивка 0.40, режим множественных подключений (4 клиента), поднят сервер. ESP довольно интенсивно спамят с внешнего мира (вебморда), плюс из контроллера (Atmega2560) по UART в ESP пишется куча данных - MQTT и т.п.

Реализована параллельная неблокирующая обработка, когда в очередь помещаются команды, и по мере их разгребания происходит чудо :)

Трабла в следующем: как известно, ESP по приходу входящих данных плюёт в порт +IPD,<link id>,<data length>:<data>. Естественно, такую информацию надо отрабатывать безусловно - есть ли там что в очереди или нет - пришли данные, будь добр из разобрать и послать ответ. Однако  (на конкретном примере) - неконтролируемо происходит пересечение клиентов, т.е.:

1. в ESP посылается AT+CIPSTART=1,"IP address",80;

2. В ответ приходит 1,CONNECT - пока всё штатно, после этой строки, по идее - уже можно писать в ESP данные вызовом AT+CIPSENDBUF;

3. ВНЕЗАПНО в порт падает +IPD,1,14:<тут данные>, и я понимаю, что это данные запроса с вебморды!

Т.е. получаем что: ПОСЛЕ вызова AT+CIPSTART ESP почему-то считает себя вправе законнектить другого клиента в этот же слот! Как итог - полкило волос на жопе уже вырвано, ибо данная трабла просто не поддаётся формализации.

Сталкивался кто? Как лечить? Что делать? Подорожник?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015
Вот логи, демонстрирующие штатную и нештатную работу.
 
1. Штатный:
 
Requested to write data to IoT using ESP...
ESP: ==>> AT+CIPSTART=1,"TCP","184.106.153.149",80
<== ESP: 1,CONNECT
ESP: client connected - #1
ThingSpeak connected!
Write IOT DATA TO STREAM...
GET /update?api_key=zzzzz&field1=29.12&field2=28.73&field3=29.44&field4=37.40 HTTP/1.1
Accept: */*
User-Agent: greenhouse
Host: api.thingspeak.com


<== ESP: OK
ESP: ==>> AT+CIPSENDBUF=1,164
<== ESP: 5,4
<== ESP: OK
<== ESP: >
ESP: > received, start write from client to ESP...
<== ESP: 
<== ESP: Recv 164 bytes
<== ESP: 1,5,SEND OK
ESP: Client data written, ID=1
ESP: start parse +IPD, received=+IPD,1,555:
ESP: Client data available, ID=1
ESP: Client data available, ID=1
IOT done, success: true
ESP: +IPD parsed.
ESP: ==>> AT+CIPCLOSE=1
<== ESP: 1,CLOSED
ESP: client disconnected - #1
ThingSpeak disconnected.
<== ESP: OK

 

 
 
Видно, что запрос к ThingSpeak отработал, в ответку пришли данные, всё зашибись. Второй вариант - с пересечением клиентов:
 
 
Requested to write data to IoT using ESP...
ESP: ==>> AT+CIPSTART=1,"TCP","184.106.153.149",80
<== ESP: 1,CONNECT
ESP: client connected - #1
ThingSpeak connected!
Write IOT DATA TO STREAM...
GET /update?api_key=zzzz&field1=29.18&field2=28.69&field3=29.49&field4=37.30 HTTP/1.1
Accept: */*
User-Agent: greenhouse
Host: api.thingspeak.com


ESP: start parse +IPD, received=+IPD,1,14: //!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ВОТ ЭТА ХРЕНОВИНА, ЭТО ЗАПРОС С ВЕБМОРДЫ!!!
ESP: Client data available, ID=1
ESP: +IPD parsed.
<== ESP: 1,CONNECT
ESP: client connected - #1
<== ESP: 1,CLOSED
ESP: client disconnected - #1
ThingSpeak disconnected.

 

 
Т.е. во втором случае после CIPSTART мне в порт падают в этого же клиента данные, которых там, блин, быть не должно, т.к. этим клиентом сейчас коннектимся, по идее. Более того, у меня нет уверенности, что во втором случае ответ 1,CONNECT - это ответ на команду AT+CIPSTART, а не статус, что клиент 1 успел подконнектиться быстрее, чем ESP отработало AT+CIPSTART.
 
Вот как это формализовать?
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Понял неоднозначность: в одном случае в ответ на AT+CIPSTART приходит OK в конце, во втором - нет. Значит, ESP вроде как проглотило команду, но предпочло не выдавать ни OK, ни ERROR, вместо этого предпочтя выплюнуть в порт данные с внешнего клиента.

Замена AT+CIPSENDBUF на AT+CIPSEND - результата не дала. Буду рыть дальше.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015
В общем, было принято решение попробовать написать свою AT-прошивку с поддержкой тех немногих команд, что я юзаю. Заодно посмотрим, что получится. Использую ESP8266 Arduino Core, чтобы без лишних головняков. Сейчас тестирую на NodeMCU, потихоньку ввожу команды ;)
 
Всем немногословным участникам обсуждения - спасибо за интерес ;)