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

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

Dodo

New member
Не как не могу отыскать способ считывания с флеша данные для перехода с AP в STA режим в Arduino IDE. Решения есть, переделать в Arduino IDE не получается, а проект перенести не представляется возможным. Заранее спасибо!
 

porex

New member
Как это не отрабатывает? Файл то не откроется.
А web.cgi и fsupload разгребаются в другом месте.
Так по идее если файл отсутствует, то должен выдать ошибку 404, а выдает ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ, т.е. считывает пустую область флешки.
 

pvvx

Активный участник сообщества
Так по идее если файл отсутствует, то должен выдать ошибку 404, а выдает ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ, т.е. считывает пустую область флешки.
По идее и в реалии, при отсутствии записи диска выдает http://aesp8266/гдедиск?:
404: File not found
А на http://aesp8266/ :
ESP8266 Built-in Web server ©
На http://aesp8266/web.cgi?start=0x4020a000&hexdmp=16 :
4020a000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff яяяяяяяяяяяяяяяя
Эти "яяяяя" вас не устраивают?
Поменяйте адрес вывода в heх :) http://aesp8266/web.cgi?hexdmp=16 :
00000000 = Bad address!
Если вы частично затерли диск (какой-то файл), но оставили его разметку то и получите "яяя". Web-у сказано выводить этот файл - он его и выводит.
Перед входом в ту процедуру открытые файлы закрываются, а флаг открытых файлов сбрасывается и для нового открытия требуется совпадение имени файла с номером ошибки и расширением "htm" : os_sprintf(CurHTTP->pFilename, "/%u.htm", CurResp->status) + указание в переменных инициализации диска, что файлы на диске есть, получаемые по разметке при подключении диска с проверкой всех ID (заголовка диска). Иначе никаких файлов не откроется и флага открытия не выставится. Исключения составляют "web.cgi" "fsupload" и "/", но "/" не совпадает никогда с "номер_ошибки.htm" :)
webserver_open_file() флаг true/false выдает только для сокращения кода, при анализе тут-же за ним открылся ли файл. Но в Web работает всё в основном по флагам, номерам ошибок и т.д. Слишком много комбинаций чтобы поставить один if (webserver_open_file()), т.к. этих файлов может быть открыто множество (там fifo на 4-ре файла, но этот путь идет только при первом разборе заголовка, и fifo файлов тут не заполнено и т.д) и следующему шагу всё равно какой файл открыт, когда и кем :).
Так что ищите ошибку в другом месте. У меня она не возникает, а все пути, флаги и т.д. когда писалось держал в голове :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Ver 0.3.3 на SDK 1.1.0. Добавлены ST RSSI ~wifi_st_rssi~, wifi_rfopt=x, wifi_vddpw=x, wifi_maxpw=x и другие дополнения в HTML...
Значения с ADC выдаются в 16 бит, путем суммы нескольких замеров с передискретизацией...
TCP clients не дописаны. Пока некогда до них...
Глюк с включением/выключением 'Use BSSID' коррекции в SDK1.1.0 не подлежит.
 
Последнее редактирование:

porex

New member
По идее и в реалии, при отсутствии записи диска выдает http://aesp8266/гдедиск?:
404: File not found
А на http://aesp8266/ :
ESP8266 Built-in Web server ©
На http://aesp8266/web.cgi?start=0x4020a000&hexdmp=16 :
4020a000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff яяяяяяяяяяяяяяяя
Эти "яяяяя" вас не устраивают?
Поменяйте адрес вывода в heх :) http://aesp8266/web.cgi?hexdmp=16 :
00000000 = Bad address!
Если вы частично затерли диск (какой-то файл), но оставили его разметку то и получите "яяя". Web-у сказано выводить этот файл - он его и выводит.
Проверил на ESP-01, все так как вы описывали. Прошиваю этот же код на желтую отладочную плату с ESP-12 (4МБайта флешка), выдает "яяяяяяяяяяяя", причем адрес webbin везде 0x0A000.
Фукцию WEBFS_base_addr изменил, теперь всегда возвращает 0x0A000.
 

pvvx

Активный участник сообщества
Проверил на ESP-01, все так как вы описывали. Прошиваю этот же код на желтую отладочную плату с ESP-12 (4МБайта флешка), выдает "яяяяяяяяяяяя", причем адрес webbin везде 0x0A000.
Фукцию WEBFS_base_addr изменил, теперь всегда возвращает 0x0A000.
Возможно дело связано с определением реального размера flash или ещё с чем... При прошивке Web на большие flash в их заголовке необходимо указывать, что flash 512к, а не больше. Это для организации "песочницы" в 512к для SDK в начале flash. Диск на больших flash должен располагаться за этими 512к. "4М flash с желтой платой" у меня нет - есть только перепаянные модули ESP-01 и ESP-12 с 16M flash и проверить программное определение размера flash на "желтых" не могу... Бывает, что китайцы ставят flash, которая маркирована неверно - из отбраковки, а её реальные размеры другие....
 

porex

New member
Функция [inline]spi_flash_real_size()[/inline] возвращает 4194304 Байт. т.е. 4 МБайта. У вас ESP-12 с 16 МБайтами, на нем проверяли?
 

pvvx

Активный участник сообщества
Счас проверю...
Из лога старта:
Real Flash size: 16777216 bytes
Disk init: 46 files, addr = 0x00080000

Там диск уже записан... Счас сотру...
Disk init: 0 files, addr = 0x00080000
Без записи диска там бардак. Счас найдем где он прячется :)
С открытием/закрытием файлов и выводом HTTP заголовка всё хорошо. Бяда сидит дальше, в выводе нестандартных файлов (которых нет на диске)...
Бяда сидела в маске адреса для чтения flash вообще не связанная c web :)
Исправьте в flash.h:
[HASHTAG]#define[/HASHTAG] MASK_ADDR_FLASH_ICACHE_DATA 0xfffff
Маленькая flash дублируется в адресном пространстве, а на большой уже мешает базовый адрес 0x40200000. ICACHE, где могут находиться коды процессора и данные с ICACHE_RODATA_ATTR всё равно не могут быть выше и больше 1 мегабайта от начала flash. Решением этой проблемы теперь занимается jcmvbkbc - т.е. не дождетесь :)

Файлы по ссылке в заголовке обновлены с исправлением MASK_ADDR_FLASH_ICACHE_DATA.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Уровень RSSI (модуль - роутер):
RSSI.gif
В dB но с обратным знаком :) Модуль был на шнурке питания - далеко не удалось оттянуть от роутера :)
Реакция изменения rssi достаточно быстрая - десятки ms.
 

pvvx

Активный участник сообщества
А прямые функции чтения флеш на этих адресах работают?
Что за прямые?
Если просто обращаться процом по адресу "кеширования" flash - то имеем несколько ограничений: размер в 1Мег от начала flash (адрес то в неё передается последовательно с базой в 0), обращение только по смешению в кратность 4, последовательное чтение ограничено примерно в килобайт (уже забыл точные цифры - при большем блоке будет протектед), перенос данных только в область IRAM или "heap", при этом команда переноса должна выполняться из ROM или IRAM. Даже в "стек" не всегда читает (вызывает протектед) - что-то намудрено там...
Если через процедуры чтения через SPI - то ничем не ограничены, кроме 16 Мег. Больше не лезет в адресный регистр SPI автоматически работающей с flash на аппаратном уровне (отсылка команд, ожидание, чтение статуса и прочее осуществляется спец. аппаратным блоком в SPI).
Малая flash (512к) ограничена в адресе в своем нутре и старшие биты не воспринимает. По тому она читается дублями по всему 16M пространству...
Чтобы совместить адрес "кеширования" с адресом передаваемым в flash необходимо вычесть 0x40200000 - адрес в адресном пространстве CPU. Кеш кончается на 0x40300000. Это окно где-то прописано и составляет всего 1M.
Любая кэш должна иметь таблицу и это ограничение может быть по причине недостатка RAM под таблицы дескрипторов загруженных в кэш блоков... Но тогда остается возможность сместить эту зону как-то относительно физического адреса flash. И это может не пройти, если система "кэша" прописана аппаратно-жестко в свзяке FLASH-SPI-RAM-шина-CPU с его виртуальными регистрами адресов... Копаться надо и искать варианты...
Но мегабайта кода вполне хватает для трансляции десятка прошивок к жестко собранной системе SDK библиотек (они будут иметь всего одну копию на все прошивки). Тем более есть 32к IRAM для оверлеев.
Короче путей для запихивания в один модуль всех имеющихся проектов уже много... :)
Espressif расширение flash за 1M решает другим путем - путем довешивания множества маленьких flash на разные "чип-селект" и переключения их. У них остался один свободный CS :) Т.е. 3 шт. flash = 3 банка с кодами по 1Мег каждый, остальное пространство flash = только данные. :) Этот метод приводит к высокому потреблению модулем - каждая нога flash + провод до неё = емкость и для её коммутации на 80MHz треба току... а в отчетах они пишут потребление только самого чипа ESP8266ex, да без внешних коммутаций в спектре WiFi - китайцы кароче... Врут на каждом шагу...
 
Последнее редактирование:

anakod

Moderator
Команда форума
pvvx, я понял. Да я именно имел в виду функции, т.е. процедуры чтения через SPI. Спасибо.
 

Mik

New member
Здравствуйте,
При компиляции "библиотеки вэбсервера" получаю ошибки, с которыми не могу разобраться :(
C:/Python27/python.exe c:/Espressif/utils/esptool.py elf2image -o ../bin/ -ff 80m -fm qio -fs 4m .output/eagle/image/eagle.app.v6.out
Traceback (most recent call last):
File "c:/Espressif/utils/esptool.py", line 22, in <module>
import serial
ImportError: No module named serial
mingw32-make[1]: *** [.output/eagle/bin/eagle.app.v6.bin] Error 1
../Makefile:119: recipe for target '.output/eagle/bin/eagle.app.v6.bin' failed
mingw32-make[1]: Leaving directory 'C:/Espressif/examples/Web_Base/app'
C:/Espressif/examples/Web_Base/Makefile:154: recipe for target '.subdirs' failed
mingw32-make.exe: *** [.subdirs] Error 2
Не могли бы помочь?
 

pvvx

Активный участник сообщества
Не могли бы помочь?
Нет установленного C:/Python27/python.exe. А UDK имеет ошибки в esptool.py при загрузке в модуль + ошибку с созданием сегмента загрузки, если даже его размер нулевой, по тому дополнительно надо копировать esptool.py в c:/Espressif/utils/esptool.py
Но можно создать прошивку и версией в UDK.
В основном makefile (в корневой папке проекта) поменяйте:
ESPTOOL ?= $(SDK_TOOLS)/esptool
[HASHTAG]#ESPTOOL[/HASHTAG] ?= C:/Python27/python.exe $(SDK_TOOLS)/esptool.py
Ещё хочу предупредить - текущая версия на SDK 1.1.1 в git, что-то халтурит, скоро исправлю... :) Какая-то несовместимость - пока ищу.
---
Всё - поправил. :)
 
Последнее редактирование:

Mik

New member
Нет установленного C:/Python27/python.exe.
Спасибо за помощь. Phyton поставил еще раньше - до того esptool вообще не запускался. Сейчас он не находит модуль serial (?). Используя UDKашную версию скомпилировалось. Спасибо за предупреждение - я взял версию 1.1.0 с yadi.sk.
 

porex

New member
Отдельно я их заводил. DHT22 даже работает сейчас с дипслипом от батареек. Но вот в комплекте с малым вебсервером не удается даже собрать. То одни ошибки то другие то третьи. Потому и написал, что знаний недостаточно.
Доработал драйвер DHT22 под сервер версии 0.3.2. По остальным версиям не могу сказать, pvvx любит перекапывать весь код)))
 

Вложения

pvvx

Активный участник сообщества
C SDK 1.1.1 и 1.1.2 какая-то беда со сканированием станций. Само сканирование работает, но после сканирования китай-SDK зачем-то рвет связь у ST и модуль долго не может подключиться обратно к AP. В логе видно, что SDK делает несколько попыток соединения, но у неё что-то нарушено в установках WiFi после сканирования:
Код:
Start Wifi Scan...
srv[80] 192.168.1.2:7414 [1] disconnect
srv[80] 192.168.1.2:7404 [1] listen
scandone

Wifi scan done:
1: Au:4, 'mns.ru-6446', -30, bc:ae:c5:eb:09:90, Ch:1
2: Au:3, 'pulkovoair', -90, c0:4a:00:33:4c:38, Ch:1
3: Au:3, 'DIRECT-fX-BRAVIA', -79, 9e:d2:1e:b2:02:95, Ch:2
4: Au:4, 'InterZet@22', -56, 26:ff:3f:09:d9:f7, Ch:2
5: Au:4, 'mns.ru-62052', -92, 84:c9:b2:6d:c7:5d, Ch:3
6: Au:2, 'Rostelecom', -90, ac:f1:df:f2:ce:0d, Ch:6
7: Au:3, 'TC DocNet', -88, 10:9a:dd:89:83:d3, Ch:11
8: Au:2, 'DSL-2640U', -88, 78:54:2e:8d:ab:7a, Ch:11
9: Au:3, 'HP-Print-bd-LaserJet 200', -91, 48:5a:b6:3e:ce:bd, Ch:11
Found 9 APs, saved in iram:0x4010536c
srv[80] 192.168.1.2:7404 [1] read: 257 of1[scan.xml] GET f[/scan.xml] head[200]:200 send: cf1 1036 dis
reconnect
rm 0
WiFi event 1
Disconnect from ssid mns.ru-6446, reason 200
f -240, scandone
WiFi event 1
Disconnect from ssid mns.ru-6446, reason 201
no mns.ru-6446 found, reconnect after 1s
reconnect
f 0, srv[80] 192.168.1.2:7404 [1] disconnect
scandone
beacon timeout
f -240, scandone
reconnect
f 0, station: 00:0f:54:10:6a:b5 join, AID = 1
WiFi event 4
Station: 00:0f:54:10:6a:b5join, AID = 1
scandone
add 0
aid 2
cnt

connected with mns.ru-6446, channel 1
WiFi event 0
Connect to ssid mns.ru-6446, channel 1
dhcp client start...
WiFi event 3
Station ip:192.168.1.50, mask:255.255.255.0, gw:0.0.0.0
ip:192.168.1.50,mask:255.255.255.0,gw:0.0.0.0
 

aloika

Active member
Обнаружил неприятный момент в сборке от pvvx.
1. Делаем веб-страничку, которая постоянно поллит запросами сервер, заходим на эту страничку.
2. Устанавливаем скорость uart 9600.
3. Подключаемся TCP-клиентом.

Льем в uart что-нибудь, через минуты 2-3 все отваливается - TCP-соединение рвется, иногда модуль вообще зависает и Wi-Fi отключается. Может раньше отвалиться, может позже.
Если web-запросами сервер не поллить, то все работает.

Пожалуйста, проверьте кто-нибудь - действительно есть такое явление? Поллющую страничку прилагаю.
 

Вложения

Сверху Снизу