Вводные: 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 почему-то считает себя вправе законнектить другого клиента в этот же слот! Как итог - полкило волос на жопе уже вырвано, ибо данная трабла просто не поддаётся формализации. Сталкивался кто? Как лечить? Что делать? Подорожник?
Вот логи, демонстрирующие штатную и нештатную работу. 1. Штатный: Видно, что запрос к ThingSpeak отработал, в ответку пришли данные, всё зашибись. Второй вариант - с пересечением клиентов: Т.е. во втором случае после CIPSTART мне в порт падают в этого же клиента данные, которых там, блин, быть не должно, т.к. этим клиентом сейчас коннектимся, по идее. Более того, у меня нет уверенности, что во втором случае ответ 1,CONNECT - это ответ на команду AT+CIPSTART, а не статус, что клиент 1 успел подконнектиться быстрее, чем ESP отработало AT+CIPSTART. Вот как это формализовать?
Понял неоднозначность: в одном случае в ответ на AT+CIPSTART приходит OK в конце, во втором - нет. Значит, ESP вроде как проглотило команду, но предпочло не выдавать ни OK, ни ERROR, вместо этого предпочтя выплюнуть в порт данные с внешнего клиента. Замена AT+CIPSENDBUF на AT+CIPSEND - результата не дала. Буду рыть дальше.
В общем, было принято решение попробовать написать свою AT-прошивку с поддержкой тех немногих команд, что я юзаю. Заодно посмотрим, что получится. Использую ESP8266 Arduino Core, чтобы без лишних головняков. Сейчас тестирую на NodeMCU, потихоньку ввожу команды Всем немногословным участникам обсуждения - спасибо за интерес
Да я ж тоже не олень - сразу об этом подумал, просто привык до последнего пытаться побороть. Но китайцы всё сделали для того, чтобы люди писали свои прошивки: во-первых, закрыли исходники последних AT-прошивок. И, во-вторых - это ж надо так, не разруливать дедлоки на один слот! Походу, про атомарность критических операций их не учили