Вопрос Атомарность выполнения команды (команда-ответ)

rst

New member
2. В ответ приходит 1,CONNECT - пока всё штатно, после этой строки, по идее - уже можно писать в ESP данные вызовом AT+CIPSENDBUF;
3. ВНЕЗАПНО в порт падает +IPD,1,14:<тут данные>, и я понимаю, что это данные запроса с вебморды!
А что Вас удивляет-то? Вы открыли сокет, с этого момента в него можно писать. Писать может также и удалённая сторона.

Во втором примере видно, что атомарность нарушена - мне не вернули ни OK, ни ERROR, вместо этого упал неатомарный ответ 1,CONNECT
Не очень понятно какой атомарности Вы ожидаете? Атомарна (непрерывна) должна быть одна строка команды/сообщения. На взаимное расположение во времени этих строк никаких гарантий нет. Ваше ПО должно быть готово к любой последовательности сообщений.
Своё понимание алгоритма работы с АТ-командами я приводил несколькими постами выше.
 

DIYMan

New member
Ваше ПО должно быть готово к любой последовательности сообщений.
Ага, конечно. Вы вообще читали, о чём я написал? Сокет я открыл с клиентской стороны, ВНЕЗАПНО, правда? Он может быть открыт к чёрту на рога, понимаете? И в этот момент В ЭТОТ ЖЕ сокет с ДРУГОГО адреса приходят данные. ВНЕЗАПНО, правда?

Я же говорю - теоретики могут просто помолчать в сторонке. Практикам - ясно, что я написал. Для вас специально повторю последовательность:

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 локальной сети. Китайская прошивка, видимо, написана вот такими же теоретиками, которые считают, что это нормально - пересекать два непересекающихся сокета. Норм, чо - так и живём.
 

rst

New member
З.Ы. Причём что безмерно удивляет в теоретиках - тот простой факт, что они читать неспособны, от слова "совсем": в приведённом мной примере в предыдущем сообщении ЯСНО ВИДНО
Слушайте, господин "практик", пока вы тут разводите сопли по несколько страниц, у меня устройство на базе ESP8266 работает уже не первый год. Нежданчик, да? И работает не с типа
инетснивной загрузкой .. несколько раз в секунду, запросы к ESP
(пару раз в секунду отправить два байта - это да - ну ОЧЕНЬ интенсивная нагрузка, куда уж нам) :D:D:D
а с реально непрерывным поток данным 40 кБ/сек и выше. И так непрерывно по несколько часов. Опять нежданчик, да?
А вам советую, включить мозг и тренировать его, а не пальцы на клавиатуре. Или найти человека, кто вам сможет сделать ваше устройство раз сами способны только графоманствовать, а головой думать неспособны.
В дальнейшем - разбирайтесь со своими багами сами, что-то советовать вам - бессмысленно... запущенный случай. И идите в игнор.
Я не ищу здесь решения проблемы с кривой китайской прошивкой
Это и видно что не ищите, просто по@#$деть сюда зашли. Проблема находится у вас между ушей. :D
 
Последнее редактирование:
Сверху Снизу