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

Баги и недосмотры в sdk от espressif

clinkme

Member
Ну мне кажется, что web-сервер сам по-себе - тупиковая ветка,точно также как всякие франкенштейны, xboot-ы и т.п. Все это дело можно (и должно) использовать исключительно для конфигурирования, а сами полезности (управление реле, лампочками и т.д.) надо реализовывать в нативном коде.
 

pvvx

Активный участник сообщества
Ну мне кажется, что web-сервер сам по-себе - тупиковая ветка,точно также как всякие франкенштейны, xboot-ы и т.п. Все это дело можно (и должно) использовать исключительно для конфигурирования, а сами полезности (управление реле, лампочками и т.д.) надо реализовывать в нативном коде.
Web и делается для конфигурирования, передачи информации и управления датчиками. Любое устройство управления требует запись логов и статистики. Например любой ADC. Сервер и будет делать логирование и сборку статистики за год, к примеру с шагом в усредненных показаний за 30 минут и показ её в графическом виде. Предполагается логирование и сбор статистики с не менее 16 датчиков. А типы датчиков и прочее подключаются библиотеками, а не кодом. Примерно такие наброски только на одно направление, зачем нужен web :) Есть и другие варианты.
Для реализации любой задачи на esp8266 сначала требуется узнать и найти обходы ошибок SDK и DDK. Только после этого, зная как это всё работает, можно приступать к разработке алгоритма для реализации задачи. Иначе выйдет как уже вышло у многих - все вышедшие на сегодня реализации надстроек на ESP8266 имеют неисправимые алгоритмические ошибки.
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
Что-то в новом SDK v0.9.4 LWIP вообще сломали, событие discon_cb 1 раз вызывается и дальше ступор, даже событие connect_cb перестает работать, капец.

pvvx не смотрел что там намесили и как подправить?

P.S. Уже увидел правки на странице ранее, правда даже с ними раза 2-3 данные отправляются, а потом ступор.
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
C новой liblwip.a из SDKv0.9.4 перестал работать esphttpd, отображает пустые страницы, с 0.9.3 все нормально :( Ох уж эти китайцы.
 
Последнее редактирование:

pvvx

Активный участник сообщества
C новой liblwip.a из SDKv0.9.4 перестал работать esphttpd, отображает пустые страницы, с 0.9.3 все нормально :( Ох уж эти китайцы.
Я её не пользую и не тестировал новую espcon досконально. Но там добавили несколько переменных, описывающих каждый открытый сокет. Памяти для пользования стало меньше :)
typedef struct _comon_pkt{
void *pcb;
int remote_port;
uint8 remote_ip[4];
uint8 *ptrbuf;
uint16 cntr;
uint16 write_len;
uint16 write_total;
sint8 err;
uint32 timeout;
uint32 recv_check;
enum espconn_option espconn_opt; // =1 -> ESPCONN_REUSEADDR
os_timer_t ptimer;
}comon_pkt;
Введена переменная write_total общего счета переданных байт и с ней, возможно, имеются проблемы. Она влияет на вызов sent_cb.
Введен флаг espconn_opt. Он влияет на закрытие соединения - надвеска для уничтожения TIME_WAIT pcb, не вписывающаяся ни в какие стандарты tcp.
Больше вроде ничего и всё должно работать по старому, как в 0.9.3.
Автор httpd - безграмотный и его код не должен был работать нормально. Он работал, только за счет случайных стечений обстоятельств. :) Процедура sent успевала передать из заданного буфера в стеке (!) данные в pcb к WiFi и код процедуры передачи туда байт сложился такой, случайно, что добавлял Lwip-у новые данные в pcb при повторном вызове, т.к. какие-то отработки там ещё не завершились. :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Что-то в новом SDK v0.9.4 LWIP вообще сломали, событие discon_cb 1 раз вызывается и дальше ступор, даже событие connect_cb перестает работать, капец.
pvvx не смотрел что там намесили и как подправить?
P.S. Уже увидел правки на странице ранее, правда даже с ними раза 2-3 данные отправляются, а потом ступор.
Используйте recon_cb как discon_cb. Это аналогичные вызовы. Один происходит по закрытию соединения без ошибок, а второй, когда закрытие с ошибками. Ну не совсем с ошибками, а например когда соединение закрывается со стороны клиента. Это событие espconn не понимает (основная причина её зависаний по таймеру и лазанию в чужие соединения pcb) и в исправленной версии теперь сразу вызывает recon_cb c ошибкой -11 (потеря pcb, т.к. Lwip уже сам закрыл соединение и удалил pcb, выдав FIN+ACK. У них трактуется как #define ESPCONN_CONN -11 /* Not connected. */).
Проблема кроется в алгоритме работы espconn c Lwip. espconn, при открытии соединения запоминает указатель на pcb и дальше работает с ним, без проверки, а живо ли это соединение ещё. :) Ситуация, когда по данному указателю в Lwip находится новое соединение бывает часто. :) Нефиг самостоятельно лезть по указателю, не опросив главного - Lwip. Когда что-то надо, то Lwip вызывает сам назначенные процедуры (калбаки), с правильным указателем на pcb. Так что espconn не лечиться и все её навороты с ssl и т.д. в помойку. Патч будет превышать исходные процедуры и это не переноситься в мультизадачку... как и всё от Espressif Systems (Wuxi).
 
Последнее редактирование:

pvvx

Активный участник сообщества
Пока решение с lwip такое lwip_sdk094_v2.zip https://yadi.sk/d/oFDjOqrpdYYGG
Проверил с tcp - работает.
Удалил write_total :)
Тест на espconn:
test.gif
Но надо учитывать все выше описанное...
Теперь конкретнее:
Было вставлено:
if (value && (pnode->pcommon.write_len == pnode->pcommon.write_total)){
espconn_tcp_sent(pnode, psent, length);
}else
return ESPCONN_ARG;
Т.е. пока прошлые данные не переданы, новых добавлять нельзя и надо проверять, что возвращает функция espconn_sent(...).
В приложенной версии патча - по старинке, как в 0.9.3, для тех кто не любит проверять что возвращают функции. :)
Для нормы используйте lwip_sdk094_v1.zip, выложенный ранее.
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
все равно фигня полная, что с lwip_sdk094_v1.zip, что с lwip_sdk094_v2.zip, 1-2 раза данные отправляются, потом пожизненный вызов recon_cb с ошибкой ESPCONN_CONN :(
может у меня конечно руки-крюки и я написал фигню
pvvx если есть желание, то вот http://rghost.ru/59916951 исходники с которыми я эксперементирую на предмет организации TCP клиента и отправки данных, там все просто, в user_config.h задаются все настройки, далее с периодичностью в N сек. на TCP-сервер отправляется строка, пару раз она отправляется, потом вечный recon_cb. Мне просто важно знать, что я не накосячил в коде.
 

pvvx

Активный участник сообщества
задаются все настройки, далее с периодичностью в N сек. на TCP-сервер отправляется строка, пару раз она отправляется, потом вечный recon_cb.
У меня ESP8266 с этим кодом не соединяется с базой. Надо глядеть...
 

pvvx

Активный участник сообщества
А там нет никакой базы, на ПК нужно запустить TCP-сервер и все, в user_config.h задать его адрес и порт.
Там в настройках WiFi задан режим подключения модуля к AP. Автоконнекта не задано и т.д....
 

pvvx

Активный участник сообщества
все равно фигня полная, что с lwip_sdk094_v1.zip, что с lwip_sdk094_v2.zip,
Они только для tcp сервера и то с натягом. Для tcp клиента исправить невозможно. Espconn не хранит данных, по которым можно узнать, с кем было соединение. Имеются только remote ip и port = 0, а желательно меть и локальный порт и ip, для получения указателя в lwip на есть или нет соединение. Допиленный на данный случай liblwip_cor.a v3 https://yadi.sk/d/euTtL5qUda4Bm , а то дети используют его для клиента. Вставлена проверка на remote ip | port == 0 - при этом оставляет espconn страдать самой.
Я больше не желаю заниматься редактирование каждой бяки от ... в espconn. Исходники даны, ошибка указана - кто понимает, тот сам...
 
Последнее редактирование:

pvvx

Активный участник сообщества
SHERTS: “залог "правильной работы" - это правильный настроенный wi-fi”

Наблюдаю такую зависимость у ESP8266:

При подключении к внешней AP, требуется обязательная настройка его AP на метод шифрования и т.д. (как у внешней AP, к которой подключаемся клиентом)?

Проверить все разнообразия не успел. Но, вроде, настройка внутренней AP инициализирует метод шифрования и протокол для подключения клиентом к другой AP.
 

clinkme

Member
0.9.5b не смотрел? По крайней мере, мою ошибку с
wifi_station_get_connect_status() исправили.
 

pvvx

Активный участник сообщества
0.9.5b не смотрел? По крайней мере, мою ошибку с
wifi_station_get_connect_status() исправили.
Смотрел и дал им ещё. Там ещё много неописанных и не привязанных структур и enum. Скоро народная версия SDK будет круче, чем у Espressif.
 

pvvx

Активный участник сообщества
Очень затребованные процедуры для HTTP, дублирующиеся зачем-то многократно в либах SDK:
PROVIDE ( base64_decode = 0x40009648 );
PROVIDE ( base64_encode = 0x400094fc );
Не выходит у меня разобрать в БИОСЕ :( Неясны параметры вызова... Приходится использовать ещё дубли, а Flash не резиновая.
У Lua - нщиков уже давно проблемы - переносят раздувшиеся блоки кода поправками в ld... :D
Да и распределение RAM сделано криво. Его там, на чипе, можно выудить и скомпоновать получше. Но, Espressif не хочет сделать востребованным его продукт. Наверно есть перекупщик их, и он и задает/создает им падение стоимости путем кривых выпусков кода и нерабочих версий... :)
Время идет и кто другой уже скоро может выпустить нормальную версию чипа и SDK к нему. Тогда Espressif отойдет на задний план со своим ES8266EX :) Рекламу данной ниши для чипов Espressif уже оплатила - скоро будет гулять лесом и с убытками...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Вроде все основные ошибки и как их обходить в SDK от Espressif на сегодня изучены. Можно приступать к написанию программ и портированию разных надстроек...
С Новым годом!
 
Сверху Снизу