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

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

pvvx

Активный участник сообщества
Да, я установил всё как написано в первом посте http://esp8266.ru/forum/threads/moja-sborka-espressif-devkit.32/
вчера днём игрался с Вашей дневной версией. Никаких проблем не было. Скачал последнюю и появились эти ошибки при сборке:
Никаких изменений в проект не вносил. Что делать?
Поставить Python27
Последние отличия в makefile всего такие:
Было:
ESPTOOL ?= $(SDK_TOOLS)/esptool
#ESPTOOL ?= C:/Python27/python.exe $(SDK_TOOLS)/esptool.py
Стало:
#ESPTOOL ?= $(SDK_TOOLS)/esptool
ESPTOOL ?= C:/Python27/python.exe $(SDK_TOOLS)/esptool.py
:)
 

mcmega

Member
Поставил python-2.7.9, всё равно ошибка на строке 147. и пути верные.
Вернул как было, ошибок пропали... что то с питоном значит или нужна другая версия?
 
Последнее редактирование:

pvvx

Активный участник сообщества
Кратко про команды wifi.rdcfg=<битовая маска>, wifi.newcfg=<битовая маска>, wifi.read=<битовая маска>, wifi.save=<битовая маска>:
Все команды установки типа wifi.st.ssid=значение работают не на прямую с WiFi, а с внутренним блоком управления конфигурацией WiFi.
После них необходимо применение wifi.newcfg=<битовая маска>. Это связано с тем, что параметры очень хитро завязаны друг с другом, некоторые параметры нельзя установить не передав другие, и существует определенная последовательность установки, чтобы оборудование WiFi их приняло.
Команды считывания значений работают напрямую с оборудованием WiFi и показывают текущее установленное значение.
По этому, перед изменением любого параметра необходимо считать текущую аппаратную конфигурацию в блок управления конфигурацией командой wifi.rdcfg=<битовая маска>. Потом передать изменение, а затем уже применить wifi.newcfg=<битовая маска>.

Биты маски (value / параметр):
0x00000001 wifi.mode
0x00000002 wifi.phy
0x00000004 wifi.chl
0x00000008 wifi.sleep
0x00000010 wifi.ap.ip, wifi.ap.gw, wifi.ap.msk
0x00000020 wifi.ap.ssid, wifi.ap.psw, wifi.ap.chl, wifi.ap.aum, wifi.ap.hssid, wifi.ap.mcns, wifi.ap.bint
0x00000040 wifi.ap.dncp
0x00000080 wifi.ap.sip, wifi.ap.eip
0x00000100 wifi.ap.mac
0x00000200 wifi.st.ip, wifi.st.gw, wifi.st.msk
0x00000400 wifi.st.sbss, wifi.st.bssid, wifi.st.psw, wifi.st.ssid
0x00000800 wifi.st.dncp
0x00001000 wifi.st.aucn
0x00002000 wifi.st.mac

У wifi.rdcfg=<битовая маска> задает, что будет считано из аппаратуры WiFi перед приемом изменений в во внутренний блок управления конфигурацией WiFi. Не отмеченные биты маски указывают, какие значения будут подставлены по умолчанию перед приемом изменений.

У wifi.newcfg=<битовая маска> задает, что будет передано (что будет устанавливаться) из внутреннего блока управления конфигурацией в оборудование WiFi.

У wifi.save=<битовая маска> задает, что будет считано из аппаратуры WiFi перед записью установок во flash, а не отмеченные биты маски указывают, какие значения будут подставлены по умолчанию.

У wifi.read=<битовая маска> задает, что будет передано (что будет устанавливаться) из считанного блока управления конфигурацией из flash в оборудование WiFi. Можно просто считать все прошлые запомненные значения из flash перед последующим изменением отдельных и дальнейшей установкой по выбору.

Какие ошибки возникли после перечисленных операций можно прочитать в переменной ~stop~. В ней, биты выставленные в "1", по той-же маске, описывают, что SDK ответило "ошибкой" при применении этого блока параметров. Но переменная ~stop~ используется и в других командах. По тому надо считывать непосредственно после применения указанных команд, в этом-же TCP соединении.

Пример для изменения имени ST: wifi.rdcfg=0x0400&wifi.st.ssid=NEWAP&wifi.newcfg=0x0400
При этом параметры автоконнекта и другие могут быть восприняты значениями по умолчанию. Для изменения только имени ST лучше дать wifi.rdcfg=0xfffff&wifi.st.ssid=NEWAP&wifi.newcfg=0x0400

Такой подход дает массу разных возможностей и решает проблемы невозможности изменить один параметр WiFi в SDK и автоматически решает последовательность установок с отключениями и включениями WiFi перед их применениями. Там не всё гладко и запутано - но без этого всё усложняется ещё больше, если на Web странице требуется изменить всего пару параметров.
 
Последнее редактирование:

pvvx

Активный участник сообщества
В процессе дизассемблирования но уже всего сразу (BIOS, SDK и т.д. база IDA больше 2Гегов) найдена ещё фича, почему модуль может зависать по WDT и прочему:
default_exception_handler записывает состояние для перезагрузки в память RTC system_rtc_mem_write(), выводит сообщение через ets_printf "Fatal exception (%d):\n" "epc1=0x%08x, epc2=0x%08x, epc3=0x%08x, ...", затем, в бесконечном цикле, ожидает когда fifo tx UART0 и UART1 станет пустым и только после этого вызывает system_restart(). На каждой вызванной процедуре, после краха системы, default_exception_handler может намертво зависнуть, что и наблюдается. Очередной привет от Espressif.
 
Последнее редактирование:

pvvx

Активный участник сообщества
И как это обходить ?
Не работать самостоятельно с uart ?
Да не только UART - если слетит стек, то будет ещё прикольнее. А если у системы случилось просто стороннее зависшее немаскируемое прерывание во время отработки данного прикола от Espressif? :) Там очень много этих "а если", по причине вызова от туда процедур работающих по указателям в "сбитой" памяти, да ещё обращающихся к распределению памяти :)... А одно из этих "если" и вызывает данные процедуры в надежде перезагрузить сиcтему и зарегистрировать это "если" :)
А работать просто - выдернуть все процедуры работы с WDT из SDK, путем разборки и сборки библиотек на объектники и замены на свои функции с WDT. Благо исходники по WDT из SDK все уже "реверсированы". Куски уже описывались. Если не терпиться и надо всё счас и сразу - то помочь никто не сможет. Собирать малыми кусками новый SDK пока не собираюсь - надо "довырезать" максимум Espressif-кого кода из SDK, до самого предела, и оставить только самый-самый минимум, безусловно оставив open-source либы, которых там немерянно. А это дело не быстрое и тяп-ляп не делается. Наступление идет сразу по всем фронтам :) - иначе не победить.
 
Последнее редактирование:

svh

New member
pvvx, Спасибо за прошивку.
Я использовал ESP-01 для подключения через TCP2UART датчика СО2. Он каждую секунду выдает две строки с результатами измерений в уарт порт. С вашей прошивкой все работает отлично - данные отображаются в терминале.
Но столкнулся с проблемой их считывания в OpenHab. Посоветуйте как можно сделать это по HTTP.
 

CHERTS

Moderator
Команда форума
pvvx подскажи где скачать последнюю версию твоей прошивки, а то я тут подключил одного питон-програмера, может он сваяет консольную утилитку для создания образа mpfs.
 

pvvx

Активный участник сообщества
pvvx подскажи где скачать последнюю версию твоей прошивки, а то я тут подключил одного питон-програмера, может он сваяет консольную утилитку для создания образа mpfs.
На первой странице, пока всегда по ссылке https://yadi.sk/d/xB_vsQ_bdqeMg
И PVFS2.exe изначально консольно работет и включена в маке:
$(USERFBIN):
./PVFS2.exe -h "*.htm, *.html, *.cgi, *.xml, *.bin, *.txt, *.wav" -z "*.inc, snmp.bib" ./WEBFiles ./webbin WEBFiles.bin
Даже help какой-то дает в окошко, если ткнуть PVFS2.exe /?
Но консоль от неё особо не требуется, т.к. она может сама грузить файлы в модуль с программой, без диска... и браузер тоже может грузить готовый WEBFiles.bin по http://192.168.4.1/fsupload .
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
А дополнить файл WEBFiles.bin до кратности размера 16 байтами 0xFF теперь нужно?
 

pvvx

Активный участник сообщества
Я использовал ESP-01 для подключения через TCP2UART датчика СО2. Он каждую секунду выдает две строки с результатами измерений в уарт порт. С вашей прошивкой все работает отлично - данные отображаются в терминале.
Но столкнулся с проблемой их считывания в OpenHab. Посоветуйте как можно сделать это по HTTP.
По HTTP, в связи с "западной" политикой безопасности для сетей, открыть сокет порта TCP на JAVA достаточно сложно. Это требует отдельного приложения. Реализаций отображения любых статических массивов по HTTP в данной свалке Web-сервера нет и не предвидится из-за того, что такое дело не многопользовательское, не универсальное и реализуется только под конкретную задачу-проект. А тут пока вся память по максимуму свободна.
Из за этого нет даже отложенного переключения установок WiFi и сканирования станций, хотя это очень просто реализуется и стыкуется, но требует статические (постоянные долговременные и достаточно большие) буфера в памяти, которой изначально мало...
 

pvvx

Активный участник сообщества
А дополнить файл WEBFiles.bin до кратности размера 16 байтами 0xFF теперь нужно?
Ничего не надо - оно всё само делает. Это исправленный клон MPFS2.1 (исходники вложены), но формат упрощен - нет ни бита лишнего.
Проблема у данной проги одна - не мультиплатформенна
 

pvvx

Активный участник сообщества
А есть где-то внятное описание формата MPFS, ну то есть PVFS уже?
В начале WEBFS1.c, в комментах :) Тоже подправленное описание от MPFS.
Но там мелкая неточность - начальный маркер = "FWEB". Исправил, в следующей версии будет комент правильнее :)
Код:
* PVFS Structure:
*
*     [F][W][E][B][uint8 Ver Hi][uint8 Ver Lo] // заголовок диска
*     [uint16 Number of Files] // кол-во файлов на диске
*
*     [Name Hash 0][Name Hash 1]...[Name Hash N] // uint16 типа хеш на каждое имя файла :)
*
*     [File Record 0][File Record 1]...[File Record N] // uint32 указатели на адреса структур файлов, относительно начала диска
*
*     Pointers are absolute addresses within the WEBFS image.
*
* File Record Structure:
*     [uint32 Len] размер файла с заголовком
*     [uint16 HeadLen] длина заголовка, включая размер, флаг, имя (адрес данных - адрес позиции len)
*     [uint16 Flags] бит 0 =1 - файл сжат GZIP, бит 1 = 1 - "парсится" - имеет динамические переменные
*     [File Name, 0] Имя файла с "СИ" терминатором
*     [File Data] данные файла
*
* Name hash (2 uint8s) is calculated as follows:
*     hash = 0
*     for each(uint8 in name)
*    hash += uint8
*    hash <<= 1
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
В начале WEBFS1.c, в комментах :) Тоже подправленное описание от MPFS.
Эмммм... а сжатия чтоль нет? Тогда смысл использовать эту FS, чем та что в esphttpd не нравится, под ней хоть программа создания бинарника на Си есть?
 

pvvx

Активный участник сообщества
Эмммм... а сжатия чтоль нет? Тогда смысл использовать эту FS, чем та что в esphttpd не нравится, под ней хоть программа создания бинарника на Си есть?
Сжатие делается до того и оно GZIP. Файлы, которые "парсятся" не сжимаются.
Используйте esphttpd - это ваш выбор :) там сжатие на 5% :) :) зато мороки и тормозов - полная копилка.
Объясните мне смысл того 5% "сжатия" на flash в 16Мег :)
Код:
.\WEBFiles :
    404.htm: 364 bytes
    adc.htm: 3051 bytes, 2 vars
    adc.wav: 10 bytes, 1 vars
    adc.xml: 45 bytes, 1 vars
    disk_er1.htm: 97 bytes, 1 vars
    disk_er2.htm: 81 bytes, 1 vars
    disk_er3.htm: 69 bytes, 1 vars
    disk_ok.htm: 84 bytes, 1 vars
    esp.gif: 6571 bytes
    favicon.ico: 810 bytes (gzipped by 64%)
    grfx1.inc: 1894 bytes
    grfx2.inc: 12904 bytes
    index.htm: 7290 bytes, 23 vars
    logo.gif: 393 bytes
    sample.htm: 897 bytes, 36 vars
    site.js: 1321 bytes (gzipped by 59%)
    status.xml: 46 bytes, 1 vars
    system.xml: 3563 bytes, 93 vars
    test.htm: 3081 bytes, 2 vars
    timeout.htm: 849 bytes, 2 vars
    timer.inc: 587 bytes
    tst.htm: 3054 bytes, 2 vars
    tst.xml: 50 bytes, 1 vars
    upload.htm: 688 bytes (gzipped by 35%)
    vdd.htm: 3054 bytes, 2 vars
    vdd.xml: 76 bytes, 1 vars
E:\ESP8266\workspace\Web_base\WEBFiles\protect :
    protect/chiprams.xml: 83 bytes, 2 vars
    protect/cookie.js: 853 bytes (gzipped by 61%)
    protect/dsleep.htm: 991 bytes (gzipped by 44%)
    protect/flash.bin: 11 bytes, 1 vars
    protect/hexdamp.htm: 1060 bytes (gzipped by 54%)
    protect/hexdamp.txt: 9 bytes, 1 vars
    protect/hexdmpd.htm: 1060 bytes (gzipped by 54%)
    protect/hexdmpd.txt: 9 bytes, 1 vars
    protect/ram.bin: 8 bytes, 1 vars
    protect/sys_reset.cgi: 11 bytes, 1 vars
    protect/sys_restart.cgi: 13 bytes, 1 vars
    protect/tstfuncs.htm: 3155 bytes, 2 vars
    protect/wifi.htm: 7900 bytes, 30 vars
GENERATED WEBFS IMAGE: 67168 bytes
У меня итого больше на текушей свалке - из 74254 выходит 67168, но в проекте одни скрипты... и никаких мер по сжатию не применялось. А их там много - есть ~inc:имяфайла~
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
жатие делается до того и оно GZIP. Файлы, которые "парсятся" не сжимаются.
Не понял, а что тогда сжимается то, какие данные? я что-то в упор не вижу GZIP сжатия, накидал простых текстовых файлов с разными данными для лучшего понимания структуры, в результате в WEBFiles.bin оно все в открытом виде, сжатия нет.
 

pvvx

Активный участник сообщества
Не понял, а что тогда сжимается то, какие данные? я что-то в упор не вижу GZIP сжатия, накидал простых текстовых файлов с разными данными для лучшего понимания структуры, в результате в WEBFiles.bin оно все в открытом виде, сжатия нет.
То, что содержит динамические переменные не сжимается. Всё остальное сжимается GZIP-пом и так и отдается в HTTP.
Проверьте в esphttpd - там общее сжатие 'итого' не достигает 5% :) Зато не читается :)
Вам данные диска хорнуть каким-либо числом, чтобы сказать что это сжатие? :)
 
Сверху Снизу