ESP + AT-прошивка + кучу клиентов = головняк. Как быть?

Тема в разделе "Arduino & Shields", создана пользователем DIYMan, 1 мар 2018.

  1. DIYMan

    DIYMan Guest

    Вводные: 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 почему-то считает себя вправе законнектить другого клиента в этот же слот! Как итог - полкило волос на жопе уже вырвано, ибо данная трабла просто не поддаётся формализации.

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

    DIYMan Guest

    Вот логи, демонстрирующие штатную и нештатную работу.

    1. Штатный:
    Видно, что запрос к ThingSpeak отработал, в ответку пришли данные, всё зашибись. Второй вариант - с пересечением клиентов:

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

    Вот как это формализовать?
     
  3. DIYMan

    DIYMan Guest

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

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

    DIYMan Guest

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

    Всем немногословным участникам обсуждения - спасибо за интерес ;)
     
    vvr, ИгорьК и arkadyf нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Ну я активно... сочувствую :)
    Сразу хотел предложить написать активную прошивку, но застеснялся :)
     
    DIYMan нравится это.
  6. DIYMan

    DIYMan Guest

    Да я ж тоже не олень - сразу об этом подумал, просто привык до последнего пытаться побороть. Но китайцы всё сделали для того, чтобы люди писали свои прошивки: во-первых, закрыли исходники последних AT-прошивок. И, во-вторых - это ж надо так, не разруливать дедлоки на один слот! Походу, про атомарность критических операций их не учили :)
     
    arkadyf нравится это.