• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

rst

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

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