Ваше ПО должно быть готово к любой последовательности сообщений.
Ага, конечно. Вы вообще читали, о чём я написал? Сокет я открыл с клиентской стороны, ВНЕЗАПНО, правда? Он может быть открыт к чёрту на рога, понимаете? И в этот момент В ЭТОТ ЖЕ сокет с ДРУГОГО адреса приходят данные. ВНЕЗАПНО, правда?
Я же говорю - теоретики могут просто помолчать в сторонке. Практикам - ясно, что я написал. Для вас специально повторю последовательность:
1. Открыта вебморда на локальном компе, которая несколько раз в секунду запрашивает ESP на предмет всяких команд. Для простоты считаем, что адрес вебморды в локальной сети 192.168.1.100;
2. Со стороны микроконтроллера я открываю сокет на адрес google.com, вызывая AT+CIPSTART=0,"TCP","google.com",80;
3. В порт падает 0,CONNECT;
4. ВНЕЗАПНО в порт падает +IPD,0,14:CTGET=0|LIST - это запрос с ВЕБМОРДЫ на сокет, открытый на google.com!!!
Где атомарность, Зин? Она должна быть на таком уровне, просто обязана. Ничем, кроме как кривыми руками китайцев сие поведение я объяснить не могу. Пример совершенно из жизни, только вместо google.com идёт отправка в MQTT-брокер, который на том же компе, что и вебморда. Причём, предвосхищая ваше возможное "Ну вот, адреса-то одинаковые!", отмечу - адреса-то одинаковые, вот только порты разные, да и время открытия соединений НИКОГДА не будет в точности одинаковым - всегда кто-то вперёд, а кто-то - после. И если я открыл сокет - я его хозяин, давать этот же сокет другому клиенту - по меньшей мере коммунизмом попахивает.
Своё понимание алгоритма работы с АТ-командами я приводил несколькими постами выше.
Ваше понимание, безусловно, важно, но - только для вас. Если бы вы меньше теоретизировали, а просто попробовали на практике - вы бы поменяли своё понимание, кмк. На практике - есть неоднозначность работы AT-прошивки версии 0.40, которая позволяет себе вольности, которые, в свою очередь, НИКАК не разрулить никакой логикой работы с AT-прошивкой.
Ещё раз про атомарность: когда я подал команду AT+CIPSTART - я ожидаю, и совершенно справедливо, что по результату отработки этой команды мне вернётся либо:
1. Открытый сокет для моего соединения;
2. Ошибка, если кто-то в этот слот уже успел подконнектиться.
Но никак не ответ 0,CONNECT, а потом - данные с другого внешнего адреса. Так понятней? Впрочем, ответом не утруждайтесь, и прошу извинить за излишнюю резкость - недолюбливаю теоретиков, которые считают, что они всё знают лучше всех. Я не ищу здесь решения проблемы с кривой китайской прошивкой, я просто информирую общественность, что проблема - есть, и подтверждается не только мной, я хотя бы тем фактом, что (читать тут):
Releases · espressif/ESP8266_NONOS_SDK · GitHub
Fix that AT+CIPSTART causes busy if the server is connected at the same time;
Кстати сказать, Козюльский (с) "Ширли-Мырли" - слот при таком пересечении, как описано выше - реально тупо подвисает в 0.40, можете проверить.
Я сказал всё, думающий - поймёт. Дальнейшие поучения меня всяким жизненным понятиям - бессмысленны.
З.Ы. Причём что безмерно удивляет в теоретиках - тот простой факт, что они читать неспособны, от слова "совсем": в приведённом мной примере в предыдущем сообщении ЯСНО ВИДНО, что коннект идёт к ThingSpeak.com на один внешний IP, и в этот же слот ВНЕЗАПНО падают данные с IP локальной сети. Китайская прошивка, видимо, написана вот такими же теоретиками, которые считают, что это нормально - пересекать два непересекающихся сокета. Норм, чо - так и живём.