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

vad7

Active member
Подождите, если файл закачался нормально, то получаем сообщение из "/disk_ok.htm"
Лог:
Disk init: 69 files, addr = 0x0003d000 prh#f108,200,16 [HASHTAG]#f10a[/HASHTAG] (82) 302 dis
srv[80] 192.168.4.2:1561 [2] listen
memi[615] 0x00000000 rec 615 of 615 :
srv[80] 192.168.4.2:1561 [2] read: 615 http_ver=11 of1[disk_ok.htm] GET f[/disk_ok.htm] hcn:0x3fff01ff[0],wcn:93 tst_rx: 200, 0, 93 prh#2218,200,1 [HASHTAG]#2258[/HASHTAG] (201) 200 send: of2[timer.inc] cf2 of2[footer.inc] [sys_sysver]

А если, ошибка, то должен показаться "/disk_er1.htm"
А вот он то и не показывается! Файлы на диске есть, лежат в тех же местах, не пойму в чем дело.
 

pvvx

Активный участник сообщества
Подождите, если файл закачался нормально, то получаем сообщение из "/disk_ok.htm"
Лог:
Disk init: 69 files, addr = 0x0003d000 prh#f108,200,16 [HASHTAG]#f10a[/HASHTAG] (82) 302 dis
srv[80] 192.168.4.2:1561 [2] listen
memi[615] 0x00000000 rec 615 of 615 :
srv[80] 192.168.4.2:1561 [2] read: 615 http_ver=11 of1[disk_ok.htm] GET f[/disk_ok.htm] hcn:0x3fff01ff[0],wcn:93 tst_rx: 200, 0, 93 prh#2218,200,1 [HASHTAG]#2258[/HASHTAG] (201) 200 send: of2[timer.inc] cf2 of2[footer.inc] [sys_sysver]

А если, ошибка, то должен показаться "/disk_er1.htm"
А вот он то и не показывается! Файлы на диске есть, лежат в тех же местах, не пойму в чем дело.
Попробуйте internet explorer. И всё будет.
Я не могу отвечать за ошибки во всех эксплорерах. Дайте альтернативу, годную для всех, что им написать в ответе редиректа :)
 

vad7

Active member
Это браузера не зависит, проверил. Тут может быть в другом причина - передача файла уже начата, а мы тут редирект шлем, вот он и рвет соединение.
 

pvvx

Активный участник сообщества
Это браузера не зависит, проверил. Тут может быть в другом причина - передача файла уже начата, а мы тут редирект шлем, вот он и рвет соединение.
Это правильно, что ревет. Данных то может быть гегобайты, а ему ответили - иди в другое место. И писано это везде - во время приема сервер может послать куда угодно и когда угодно. :) Не ждать же слива всех данных, которых может быть бесконечность...
Вот ответ IE:
redir_ie.gif
Т.е. прямая зависимость от браузера.
 
Последнее редактирование:

vad7

Active member
Проверял на IE версии 8 (другой поставить не могу), FireFox 43, Chrome последний - на всех рвется соединение.
Видать они ждут что-то еще в таком случае, не силен в http.
Пока вижу, что нужно дописывать upload_boundary(), чтобы читал и пропускал входящий контент, а уж после редирект...
 

pvvx

Активный участник сообщества
Проверял на IE версии 8 (другой поставить не могу), FireFox 43, Chrome последний - на всех рвется соединение.
Видать они ждут что-то еще в таком случае, не силен в http.
Не знаю, что вы там проверяли, но вот и Mozilla Firefox:
redir_mf.gif
Беда только у Хрома
Пока вижу, что нужно дописывать upload_boundary(), чтобы читал и пропускал входящий контент, а уж после редирект...
Это противоречит http.
Скорее всего надо искать как и что вписать в ответ редиректа для Хрома. Может ему не нравиться 302. Меняют что хотят в google, чтобы потом не работало :) Вечная война друг с другом у них.
 
Последнее редактирование:

vad7

Active member
Обновил FireFox до последней 44.0.2 - та же ошибка, странно....
А есть еще и мобильные браузеры, которые вообще не обновишь.
 

vad7

Active member
Я все это пробовал с ноутбука с WinXP.
@Vitaly, антивирус отключен.
Попробовал с нового ноутбука с Win 10, IE 12, Chrome - работает!
Но как-то нестабильно - на маленькие файлы правильно ругается:
rv[80] 192.168.4.2:60016 [1] listen
srv[80] 192.168.4.2:60016 [1] read: 620 of254[/fsupload] content_len = 11213 of 0 'ESP8266:0123456789' POST f[/fsupload] ...
srv[80] 192.168.4.2:60016 [1] read: 1460 filename:'1.xlsx' head[83]:302 dis
srv[80] 192.168.4.2:60016 [1] error -8
srv[80] 192.168.4.2:60017 [2] listen
srv[80] 192.168.4.2:60017 [2] read: 494 of1[disk_er1.htm] GET f[/disk_er1.htm] head[201]:200 send: of2[timer.inc] cf2 of2[footer.inc] cf2 cf1 628 dis

А вот на средние и большие "подключение прервано":
srv[80] 192.168.4.2:60029 [1] listen
srv[80] 192.168.4.2:60029 [1] read: 620 of254[/fsupload] content_len = 90065 of 0 'ESP8266:0123456789' POST f[/fsupload] ...
srv[80] 192.168.4.2:60029 [1] read: 1460 filename:'2.xlsx' head[83]:302 dis
srv[80] 192.168.4.2:60029 [1] error -8
srv[80] 192.168.4.2:60029 [1] disconnect
cf254

Для проверки установил вашу последнюю прошивку с github.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Я все это пробовал с ноутбука с WinXP.
Попробовал с нового ноутбука с Win 10, IE 12 - работает!
Но как-то нестабильно - на маленькие файлы правильно ругается:
Ну надо найти и ликвидировать. Но проблема не в не ответе редирект. Он выдается, а что-то другое...
 

vad7

Active member
@pvvx, Подскажите есть функция вывода в UART, типа os_printf(), но чтобы выполнение программы дальше шло только после вывода всех символов?
 

vad7

Active member
Мне нужно как можно раньше установить обработчик прерываний GPIO.
Но вот тут обнаружил, что после функции uart_init() (в uart_tcp.c) обработчик прерываний больше не срабатывает.
Сам сходу не разобрался, подскажите, что в ней подправить?
 

pvvx

Активный участник сообщества
@pvvx, Подскажите есть функция вывода в UART, типа os_printf(), но чтобы выполнение программы дальше шло только после вывода всех символов?
После команды os_printf() ставите uart_wait_tx_fifo_empty() или user_uart_wait_tx_fifo_empty(uint32 uart_num, uint32 x), где x просто счетчик на ограничение времени ожидания вывода FIFO UART, если UART сидит на RTC-CTS. Можно сменить программу вывода putc() на стандартную .
Есть ets_uart_printf(), ets_external_printf(). Они все, как и ets_printf() и os_printf() (os_printf() в meSDK, у китайцев своя) могут иметь две процедуры вывода символа, например для лога и вывода в UART одновременно...
ets_external_printf() используется в потрохах WiFi у китайцев и к нему уже назнчены свои процедуры вывода работающие назначенные буфера... А жалко :(
См bios/ets.h
/* { putc1_routine = routine; } */
void ets_install_putc1(void *routine);
/* { putc2_routine = routine; } */
void ets_install_putc2(void *routine);
/* { ets_install_putc1(_putc1); } */
void ets_install_uart_printf(void); = ets_install_putc1(_putc1);
....
_putc1 назначена в ld. PROVIDE ( _putc1 = 0x40001dcc ); и в bios/uart.h. Выводит в UART0 c ожиданием вывода предыдущего символа, т.е. не использует FIFO. Она стоит по умолчанию в ets_printf(), после старта ROM-BIOS.
Никто не хочет писать Help к стандартным процедурам на ESP8266. Пишут Help только к известному внешнему ПО - к Ардуино например :)
 
Последнее редактирование:
  • Like
Реакции: vad7

vad7

Active member
@pvvx, спасибо.
Подскажите по функции uart_init()?
Чем в ней могут GPIO прерывания отключаться?
Не увидел в ней ничего такого...
Или ее может перенести куда-нить в начало startup() ?
 

pvvx

Активный участник сообщества
@pvvx, спасибо.
Подскажите по функции uart_init()?
Чем в ней могут GPIO прерывания отключаться?
Не увидел в ней ничего такого...
Или ее может перенести куда-нить в начало startup() ?
Есть git - там можно указать строку. А то искать долго.
И не понятно что вы хотите. uart_init() инициализирует UART-ы и вокруг этого дела ещё все связанные с ними "пины" согласно установленной конфигурации. Если UART1 отключена, то не инициализит её пины, если UART0 swap, rts-cts и т.д. то соответственно и ставит их функции.
Присвоение printf-у функции вывода там-же esp8266web/uart_tcp.c at master · pvvx/esp8266web · GitHub
Перенести нельзя - придется рвать на куски и отключать всякие Modbus и TCP2UART и т.д. Не будут устанавливаться их сигналы. А по делу надо как можно ранее установить их, назначить вывод отладки и т.д....
 
Последнее редактирование:

vad7

Active member
Вот сюда вставляю код установки обработчика прерываний GPIO:
esp8266web/app_main.c at master · pvvx/esp8266web · GitHub
И обработчик никогда не срабатывает.
Причем экспериментально выяснил, что дело в функции uart_init(), в ней что-то происходит с прерываниями GPIO.
 

pvvx

Активный участник сообщества
Нашел возможность появления ошибки в приеме TCP, но она не повязана с modbus TCP или web (вроде) - для проявления требуется непрерывная загрузка на полную приема по TCP и непрерывным потоком с управлением размера приемного окна, а не как в modbus TCP или простом web - каждое сообщение отдельный пакет TCP, а в web кусочная обработка потока реализована по другому. Завязка может проявиться в TCP2UART - вылет с протектед... Делал новый алго для TCP2UART, более скоростной и с пакетными возможностями - задействовал аппаратный определитель паузы между символами (UART_RX_TOUT_THRHD). С ним снимется задержка на накопление буфера... С ESP творятся странности, когда на 3 Мегабита через UART в TCP в обе стороны долго и непрерывно :) - иногда падет STATION и не восстанавливается до перезагрузки... китайцы...
 

vad7

Active member
@pvvx, в update_mux_uart0() порты настраиваются, а у меня на U0RXD (GPIO3) датчик висит. Вот, похоже, из-за этого и не работает.
В принципе, мне вообще UART0 не нужен. Нужен только UART1 и то только TX (GPIO2) для вывода в терминал для отладки временно, а на готовом девайсе - тоже нет.
Да, и бывает нужно выводить всю отладку только на UART0 (GPIO1).
 
Последнее редактирование:

pvvx

Активный участник сообщества
@pvvx, в update_mux_uart0() порты настраиваются, а у меня на U0RXD (GPIO3) датчик висит. Вот, похоже, из-за этого и не работает.
В принципе, мне вообще UART0 не нужен. Нужен только UART1 и то только TX (GPIO2) для вывода в терминал для отладки временно, а на готовом девайсе - тоже нет.
Да, и бывает нужно выводить всю отладку только на UART0 (GPIO1).
Ну и что я могу поделать?
Лучше скажите как преодолеть китайскую "no buf for action frame" ? Когда долго идет поток 3 мегабита в обе стороны в новой TCP2UART, то она вылазит и станция у ESP8266 отваливается.
Код:
....
uart_rx: new=1460, ns=2920, bl=2920
uart_rx: new=1460, ns=2920, bl=2920
|uart_rx: new=3812, ns=6732, bl=6732
|uart_rx#no buf for action frame
no buf for action frame
no buf for action frame
no buf for action frame
no buf for action frame
WiFi event(7): Probe Request (MAC:56:aa:c7:bd:65:5c, RSSI:-87)
no buf for action frame
no buf for action frame
no buf for action frame
...
Новую ещё не выкладывал из-за этой дурной причины. А без этого тянет 3 мегабита без разрывов в UART c отметками блоков (пауз в передаче по принципу modbus, но размер блока большой), если есть...
 
Сверху Снизу