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