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

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

-VenoM-

New member
Запрос будет будет аналогичен 'http://ip_или_имя_модуля/callback' ?
Выходит, что это запрос файла c именем 'callback'.
Если такой файл есть на диске модуля, то он его передаст. Если в нем указаны какие переменные, то они назначаться и передадутся.
Похоже вы не по тому пути идете...
Простейший AJAX предполагает другую систему.
AJAX для новичков
'Обмениваться данными с сервером можно двумя способами. Первый способ — это GET-запрос. В этом запросе вы обращаетесь к документу на сервере, передавая ему аргументы через сам URL. При этом на стороне клиента будет логично использовать функция Javascript`а escape для того, чтобы некоторые данные не прервали запрос.
Не рекомендуется делать GET-запросы к серверу с большими объемами данных. Для этого существует POST-запрос.
'
'Ответ от сервера может быть не только XML, как следует из названия технологии.'

Типичная передача переменных start и stop:
newAJAXCommand('mdb.xml?start=0&stop=100', updateStatus, true);
= http://ip_или_имя_модуля[/текущий_каталог]/mdb.xml?mdb.xml?start=0&stop=100
Модуль назначит переменные start=0 и stop=100, откроет файл mdb.xml, увидит что у него атрибут = "парсить", начнет передавать с поиском команд/переменных, обрамленных '~'. В данном mdb.xml он найдет ~xml_mdb~ и выполнит вставку, описанную в esp8266web/web_int_callbacks.c at master · pvvx/esp8266web · GitHub
и далее esp8266web/web_int_callbacks.c at master · pvvx/esp8266web · GitHub
Т.е. вставит значения ячеек с 0 по 100.
Клиент примет mdb.xml со значениями ячеек... Далее разбираете на java...
Это только один вариант передачи... На обучение работы с javaскрипт времени нет. Уж как нибудь сами или создайте тему...
Ок, вопросами по js не буду засорять тему, потихоньку разбираюсь.

Не могу понять как выполняется вставка строк в xml.
Вот, например, записал единственный файл, посылаю запрос на него запрос http://192.168.4.1/mdb.xml , получаю ответ

<response>
<m0>0</m0>
<m1>0</m1>
<m2>0</m2>
<m3>0</m3>
<m4>0</m4>
<m5>0</m5>
<m6>0</m6>
<m7>0</m7>
<m8>0</m8>
<m9>0</m9>
</response>

Объясните, пожалуйста, каким образом выполнилась эта вставка.
 

pvvx

Активный участник сообщества
Не могу понять как выполняется вставка строк в xml.

http://192.168.4.1/mdb.xml , получаю ответ

<response>
<m0>0</m0>
<m1>0</m1>
...
Файл mdb.xml esp8266web/mdb.xml at master · pvvx/esp8266web · GitHub
Переменные для функции ~[inline]xml_mdb[/inline]~ [inline]start[/inline] и [inline]stop[/inline] были взяты по умолчанию.
Трасса:
esp8266web/web_int_callbacks.c at master · pvvx/esp8266web · GitHub
esp8266web/web_int_callbacks.c at master · pvvx/esp8266web · GitHub

esp8266web/web_int_callbacks.c at master · pvvx/esp8266web · GitHub
esp8266web/web_int_callbacks.c at master · pvvx/esp8266web · GitHub
esp8266web/web_int_callbacks.c at master · pvvx/esp8266web · GitHub

Если зададите [inline]start[/inline] и [inline]stop[/inline], то будет вставлено что требуется.
Пример [inline]http://192.168.4.1/mdb.xml?start=10&stop=20[/inline] -> esp8266web/mdb.htm at master · pvvx/esp8266web · GitHub

Ещё раз:
Все переменные обрабатываются двумя процедурами:
1) web_int_callback() - esp8266web/web_int_callbacks.c at master · pvvx/esp8266web · GitHub
2) web_int_vars() - esp8266web/web_int_vars.c at master · pvvx/esp8266web · GitHub
В web_int_vars() отрабатываются назначения переменных. После имени переменной/функции стоит "=" и далее значение. Они не имеют вывода в поток TCP. Воспринимаются и обрабатываются из URL строки, куков, данных POST, мультидаты, текста HTM, Websocket, protect/init.ini, файлов HTTP сервера,...
В web_int_callback() отрабатываются переменные с выводом в поток. Воспринимаются и обрабатываются из текста HTM, Websocket, protect/init.ini и файлов HTTP сервера. Там где есть вывод в поток TCP. При инициализации для файла protect/init.ini осуществляется симуляция вывода в TCP, но выводится в буфер и отладочную console...
В данные обработчики не вставлена проверка на авторизацию по паролю и другие ограничения. Если затребуется, то сами вставите разграничение переменных с доступом при успешной авторизации и т.д....

Загрузка файлов на server не вынесена из общего хлама web -> esp8266web/web_srv.c at master · pvvx/esp8266web · GitHub
- лениво это дело и всё запутано :), а то можно и в них подключить 'парсер' на переменные/функции...
 
Последнее редактирование:

PycLan

New member
@pvvx Добрый день.
В SYS_VERSION "0.6.3", не собирается проект например с параметром [HASHTAG]#define[/HASHTAG] PROGECT_NUMBER 2
Ругается на: undefined reference to `mdb_buf'
Добавляю [HASHTAG]#define[/HASHTAG] USE_MODBUS 502, все собирается.

P.S. в SYS_VERSION "0.6.1" - Latest release, тоже самое
 
Последнее редактирование:

aloika

Active member
Тут было сообщение про странную работу веб-сервера с айфоном. Не подтвердилось, всё нормально работает.

P.S.: Вот никому верить на слово нельзя. Надо брать самому и проверять.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Тут было сообщение про странную работу веб-сервера с айфоном. Не подтвердилось, всё нормально работает.

P.S.: Вот никому верить на слово нельзя. Надо брать самому и проверять.
Ну может там какой Айфон странный (сотни защит и прочего) и ему надо все заголовки к HTTP. А web не смотрит даже указание строки сервера... Лишнее это. :)
В основном борются с разрывами и пингами на своих Айфонах: http://esp8266.ru/forum/threads/pro...ka-s-nastrojkoj-po-web.146/page-29#post-22392
 

-VenoM-

New member
не работает вывод.
Шьётся нормально, ставлю отладку самую высокую:

[HASHTAG]#define[/HASHTAG] DEBUGSOO 3 // 0 - откл вывода, 1 - минимум, 2 - норма, >3 - текушая отладка, >4 - удалить что найдется :)

[HASHTAG]#define[/HASHTAG] DEBUG_UART 0 // включить вывод в загрузчике сообщений, номер UART
[HASHTAG]#define[/HASHTAG] DEBUG_UART0_BAUD 9600

Светодиод моргает, а в порт ничего не сыпется. Номер UART ставил 1 и 0 - ничего.
 
Последнее редактирование:

Serjkruch

New member
Здравствуйте,
Подскажите пожалуйста как управлять ножкой GPIO16?
Что только не делал с функциями из файла gpio16.c,gpio16.h

Всегда на выводе +3,3в.

Предполагаю что помимо вызова gpio16_output_conf(), нужно что то еще выключить.

Спасибо.
 

Serjkruch

New member
gpio16 не задействуется, т.к. обычно соединена с RESET для deep_sleep.
Использую ваш труд pvvx.
Но у меня на модуле есть вывод gpio16. И уже плата готова для модуля ESP-07.
Сможете подсказать что мне необходимо отключить для ручного управления этой ножкой?

Спасибо.
 

aloika

Active member
Уважаемый pvvx, подскажите пожалуйста.

Выяснилось, что при выборе цели FlashAll содержимое веб-диска не стирается, или как минимум стирается не полностью.
Новая прошивка начинает читать старый init.ini, запускает из него старый оверлей и закономерно падает, т.к. оверлей-то от старой прошивки.

Приходится заливать сначала вообще старую версию сборки, которая еще без оверлеев была. Потом заливать новый веб-диск и только потом заливать новую прошивку. Это, конечно, жутко неудобно.

Что можно сделать в этом случае?

UPD: можно, конечно, отключать в прошивке процессинг init.ini, заливать прошивку, потом включать процессинг init.ini, перекомпилировать, заливать новый веб-диск с новым оверлеем, потом заливать прошивку. Тоже неудобно.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Выяснилось, что при выборе цели FlashAll содержимое веб-диска не стирается, или как минимум стирается не полностью.
Новая прошивка начинает читать старый init.ini, запускает из него старый оверлей и закономерно падает, т.к. оверлей-то от старой прошивки.

Приходится заливать сначала вообще старую версию сборки, которая еще без оверлеев была. Потом заливать новый веб-диск и только потом заливать новую прошивку. Это, конечно, жутко неудобно.

Что можно сделать в этом случае?
Измените makefile при цели FlashAll - впишите копирование новых ovl после трансляции в вашу директорию web-диска и удаление $(USERFBIN) (./webbin/WEBFiles.bin). Он создаст новый WEBFiles.bin из './WEBFiles'.
Проблема в том, что нет четкого назначения директории пользовательского web-диска... В makefile используется './WEBFiles', а я не определился как и что делать с директориями, т.к. проектов несколько с разными web-дисками и не везде нужны все ovl.
Что-то примерно такое:
Код:
FlashAll: $(OUTBIN1) NewUserBin $(OUTBIN2) $(DEFAULTBIN) $(BLANKBIN) $(CLREEPBIN)
    $(ESPTOOL) $(ESPOPTION) write_flash $(flashimageoptions) $(ADDR_FW1) $(OUTBIN1) $(ADDR_FW2) $(OUTBIN2) $(USERFADDR) $(USERFBIN) $(CLREEPADDR) $(CLREEPBIN) $(DEFAULTADDR) $(DEFAULTBIN) $(BLANKADDR) $(BLANKBIN)

NewUserBin:
    @$(RM) -f $(USERFBIN)
    @cp ovl/bin *.ovl ./WEBFiles
    ./WEBFS22.exe -h "*.htm, *.html, *.cgi, *.xml, *.bin, *.txt, *.wav" -z "*.inc, snmp.bib, *.ovl, *.ini" ./WEBFiles ./webbin WEBFiles.bin
 
Последнее редактирование:

aloika

Active member
Измените makefile при цели FlashAll - впишите копирование новых ovl после трансляции в вашу директорию web-диска и удаление $(USERFBIN) (./webbin/WEBFiles.bin). Он создаст новый WEBFiles.bin из './WEBFiles'.
Проблема в том, что нет четкого назначения директории пользовательского web-диска... В makefile используется './WEBFiles', а я не определился как и что делать с директориями, т.к. проектов несколько с разными web-дисками и не везде нужны все ovl.
Проблема-то не в этом. Новый оверлей я могу и руками скопировать в './WEBFiles' и потом создать WEBFiles.bin и залить его по wi-fi.

Проблема в том, что вот есть модуль со старой прошивкой и старым веб-диском с оверлеем. Все работает.
Я заливаю в него новую прошивку. А веб-диск внутри модуля остается старый. Он не стирается почему-то. И модуль закономерно не стартует, т.к. падает, дойдя до загрузки оверлея. Соответственно, через wi-fi новый диск я залить не могу. Ключ от коробки оказывается внутри коробки и приходится как-то выкручиваться.
 

pvvx

Активный участник сообщества
Проблема-то не в этом. Новый оверлей я могу и руками скопировать в './WEBFiles' и потом создать WEBFiles.bin и залить его по wi-fi.

Проблема в том, что вот есть модуль со старой прошивкой и старым веб-диском с оверлеем. Все работает.
Я заливаю в него новую прошивку. А веб-диск внутри модуля остается старый. Он не стирается почему-то. И модуль закономерно не стартует, т.к. падает, дойдя до загрузки оверлея. Соответственно, через wi-fi новый диск я залить не могу. Ключ от коробки оказывается внутри коробки и приходится как-то выкручиваться.
Если там Flash более 512к, то измените строку:
[HASHTAG]#USERFADDR[/HASHTAG] = $(shell printf '0x%X\n' $$(( ($$(stat --printf="%s" $(OUTBIN2)) + 0xFFF + $(ADDR_FW2)) & (0xFFFFF000) )) )
USERFADDR = 0x80000
 

Serjkruch

New member
Подскажите пожалуйста решение такой проблемы:
esp8266 подключена к домашнему маршрутизатору. При включении IP присваивается и все прекрасно работает.
По прошествии суток я не могу зайти на вэб страницу esp8266. При этом пинга тоже нет.
Я отключаю компьютер от домашнего роутера и подключаюсь к esp8266 на softAP и вижу что все работает и IP от домашнего роутера присвоен но через роутер я его не вижу даже пингом. Помогает прямое переподключение по питанию или отсылки команды System Restart.
Спасибо.
 

pvvx

Активный участник сообщества
Подскажите пожалуйста решение такой проблемы:
esp8266 подключена к домашнему маршрутизатору. При включении IP присваивается и все прекрасно работает.
По прошествии суток я не могу зайти на вэб страницу esp8266. При этом пинга тоже нет.
Я отключаю компьютер от домашнего роутера и подключаюсь к esp8266 на softAP и вижу что все работает и IP от домашнего роутера присвоен но через роутер я его не вижу даже пингом. Помогает прямое переподключение по питанию или отсылки команды System Restart.
Спасибо.
У меня такого не проявлялось. Т.к. задействовано внешнее оборудование сказать ничего не могу...
 

vad7

Active member
@Serjkruch, да, бывает такой глюк. Зависит от роутера и wifi окружения.
RSSI в этот момент -31.
Я фиксил это допиской в wifi_events.c.
Можно у меня в гитхабе глянуть.
 

Victor

Administrator
Команда форума
Можно у меня в гитхабе глянуть.
А расскажите, пожалуйста, подробнее. Я у вас нашел esp8266web/wifi_events.c at master · vad7/esp8266web · GitHub и здесь esp8266web/iot_cloud.c at master · vad7/esp8266web · GitHub
Я у себя такого ни разу не замечал, но вот периодически поступают сообщения о таких "зависаниях" на разных, но вполне стабильных прошивках.
Было бы неплохо иметь возможность такую ошибку повторить, найти причину и выложить универсальное решение :)
 

pvvx

Активный участник сообщества
А расскажите, пожалуйста, подробнее. Я у вас нашел esp8266web/wifi_events.c at master · vad7/esp8266web · GitHub и здесь esp8266web/iot_cloud.c at master · vad7/esp8266web · GitHub
Я у себя такого ни разу не замечал, но вот периодически поступают сообщения о таких "зависаниях" на разных, но вполне стабильных прошивках.
Было бы неплохо иметь возможность такую ошибку повторить, найти причину и выложить универсальное решение :)
Может это это:
PS (дополнительно): а вопрос с отключением или реконектом WiFi (или обрывом связи с одним из пользователей в режиме AP) и закрытием соединений LwIP решен? ;)
Иначе там беда - при переподключении данный порт не открыть, т.к. он может засесть в TIME_WAIT или остаться открытым при быстром реконекте, а сообщение обрыва связи было...
При новом соединении после обрыва или реконнекта глюк проявляется с сообщением "tcpsrv: not new tcp!".
В "новой версии", т.е. в обновлении на git, вроде частично решено. Дополнение старое, но выложил только вчера, т.к. давно перевел на RTL00 и там это выловил, а на ESP код немного отличается...
@Serjkruch, да, бывает такой глюк. Зависит от роутера и wifi окружения.
RSSI в этот момент -31.
Я фиксил это допиской в wifi_events.c.
Можно у меня в гитхабе глянуть.
Это не с этим ли связано?

В обновлении сейчас стоит закрытие всех TIME_WAIT при отключении или потере связи WiFi. Это не совсем корректно, т.к. необходимо убивать pcb выборочно, в соответствии с закрываемым и вновь открываемым IP...
Вариантов решений данной задачи много, к примеру, можно при создании TCP порта проверять есть ли уже такой в LwIP в списке активных и неактивных соединений и почему ещё активен, или ещё как по другому...
PS: Вообще это задача SDK с управлением netif-оф на соединения... и однозначно, в короткое дополнение не решается.
 
Последнее редактирование:

Victor

Administrator
Команда форума
Сверху Снизу