• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Разработка ‘библиотеки’ малого webсервера на esp8266.

pvvx

Активный участник сообщества
TCP recved timeout =1 TCP close timeout=2 но проблема если связи нет менее 5 сек
Проверил подключение 2-х ESP через роутер. TCP recved timeout =3 TCP close timeout=10 у обоих. Оба соединены к AP роутера.
Передают и reset на 1 сек пересбрасываю приемный модуль.
Передающему модулю посылается в RX "1234567890\n" каждую секунду.
На приемном модуле в TX:
Код:
20:56:34.925> 1234567890
20:56:35.986> 1234567890
20:56:36.985> 1234567890
Нажал и отпустил "RESET"
20:56:38.795>
20:56:38.795>  ets Jan  8 2013,rst cause:2, boot mode:(3,6)
20:56:38.795>
20:56:38.795> load 0x40100000, len 104, room 16
20:56:38.795> tail 8
20:56:38.795> chksum 0x82
20:56:38.795> csum 0x82
20:56:48.092> 1234567890
20:56:49.155> 1234567890
20:56:50.152> 1234567890
Счас попробую напрямую модуль<->модуль, без посредника в виде роутера...
 

pvvx

Активный участник сообщества
Один модуль - передающий: имя "ESP8266B", IP 192.168.3.1, соединение TCP2UART 192.168.4.1, соединен с AP "ESP8266".
Второй принимающий: имя "ESP8266", IP 192.168.4.1, соединение TCP2UART не указано (=LocalHost)
Лог приема на принимающем:
Код:
21:05:50.648> 1234567890
21:05:51.646> 1234567890
21:05:52.645> 1234567890
21:05:53.643> 1234567890
21:05:54.704> 1234567890
21:05:55.702> 1234567890
21:05:56.702> 1234567890
Нажал и отпустил "RESET" на приемном
21:05:57.764>
21:05:57.764>  ets Jan  8 2013,rst cause:2, boot mode:(3,7)
21:05:57.764>
21:05:57.764> load 0x40100000, len 104, room 16
21:05:57.764> tail 8
21:05:57.764> chksum 0x82
21:05:57.764> csum 0x82
21:06:03.815> 1234567890
21:06:04.813> 1234567890
21:06:05.811> 1234567890
21:06:06.872> 1234567890
21:06:07.870> 1234567890
21:06:08.869> 1234567890
21:06:09.869> 1234567890
Нажал и отпустил "RESET" на передающем:
Код:
21:21:06.283> 1234567890
21:21:07.279> 1234567890
21:21:08.342> 1234567890
21:21:18.448> 1234567890
21:21:19.446> 1234567890
21:21:20.507> 1234567890
Вижу только паузу в передаче на 10 сек. (время синхронизации разных тайм-аутов - новое соединение стоит внутренний тайм-аут в 5 сек, т.к. пинг в инете бывает до 5 сек :) иначе поймаете баги китайской AT - у неё этот тайм-аут = 1 сек. При удаленном соединении она бросает открытое соединение не дождавшись ответа из-за тайм-аута сети.)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Добавлено:
ClRecTOut.gif

Сделал петлю. RX-TX/TX-RX двух модулей соединенных TCP2UART на 115200.
Одно соединение сделал через резисторы и загнал туда с внешней UART "1234567890\n".
Модули вечно передают в петле:
Код:
....
23:06:44.836> 1234567890
23:06:44.836> 1234567890
23:06:45.022> 1234567890
23:06:45.022> 1234567890
23:06:45.147> 1234567890
23:06:45.147> 1234567890
23:06:45.335> 1234567890
....
:)
Аналогично, на передающем модуле соединены RX-TX c возможностью туда ввести "Hello!" с внешней UART. У принимающего включен LoopBack enable.
23:20:54.900> Hello!
23:20:54.963> Hello!
23:20:55.098> Hello!
23:20:55.150> Hello!
23:20:55.212> Hello!
23:20:55.281> Hello!
23:20:55.400> Hello!
Наблюдаем задержку на заполнение передающего буфера в [HASHTAG]#define[/HASHTAG] MAX_WAIT_TX_BUF 50000ul // 50 ms + 12..13 ms.
 
Последнее редактирование:

PostLast

Member
В ваше
Один модуль - передающий: имя "ESP8266B", IP 192.168.3.1, соединение TCP2UART 192.168.4.1, соединен с AP "ESP8266".
Второй принимающий: имя "ESP8266", IP 192.168.4.1, соединение TCP2UART не указано (=LocalHost)
В вашем тесте вероятно не включено шифрование. Если AP точка OPEN все так как вы описали. Eсли WPA-PSK то при кратком сбросе модуля AP "ESP8266" связь пропадает. Иногда правда со второй попытки.
Ps проясните смысл TCP recved timeout: TCP close timeout: Client reconnect timeout: а то одна из них вроде лишняя.
 

pvvx

Активный участник сообщества
проясните смысл TCP recved timeout: TCP close timeout: Client reconnect timeout: а то одна из них вроде лишняя.
Время до первой передачи после открытия TCP, Время до закрытия после последней передачи, Время ожидания открытия соединения в случае клиента (время ответа на запрос соединения, зависит от времени пинга туда-обратно + сообразительности запрашиваемого).
И не смешите - какая может быть защита по WiFi :) :)
Зашита данных организуется до передачи в модуль и на приемной стороне. Всё остальное = бред.
При выходе и входе из зоны ключ не меняется... Андронутые устройства при смене ключа выданного на сессию, но не смене SSID точки доcтупа думают что это попытка атаки :)
Множественными переподключениями в WPA2 вы выдадите всем кому надо свой ключ... :)
 
Последнее редактирование:

Vitaly

Member
Вставил всё. Но у меня никогда не вызывается dhcp_handle_ack(), по тому пока не понимаю, как это должно работать в стандартной конфигурации.
Кто должен запросить и ответить, чтобы отработала ip4_addr_set_u32(&dhcp_sntp_server_address, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_NTP_SERVER + n))) ?
Тем не менее оно вызывается, адрес ntp сервера из ответа dhcp попадает в переменную и потом у него все запрашивается

у меня сейчас сомнения по sntp.c, я не уверен что правильно понял проверку наличия адреса в if (!ip_addr_isany(dhcpntp)) {
тут возможно ошибка и если адрес сервера нам dhcp не выдал будут проблемы

esp до вечера нет в пределах досягаемости, только потом проверю
 

pvvx

Активный участник сообщества
Тем не менее оно вызывается, адрес ntp сервера из ответа dhcp попадает в переменную и потом у него все запрашивается
Кем вызывается? Я туда ставил printf и т.д. (Wireshark, Jtag, ...) - ни кем не вызывается.
у меня сейчас сомнения по sntp.c, я не уверен что правильно понял проверку наличия адреса в if (!ip_addr_isany(dhcpntp)) {
тут возможно ошибка и если адрес сервера нам dhcp не выдал будут проблемы

esp до вечера нет в пределах досягаемости, только потом проверю
ip_addr_isany(dhcpntp): [inline]((dhcpntp) == ((void *)0) || (dhcpntp)->addr == ((u32_t)0x00000000UL))[/inline]
 

Vitaly

Member
у меня только wireshark, запрос на время идет локальному серверу, значит адрес из опции попал куда надо?

хочу найти время и проверить все варианты поведения с этими опциями, пока не смог
 

pvvx

Активный участник сообщества
у меня только wireshark, запрос на время идет локальному серверу, значит адрес из опции попал куда надо?
Неизвестно. DNS может перехватывать.
У роутера нет NTP, в локалке только Вынь7x64 и Вынь8x64. При соединении модуля и при подключении к нему dhcp_handle_ack() не вызывается. Требуется какая-то внешняя поддержка.
mDNS например тоже никчемная вещь, токо для Apple...
Протокол mDNS используют такие системы обнаружения сервисов как Bonjour (Apple) и Avahi (Linux)
По этому не вижу никакого смыслу пихать это всё в прошивку. Кроме отжирания памяти и увеличения потребления модулем это всё ничего не дает.
 
Последнее редактирование:

Vitaly

Member
ip_addr_isany(dhcpntp): ((dhcpntp) == ((void *)0) || (dhcpntp)->addr == ((u32_t)0x00000000UL))
я не был уверен что когда сервера не передано, я не сломал штатный запрос к pool.ntp.org
если проверка отрабатывает как должно, все должно быть хорошо

Неизвестно. DNS может перехватывать.
У роутера нет NTP, в локалке
когда роутер с ntp все работает, я не представляю что еще может повлиять на наблюдаемую картину
другой активности нет
esp_dhcp_ntp.jpg
1. esp запрашивает dhcp
2. dhcp предлагает
3. esp соглашается
4. dhcp подтверждает
5. esp спрашивает время у сервера предложенного dhcp
6. локальный ntp сервер отвечает

PS
даже больше - ставлю в dhcp опцию адрес другого ntp сервера - esp за временем идет туда
 
Последнее редактирование:

pvvx

Активный участник сообщества
так за ради чего все и затевалось
в сети без интернета время можно будет взять только на роутере
Но как это пользовать простым 'телепузикам'? Не все полезут в роутер и не у всех есть желание ставить в локалку сервер ради NTP :)
Выходит проще прописать перехват DNS в локалке или сделать выбор куда стучаться модулю SNTP в Web странице (по IP или по имени через DNS). Это более универсальное решение.
 
Последнее редактирование:

Vitaly

Member
Но как это пользовать простым 'телепузикам'? Не все полезут в роутер и не у всех есть желание ставить в локалку сервер ради NTP :)
Выходит проще прописать перехват DNS в локалке.
в некоторых он есть от рождения, просто никто об этом не знает

все таки это штатный не затратный по ресурсам способ, а не реверс с какого имени клиент вздумает взять время и как бы ему его подменить
 

pvvx

Активный участник сообщества
в некоторых он есть от рождения, просто никто об этом не знает

все таки это штатный не затратный по ресурсам способ, а не реверс с какого имени клиент вздумает взять время и как бы ему его подменить
Я про то, что счас вписано то и останется. Кому надо тот пусть меняет как ему надо.
К Web это уже не имеет никакого отношения. :)
Включается и выключается [HASHTAG]#define[/HASHTAG] LWIP_DHCP_NTP 1
-------
Лучше решить проблемму, когда делать согласование сессионного ключа шифровния WPA и т.д. у модуля, когда пропадает или меняется внешняя AP. Иначе выходит "мертвый модуль". Т.е. китайцы и тут нахалтурили.
+ ещё китай-фишки, из-за которых не сделать соединение модуля по списку AP с приоритетом...
 
Последнее редактирование:

Tomahawk

New member
Использую исходники, которые были последними перед появлением AutoMake.bat, потому что за это время раза 3 пытался обновиться до последних версий и каждый раз с приключениями. На текущей версии небольшие изменения оригинального кода приводят к тому, что вместо загрузки страниц веб-сервер пишет "ESP8266 Built-in Web server", страницы не видны даже по прямой ссылке. Хотя МК продолжает работу, я могу слать байты в Uart по таймеру, например. Что-то перестало справляться, раньше я вставлял на страничку спокойно 20 переменных через web_int_callbacks + код html и всё прекрасно отображалось, сейчас же при добавлении больше 8 переменных уже вываливается в "ESP8266 Built-in Web server", а для страниц по прямой ссылке рисуется ошибка 404. Такой же результат получаю, когда добавляю прежний ТСР-клиент. В "оригинале" проект работает, но уже изменения в нём делать не получается.

Сейчас снова просто взял старый дистрибутив и заработало всё мгновенно.
 

pvvx

Активный участник сообщества
сейчас же при добавлении больше 8 переменных уже вываливается в "ESP8266 Built-in Web server"
Смещается адрес начала диска (файловой системы). С какой-то версии адрес начала диска переехал за сегмент кода и стал не фиксированным, но это дало его увеличение для flash в 512 кб. Размер диска для flash в 512 кб стал 256 кб. Больше кода -> меньше диск. При заливке диска с HTTP (через Web) или программой PVFS2.exe всё автоматически учитывается...
Так-же если делаете большие вставки в сегменты rodata и кодов, помещаемых в IRAM, необходимо править eagle.app.v6.ld и Makefile, смещая старт сегмента кодов помещаемых в область "кеширования Flash".
 
Последнее редактирование:

pvvx

Активный участник сообщества
Добавил в свалку запуск файла при старте: protect/init.ini
Для его работы с PVFS2.exe необходимо добавить в меню несжимаемых файлов: *.ini , а make_webfs.bat уже дополнены.
При старте модуля, после инициализации SDK вызывается protect/init.ini. В нем можно указать установки для WiFi или другие.
Команды аналогичны остальным, используемым в WEB, но не заключаются в '~'.
Длина строк в init.ini до 128 символов, концом команды считается CR/LF.
Команды с выводом в TCP поток работать не будут - соединения в данном случае нет, а буфер вывода пока никуда не выводится. Но команды установок параметров работать будут.
Для примера вложен такой protect/init.ini:
Код:
sys_ram0x60000f00=0x48
sys_ram0x60000f00=0x65
sys_ram0x60000f00=0x6c
sys_ram0x60000f00=0x6c
sys_ram0x60000f00=0x6f
sys_ram0x60000f00=0x21
sys_ram0x60000f00=0x0d
sys_ram0x60000f00=0x0a
Просто выводит в Debug UART "Hello!". Отладочный лог по умолчанию:
Код:
Run ini file: protect/init.ini
of1[protect/init.ini] cf0 Hello!
 

pvvx

Активный участник сообщества
Пример мигалки десятью светодиодами на ESP8266. :)

1) Прошиваете модуль прошивкой из https://github.com/pvvx/esp8266web/releases из файла fullflash_and_webfs_xxx.zip от версии не ниже 0.4.5. При прошивке выставляете опции размера Flash в 512 килобайт. Реальный размер Flash определяется автоматически при запуске уже прошитого модуля.
2) Подключаете первые девять светодиодов через резисторы порядка 150 Ом .. 1 кОм к GPIO0, GPIO1, GPIO2, GPIO3, GPIO4, GPIO5, GPIO12, GPIO13, GPIO14 выходам и питанию модуля (+3.3V). Десятый светодиод включаете через аналогичный резистор к GPIO15 и на GND. Внимание: на модулях ESP-01 не используйте GPIO15 как выход, т.к. там он соединен с GND проводником под чипом.
3) Переименовываете файл “WEBFiles\protect\10leds.ini” в “WEBFiles\protect\init.ini”.
4) Включаете модуль и соединяетесь с его AP. Пока не переименовали имя AP и пароль, то для доступа используются “ESP8266” и пароль “0123456789”.
5) Запускаете “make_webfs.bat”, который обновит файл диска “webbin\WEBFiles.bin”.
6) В эксплорере загрузка нового файла диска “webbin\WEBFiles.bin” производится через http://192.168.4.1/fsupload используя имя AP и её пароль (по умолчанию это “ESP8266” и пароль “0123456789”). После загрузки диска можно использовать web меню модуля “WebFS Upload”.
7) Перезапускаете модуль.
8) Настраиваете желаемое подключение модуля к вашей AP или используете другие настройки WiFi в меню “WiFi settings” или через “WiFi scan”.
Далее обращаетесь к модулю в браузере или пишите свой HTML и передаете команды переключения выходов:
gpioN_out=X, где N – это номер GPIO, X = 0 вывод “0”, X = 1 вывод “1”, X = 3 переключить пин.
Пример мигания синим светодиодом на модуле: http://192.168.4.1/web.cgi?gpio_1_out=3
gpoi_set=B, где B – это число, в котором номера бит равные 1 выставят “1” на порту GPIO по номеру этих бит. Число задается в DEC или HEX формате (0x…).
Пример включения сразу GPIO1 и GPIO2: http://192.168.4.1/web.cgi?gpio_set=6
gpoi_clr=B, где B – это число, в котором номера бит равные 1 выставят “0” на порту GPIO по номеру этих бит. Число задается в DEC или HEX формате (0x…).
gpoi_out=B, где B – это число, в котором номера бит равные 1 выставят “1” на порту GPIO по номеру этих бит, а бит равные 0 выставят “0”. Число задается в DEC или HEX формате (0x…).
Получение текущего состояние всех выходов модуля производится через HTTP запрос файла \protect\gpio.xml или \leds.xml. Там указаны битовые состояния портов GPIO модуля и хорошо разбираются на javascript.

Можно наблюдать и переключать состояния GPIO выбрав Web в меню “GPIO” и тыкая на клетки в таблице. В данной таблице переключаются все комбинации GPIO, кроме назначения функций и считываемых входных значений с входов. Если вывод задействован чипом на периферию, то переключение вывода отключено. Для доступа к 10 входам/выходам отключите функции UART или используйте 10leds.ini.
:)
 
Последнее редактирование:

Tomahawk

New member
pvvx, возможно как-то откатить самому, чтобы вернулась поддержка ESP-01? У меня пока только эта модель(везде в магазинах только такие), а с алиэкспресса посылка может идти 50 дней, сами знаете )

Увидел, что закомментирована функция os_strcat, она приводит к проблемам? У меня она пока работает...
 
Последнее редактирование:
Сверху Снизу