• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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, она приводит к проблемам? У меня она пока работает...
 
Последнее редактирование:
Сверху Снизу