Анализ прошивки для ESP, нахождение проблемы
- Войдите на сайт для отправки комментариев
Готов заплатить разумную сумму человеку, который проанализирует прошивку и скажет, при каких обстоятельствах может не обновиться статус клиента в пуле, т.е. даст полный расклад ситуации.
Вопрос к тем, кто юзает ESP8266WiFi. Было ли у вас такое, что несмотря на вычитку данных WiFiClient.read - запрос к WiFiClient.connected всегда возвращал true?
Происходит какая-то непонятная хрень, которую я у себя воспроизвести не могу ни под каким соусом: имею в прошивке для ESP внутренний пул на 4 клиента. Прошивка - AT-подобная. У пользователя периодически возникает ситуация, когда ESP сбрасывает соединение, не отдавая нового входящего клиента. По коду прошивки это возможно только тогда, когда все слоты заняты (строка 820 и далее по списку файла *.ino, функция handleIncomingConnections). Клиенты - разные: входящие (приложение под Андроид, вебморда на локальном вебсервере), исходящие (запрос от контроллера отправить данные на сайт проекта, или на ThingSpeak, или - по MQTT).
Сама прошивка - довольно простая, наверняка есть косяки, которых я не вижу в упор: https://github.com/Porokhnya/GreenhouseProject/tree/master/ESP_AT По форматам команд более-менее совместима с AT-прошивкой от китайских друзей из Espressif.
Естественно, человек должен понимать некоторые вводные по асинхронной работе с UART, и разобраться в коде прошивки. Если возникнут вопросы, почему написано так, а не иначе - я отвечу. Сумма - обсуждаема, выплачивается только постфактум того, как будет предоставлено описание проблемы и объяснено, почему я олень. Хоть как: хотите - рисуйте граф состояний и переходов, хотите - словами опишите ситуацию, которая гарантированно приведёт к тому, что пул клиентов станет забит и строка 863 прошивки - сработает). Сразу скажу - я знаю, как это "сделать" в лоб: позвать AT+CIPSTART несколько раз, не вызывая AT+CIPCLOSE. Но и в этом случае - есть таймауты TCP-соединения, никто не будет держать его вечно активным. Или я ошибаюсь, и с таймаутами там что-то грустное, в ESP8266WiFi? Ок, в любом случае - это вырожденный пример, и такого в реале не наблюдается, т.е. постулируем для полноты вводных, что либо вызывается AT+CIPCLOSE на каждый AT+CIPSTART, либо - вторая сторона TCP-свистка сама закрывает соединение по HTTP-хидеру "Connection: close".
Не вижу ошибку (если она есть) в упор. Код, ессно, давно требует рефакторинга, ибо, во-первых, частично надёрган кусками, чтоб не париться на момент старта разработки (SerialCommand, нет ничего более постоянного, чем временное :) ) и, во-вторых, обложен подушками безопасности ещё с момента первого введения в эксплуатацию. Но это к теме проблемы не относится, поэтому - не обсуждаем.
У себя я воспроизвести ошибку не могу - работает, падла, и пул клиентов не заканчивается. Но, как известно - сколько конфигураций железа, столько и магии. Поэтому очень хочется понять, когда и почему эта шляпа может оставлять входящего клиента без коннекта, потому что все слоты внезапно стали занятыми (хотя не должны были, ни под каким соусом).
Вся переписка - здесь, через почту - неудобно, да и не люблю. После решения проблемы - сконтачимся по реквизитам для оплаты (вот тут можно и через почту), и алга.
Что касается суммы: озвучивайте предположительную, пожалуйста, при реальной готовности уделить время анализу прошивки. И я сразу дам отмашку - устроит меня ваш рейт или нет, чтобы зря не отнимать ваше, безусловно, ценное время. Господам вроде rkit - просьба сразу проходить мимо, желание общаться с людьми, которые со всеми разговаривают через губу - нет ни малейшего.
З.Ы. Если будет вопрос, почему не юзаю стандартную AT-прошивку (а он таки будет, предвижу), то скажу: она ещё более глючная, чем моя. И выдаёт такие чудеса, что ни один конечный автомат на стороне, общающейся с ESP - нормально не реализуешь. И выплывает это именно при более-менее интенсивной работе с ESP с клиентами с двух сторон - входящими и исходящими (порядка минимум 10 запросов в секунду, короче - вводя команды ручками, такого не увидеть от слова "никогда"). На следующий вопрос, "почему AT-прошивка" ответ тоже есть: патамушта история не знает сослагательного наклонения, и надо жить с тем, что есть.
З.З.Ы. Простыня, млять. Спасибо, что дочитали.
Недоозвучил, извиняюсь: вторым вариантом решения проблемы будет гарантированное (желательно со ссылками либо на куски исходников ESP8266WiFi, либо на подобные проблемы на форумах в сети ) доказательство того, что пул клиентов подвиснет в заполненном состоянии при невызове AT+CIPCLOSE для исходящего соединения, и что таймауты тут не помогут никак. Это позволит мне понять, на какой стороне проблема - в прошивке для ESP или в прошивке контроллера, общающегося с ESP при помощи страшного, убого выглядящего конечного автомата.
В идеале - проверка прошивки на вашей стороне, последовательным вызовом AT+CIPSTART на какие-нибудь адреса, без вызова AT+CIPCLOSE, и моделирование ситуации, когда и через пару часов - пул клиентов занят, и AT+CIPSTART на любой слот выдаёт ALREADY CONNECTED. В случае проверки на железе - упоминание версии ESP8266WiFi, которая установлена, ессно. Версия Arduino IDE - надо 1.8.5, без вариантов.
Цену озвуч
Цену озвуч
Всё написано и описано, в том числе - по цене. Достаточно внимательно прочитать пост. А внимательность - первое условие правильного и вдумчивого анализа прошивки ;)
Ещё один вариант работы (по цене - в последнем абзаце). Надо:
1. Закачать указанную по ссылке прошивку в ESP (желательно версии ESP-07);
2. Поднять там AT-командами сервер и подсоединиться к роутеру:
Дождаться, пока ESP отрапортует, что соединение с роутером установлено, и начинать её пихать следующим образом:
1. Для исходящих соединений - выполнять команду
где вместо 0 - слот клиента, диапазон [0,3]. Данные слать не надо, просто моделируем установку коннекта с сервером в сети. Но если очень хочется, то можно послать HTTP GET-запрос вызовом AT+CIPSENDBUF, правда, ручками это делать не очень удобно. Ответ от сервера должен появиться в мониторе порта. Подчеркну - данные слать необязательно.
2. Для входящих соединений - тыкаться откуда-либо к IP, выданному ESP роутером (посмотреть можно по команде AT+CIFSR) на порт 1975. Данные слать не надо, моделируем просто установку коннекта от клиента к ESP. Но если очень хочется - можно слать любые данные, они должны появиться в мониторе порта как событие +IPD.
3. Во время ожидания (читай следующий абзац) - развлекаться, посылая команду
или
Как только все слоты будут заняты (например, сделали два исходящих соединения AT+CIPSTART=0,... и AT+CIPSTART=1,... плюс два входящих соединения, проверили AT+CIPSTART, что на любой слот выдаёт ALREADY CONNECTED) - ждать, поочерёдно посылая команды из пункта номер 3 (с интервалом секунд в 10-20 между командами). Если в течение длительного времени (в идеале - более двух часов) в порт не упадёт событие закрытия соединения (0,CLOSED и т.п.) - тестирование прекращаем, отписываемся об окружении, на котором проводилась проверка. Как я писал - версия IDE нужна 1.8.5, остальное - не так важно.
Задача - смоделировать и задокументировать ситуацию, когда пул клиентов не освобождается никаким образом в том случае, когда никаких взаимодействий с клиентами ESP не производится. Занятость пула клиентов определяется косвенно, как невозможность сделать AT+CIPSTART на любой из четырёх слотов. Обращаю внимание, что недостаточно просто занять все слоты на старте - надо выждать время, заведомо большее таймаута соединения, в идеале - больше пары часов, чтобы точно превзойти максимальный таймаут SO_KEEPALIVE в 2 часа.
Отчёт - видео захвата экрана, где показана смоделированная ситуация. Если проблему воспроизвести не удаётся - видеоотчёт с показом, что ESP корректно закрывает соединения.
Если что непонятно - спрашивайте. По цене - озвучивайте, пожалуйста. Моё видение трудозатрат: максимум пару-тройку часов, включая запуск Bandicam для записи экрана, закачивание прошивки, введения команд и анализа результатов с написанием отчёта. Больше времени, при всём желании - там потратить просто некуда. Задача - для QA позиции junior, с рейтом на удалёнке порядка $3/час. Но я рассмотрю ваши предложения по цене, озвучивайте. Если не согласны с оценкой времени, требующегося на выполнение задачи - пожалуйста, мотивируйте (только прошу заметить, что в мои задачи не входит попутно объяснять, как подключить ESP к компу, как закачать туда прошивку, как вводить команды через монитор порта и т.п. - подразумевается, что QA-специалист это должен уже уметь).
З.Ы. В процессе, естественно, подскажу, если что-то вызывает трудности в понимании. Для этого можно будет договориться о времени связи по скайпу, да и в режиме онлайн с демонстрацией экрана всё провернуть - тоже приемлемо. Дело, как вы могли догадаться, в том, что на своём окружении я проблему воспроизвести не могу, и есть надежда, что это получится на стороне, если ошибка таки в прошивке для ESP (возможно даже, что дело тупо в версии библиотеки ESP8266WiFi, которую я сто лет не обновлял). Кстати сказать - рядом с прошивкой валяется файл README, там есть всё, необходимое для старта работы с прошивкой.
В качестве ремарки: я как-то ловил "баг" в ENC28J60. Два месяца. Потому что эта с..а вешалась раз в две недели и при определенной погоде. Баг оказался в сочетании железа и особенностей работы чипа. Посему я могу предполагать, что чисто анализом прошивки задачу можно не решить, хоть сиди над ней сутками.
Да, если кому вдруг задача, озвученная в сообщении #4 - кажется какой-то заоблачно-сложной и требующей какой-то немыслимой квалификации, то скажу, что за компом там надо быть от силы полчаса, львиная доля из которого уйдёт на закачивание прошивки, написания двух коротких макросов для программы Terminal (чтобы слали команды в ESP), запуск Bandicam, и - всё, остальное время - можно просто курить.
Подчеркну, что мне нужно проверить код на любом подвернувшемся стороннем окружении (другая партия ESP, другая версия библиотеки, да куча факторов, включая даже место проживания, в плане загруженности радиодиапазона - всё важно).
Это нужно мне ровно для того, чтобы убедиться, что с моим кодом - всё нормально, насколько это возможно. Никаких заказчиков и обязательств перед ними у меня нет, это часть открытого проекта контроллера теплицы, которым я делюсь с пользователями безвозмездно, т.е. даром. И я просто пытаюсь исповедовать парадигму, озвученную Экзюпери - вы в ответе за тех...
Я вполне реально оцениваю трудозатраты по этой задаче, благо - есть опыт таких оценок. Однако, если кто не согласен - предлагайте свою цену, мотивируйте, и будем дискутировать. Строго говоря, данную тему я разместил только для бОльшей широты охвата, и исходя из того факта, что тут есть исполнители, таки разбирающиеся в программировании. Пользователи шлют мне логи, бесплатно, но чем больше охват - тем лучше.
Сам я - ничего с этого не имею, от слова "совсем", оплачиваю из своего кармана. Надеюсь, все точки над i - расставил. Предложение будет актуально до завтрашнего утра, если никто не возьмётся, то, как говорится - на нет и суда нет, бывает, я не расстроюсь.
Спасибо за внимание.
В качестве ремарки: я как-то ловил "баг" в ENC28J60. Два месяца. Потому что эта с..а вешалась раз в две недели и при определенной погоде. Баг оказался в сочетании железа и особенностей работы чипа. Посему я могу предполагать, что чисто анализом прошивки задачу можно не решить, хоть сиди над ней сутками.
Да, знакомая магия. Я почти на 99.95% уверен, что дело в сочетании железа, тем более, что у пользователя два контроллера, с идентичными прошивками, один работает норм, другой - тупит. Но не проверить код - я не могу, и тут, сам понимаешь, важна каждая мелочь окружения. Мало ли - вдруг окажется, что при проверке ESP жёстко затупит? Там китайцы столько чудес в SDK напихали - мама не горюй, если читаешь esp8266.ru, понимаешь, о чём я ;)
Анализ прошивки, изложенный в стартовом сообщении - по сути, не приоритетен, более важно - погонять её, как описано в сообщении #4. Ну а там уже - по ходу, что называется: я готов понести финансовые потери за грамотную аргументацию и указание того, что надо поправить в коде, чтобы стало лучше. Цена - обсуждаема, т.к. тут гораздо больше нюансов, сам понимаешь.
А вот по прогону прошивки, чо уж там - тупо обезьянкина работа, со всем уважением, никого не хочу обидеть, просто там реально джуниору как семечки должно быть.
У меня лежит NodeMCU. Просто лежит. Но ESP я вообще не занимаюсь, в принципе. И форум по 8266 не читаю.
Если будет готовый тестовый скетч, то могу прошить / запустить.
У меня лежит NodeMCU. Просто лежит. Но ESP я вообще не занимаюсь, в принципе. И форум по 8266 не читаю.
Если будет готовый тестовый скетч, то могу прошить / запустить.
Так он есть, ссылку на него давал ;) Не парься, не хочу отнимать твоё время, пойми правильно: не твоя квалификация, нужен джун. Чой-то бармалей не берётся, странно - ведь он всё может :) Наверное, как назло, занят :))))
Всем спасибо, более неактуально, получил логи от нескольких пользователей, всё работает штатно. Видимо, дело действительно в определённом сочетании железа, т.к. проявляется строго на одном контроллере.
Тему можно закрыть.