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

Web-свалка на RTL871x

pvvx

Активный участник сообщества
Web-свалка успешно переехала на RTL-ы.
GitHub - pvvx/RTL00_WEB: Simple web server for RTL8710AF
Дописываю основные функции переключения WiFi... Возможно кто поможет с оформлением и переписыванием по максимуму примеров Web страниц c Ajax на websosket (особенно интерактивные, с графиками и т.д.) ? В данном Web есть поддержка и того и другого. Переменные передаются через GET/POST/куки/мультидата и websocket... Надо ли SSI?
А пока предложить могу только галерею картинок с уже как-то работающих страничек...
Заодно принимаются заявки, на что надо дополнить и что хотелось бы иметь в Web-сервере. Может как-то разбить на простой и более сложный вариант?...
Снимок1408.gif Снимок1407.gif Снимок1405.gif Снимок1403.gif Снимок1402.gif
Начальные тесты показали, что модуль RTL8711AM успешно выдерживает за 200 (для RTL8710AF - до 70) одновременных открытых HTTP соединения и порядок в 20000 обработок коротких HTTP запросов-ответов с открытием-закрытием портов в минуту... RTLHTTPD
 
Последнее редактирование:

Simon

Member
Ссылки на проект и sdk к нему пока нет?
Из пожеланий - обновление прошивки через web и классика UART<->TCP в пару кликов как на esp.
 

pvvx

Активный участник сообщества
Ссылки на проект и sdk к нему пока нет?
Из пожеланий - обновление прошивки через web и классика UART<->TCP в пару кликов как на esp.
Обновление через Web было и есть. Просто оно не было описано :) Там всегда была включена и посекторная запись Flash... На ESP это особо не требовалось, с его прожорливостью flash, т.к. продаваемые модули были с малым размером flash и SDK туда два раза не лезла. Тут то во время записи Flash всё работает и не вызывает никаких проблем писать её на ходу как угодно, хоть побайтно в окне страницы мышкой. :)
Возможно допилить и TFTP. Он уже "почти" адаптирован и давно закинут в мою сборку SDK... (от другой версии LwIP и надо поправить только заголовки).
----------
+
На HTTPS с RTL871xAF Web не вытянуть. Это возможно только на RTL8711AM.
----
На git пока не скинуть - очень много изменений в самом SDK, в основном по API WiFi и надо притянуть (адаптировать) уже имеющиеся старые примеры к ним, чтобы не городить множества репозиториев с SDK к сотне мегабайт...
 
Последнее редактирование:

vad7

Active member
Пожелание: если это еще не сделано, увеличить лимит для размера переменных и их имен в функциях web_parse_*.
Добавить функцию записи в webfs.
 

pvvx

Активный участник сообщества
Добавить функцию записи в webfs.
Не вижу смысла в "записи" на простой web-диск. Вы будете писать по одному файлу страницы сервера?
Всякая статистика и прочие накапливаемые данные обычно пишутся в своем формате и для передачи их надо разбирать, а не на прямую гнать в HTTP поток. Обычно делают циклический буфер в Flash для их записи и процедуру имитации вывода данных из них, как файла, в разных форматах.
При записи файлов на Flash возникает бяда в виде тормоза, чтобы дырки не протереть при записи. Никто вам не мешает прикрутить в качестве файловой структуры и SPIFFS и ждать открытия файла более 1 секунды :) Ограничим в Web на одно текущее соединение и будет работать... :)
SD прикручивается влет, но запись на ней тоже накладывает ограничения в виде установки супервайзеров питания и UPS. Иначе может слететь вся, при отключении питания не вовремя.
Web обращается к диску всего 4-мя функциями: Open file, Read блок, Seek обратно на указанное число от текущего, Close file. Текущие установки web требуют от 32-х одновременно открытых файлов. Желательно больше, но RTL00 "мало памяти".
Так что давайте свою файловую систему с записью и алго, как писать файлы по HTTP с разбором каталогов и прочих атрибутов файлов, кол-вом одновременно открытых от 32-х файлов и умещающуюся в память RTL00. Жду.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Пожелание: если это еще не сделано, увеличить лимит для размера переменных и их имен в функциях web_parse_*.
А смысл? Быстрее получить сообщение "мало памяти"?
Яндекс: "самое длинное слово в русском языке"
«Тетрагидропиранилциклопентилтетрагидропиридопиридиновые» (55 букв, химич. вещество)
А синтезировать белки Web-свалка не умеет, чтобы ей передавать самое длинное слово в мире: http://geekologie.com/2012/11/20/titin.txt


Для справки:
Microsoft Internet Explorer: Начиная с четвертой версии браузера, максимальная длина воспринимаемого URL составляет 2 083 символов. При этом длина GET-запроса лимитирована 2 048 символа.
Web-свалка жрет GET запрос от 3-х MSS до где-то к 6-ти кило.
У POST запросов лимитов нет.
URL ограничен длиной имени файлов с каталогами на дисковой системе.
Кол-во переменных в URL строке ограничено длиной GET запроса.
Для передачи бесконечного числа переменных существует формат "мультидата", но ограничение тоже есть, т.к. оно не явное - размер Content до 4294967296 байт (32 бита) и обходить это я не стал.
Это старинные методы. Для современных - используйте websocket. Там ограничения на кол-во переменных нет.
 
Последнее редактирование:

vad7

Active member
pvvx, эк вас заплющило... :)

у вас 3 функции парсинга в которых объявлены буфера 32 на имя и 192 на значение, чем они и ограничены:
esp8266web/web_srv.c at master · pvvx/esp8266web · GitHub

Хотя можно использовать всего одну универсальную функцию и не задействовать локальные буфера, а парсить прям на месте и не будет доп. ограничений на длину:
PowerMeter-IrDA/web_srv.c at master · vad7/PowerMeter-IrDA · GitHub
 

pvvx

Активный участник сообщества
Да как хотите, чё тогда спрашивать про пожелания?
Себе вот сделал функцию записи на место старого файла без ресайза и пока хватает...
А всем не хватит. Вам побаловаться, а нам для более серьезных вещей. :p
 

pvvx

Активный участник сообщества
pvvx, эк вас заплющило... :)

у вас 3 функции парсинга в которых объявлены буфера 32 на имя и 192 на значение, чем они и ограничены:
esp8266web/web_srv.c at master · pvvx/esp8266web · GitHub

Хотя можно использовать всего одну универсальную функцию и не задействовать локальные буфера, а парсить прям на месте и не будет доп. ограничений на длину:
PowerMeter-IrDA/web_srv.c at master · vad7/PowerMeter-IrDA · GitHub
vad7 - во вас как колбасит :)
Имя переменной в 32 символа. Это сколько вариантов?
Каким образом парсить на месте, если надо перекодировать строку из web символов в обычные?
Ваша функция срет в начальную строку, а она может быть в flash, т.е. const :)

И ещё раз - опишите цели увеличения размеров имен переменных и их параметров.
Пока это только ваша блажь, как и запись в одно и то-же место чтобы Flash в SoC вышла из строя. Arduino в соседней ветке... :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Да ну!? Бред не пишите.
И для особо одаренных объясняю:

Переменные при парсинге из URL и т.д. должны поступать в очередь (стек списка) (Queue), а не обрабатываться на ходу в том-же треде. Там ещё масса условий, таких как Аутентификация на разрешение исполнения. Это предполагается сделать, т.к. уже есть проблемы – не всё функции работают из уровня приоритета LwIP и могут иметь длительное время исполнения. Зачем потоку web держать все принятые данные за всю жизнь в принятых буферах, если использовать ваш глупый подход?

А цель простая, редактирование больших настроек, как то выгрузка на IoT сервер.
Выгрузка чаго? Файла? Дык он должен иметь свою "дисковую систему", про что вам и написано. Давайте пример файловой системы для flash - уже второй раз спрашиваю. :)
Вы уже в прошлой теме с ESP постоянно попрошайничали эти глупые вещи, которые не решаются по вашему - тут не ESP, которая делает дырки в flash сама, постоянно переписывая один и тот-же сектор. Так что с вас файловая система для Flash с записью. Они есть, но проприетарные. Ваша задача изменить их, адаптировать и выложить нам :p
 
Последнее редактирование:

vad7

Active member
pvvx, А не пойти бы кое кому в лес с задачами то?
То что вы что-то делаете и выкладываете в публичный доступ, не наделяет вас правом хамить.
И показывать свою шизу нужно не на форуме, а у врача, а то не нароком обострение случится...

А то что функции в веб свалке неоптимальные, так это ни чего, с кем не бывает. Вам написали, как сделать более оптимально, а вы тут хрень несете, пытаясь оправдаться.
Некрасиво.

По третьему разу объяснять зачем это я все это доработал, не буду, ибо бесмысленно.
Вам не нужно и ладушки.

Там еще и баги были, связанные с особенностью esp8266...
В прошлый раз, когда я на это указал, вы то же, что-то прогнали, и так и не исправили.

Есть такая поговорка - не трожь г$вно, вонять не будет.
Вы извините, специалист вы может и хороший, но как человек вы полное ....
 

pvvx

Активный участник сообщества
pvvx, А не пойти бы кое кому в лес с задачами то?
То что вы что-то делаете и выкладываете в публичный доступ, не наделяет вас правом хамить.
И показывать свою шизу нужно не на форуме, а у врача, а то не нароком обострение случится...

А то что функции в веб свалке неоптимальные, так это ни чего, с кем не бывает. Вам написали, как сделать более оптимально, а вы тут хрень несете, пытаясь оправдаться.
Некрасиво.

По третьему разу объяснять зачем это я все это доработал, не буду, ибо бесмысленно.
Вам не нужно и ладушки.

Там еще и баги были, связанные с особенностью esp8266...
В прошлый раз, когда я на это указал, вы то же, что-то прогнали, и так и не исправили.

Есть такая поговорка - не трожь г$вно, вонять не будет.
Вы извините, специалист вы может и хороший, но как человек вы полное ....
А можно вас попросить не использовать Web-свалку, без разрешения врача?
Сходите к психиатру, получите справку и опубликуйте - тогда разрешу :)
А пока начнем с того - где коды дисковой системы с записью, без дырок?
А закончим тем, что попробуйте запустить из треда LwIP какую функцию WiFi, потом срочно к врачу - докладывать, как вы сотый раз упрашиваете меня сделать проект лично под ваши выкрутасы, не подкрепленные ничем, кроме дури. :p
И вот вам направление к врачу:
Код:
Task List:
==================================================
Name      Status Priority HighWaterMark TaskNumber
loguart         R       4       662     4
IDLE            R       0       36      2
TCP_IP          B       9       637     5
Tmr Svc         B       5       444     3
cmd_threa       B       6       251     39
web_qfn         B       5       676     13
rtw_littl       B       10      451     40
rtw_inter       B       6       207     38
rtw_recv_       B       5       887     36
rtw_check       B       5       211     41
rtw_TDMA_       B       7       219     42
rtw_xmit_       B       5       221     37
Приоритет TCP_IP увидели, и сравнили с ожидание выполнения других, входящих в WiFi драйвер. Понижать динамически на ходу не буду, т.к. чревато другими осложнениями и направлениями вас к дохтору. :)
И ещё одно направление к другому дохтору, если плохо с чтением:
Т.е. нет никакого смысла в буферизации потоков сокетами, т.к. нужно всего обрабатывать строку или команду длиной не более 256 байт в этих потоках и иметь стек дескрипторов для запросов переменных и отдачи блоками файлов.
Подчеркнул, что писалось ранее, другими словами, с ошибками и бегло, но вы не в состоянии и это воспринимать, т.к. вам надо только свою блажь. :)
И ещё раз - Arduino в соседних ветках - вам туда, т.к. там, если люди задают вопросы правильно, то и получают нормальные ответы, а здесь вы ведете себя неприлично, даже когда вам разжовывают почему и как...
В который раз вам ещё объяснить, что вы делаете оптимизацию на тестовой версии, нагроможденной за время выхода разных SDK к ESP8266? А тут RTL871x с RTOS и методы отличаются. Начальная разбор на разный парольный доступ уже вписан и как уже сказал - "парсить" переменные теперь надо по другому... Но могу оставить - бросить, вставить ваш кусок и пусть себе растет, как великий оптимизированный сорняк, не давая сделать другое?
 
Последнее редактирование:

pvvx

Активный участник сообщества
Вы хотели оптимизации, но полезли в мелкий уровень. Третья справка для таких больных:

Данные поступают из буфера LwIP– его распределителя памяти. В данном случае, у вас, они переписываются в другой буфер , распределяемый в heap менеджером памяти RTOS. Выходит двойной буфер и пересылка. Можно работать и в буферах LwIP, выуживая построчно и уже декодировав с парсингом. По времени это почти одинаково, но в итого меньше сложных манипуляций и ваши мелочные оптимизации при этом опять не катят.

Там-же выходит, что для передачи блока необходимо всё равно его кешировать в LwIP (передавать LwIP буфер, который он дублирует в своих pbuf на время передачи стека TCP), т.е. это всё говорит, что надо работать прямо в pbuf LwIP-а и не городить свои приемо-передающие буфера.

if ((crlf = pbuf_memfind(hs->req, CRLF, 2, preq->offset)) == 0xFFFF) …
if (((pos = pbuf_memfind(p, "boundary=", 9, preq->contype)) < 0xFFF0)…

Как-же тогда будет работать ваша опимаза?
Надеюсь, теперь вам уже хватит направлений к врачу?
--------
А мы тут продолжим изучать какие простые вопросы и пожелания есть. Русло их описал ранее, в первом соо – нужно или нет SSI? Или сделать возврат, по каким то пару выбираемых алгоритмов галочками в меню, к настройкам у WiFi при неуспехе нового соединения и т.д. Оптимизировать будем потом , когда созреет концепция и будут осмысленны необходимые затраты на оптимизацию (затраты времени). :p
 

aloika

Active member
А мы тут продолжим изучать какие простые вопросы и пожелания есть.
Хочется механизм сброса настроек до дефолтных (как было по кнопке на ESP) и tcp-client в каком-нибудь виде (как было на ESP оверлеем). Про SSI почитал, с ходу не понял, какие возможности это даст, надо разбираться...
 

pvvx

Активный участник сообщества
Хочется механизм сброса настроек до дефолтных (как было по кнопке на ESP) и tcp-client в каком-нибудь виде (как было на ESP оверлеем). Про SSI почитал, с ходу не понял, какие возможности это даст, надо разбираться...
SSI - это по причине желания сделать так, чтобы избавиться от Ajax по максимуму.
Сброс настроек относится, в основном, к WiFi и начальной загрузке конфигурации галочек, что запускается по старту. Оно уже есть и было сделано в базе. Тут не ESP с закрытой частью начальной загрузки, установок и невозможности влияния на их ход и сборку вообще.
Tcp-client на RTOS и с использованием socket описывается в 5 строчек СИ и смысла вводить его в базу нет. Есть уже работающие либы websock-client, MQTT и подобное, хоть с SSL.

Кратко, для моего API WiFi:
Код:
/* Опции загрузки конфигов по старту */
//#define DEF_LOAD_CFG 0                                // старт в назначенном режиме по умолчанию
//#define DEF_LOAD_CFG BID_ALL_WIFI_CFG                 // старт в назначенном общем  режиме по умолчанию, с загрузками последних конфигураций ST и AP
#define DEF_LOAD_CFG (BID_ALL_WIFI_CFG | BID_WIFI_CFG)    // старт в записанном режиме

/* Опции разрешения записи конфигов по упсешному соединению или выполнению операции установок режимов WiFi без ошибок */
#define DEF_SAVE_CFG (BID_ALL_WIFI_CFG | BID_WIFI_CFG)    // сохранение по успешному соединению/выполнению для всех конфигов:
                                                        // (для ST или AP пишутся раздельно) с проверкой на изменения
На сегодня вроде застабилизированы переключения WiFi режимов, но есть одно большое "НО". WiFi драйвер использует 1 или 2 netif, в зависимости от режима (AP или ST / ST+AP). В ROM и текущем коде SDK, в режимах ST или AP используется всегда netif[0], а при ST+AP меняют местами названия интерфейсов и прочее, приводящее к тому, что имена устройства, переданные DHCP, NETBIOS, mDNS и т.д. меняются, а внешнее устройство не опрашивает смену (windows) и не может получить доступ по старому имени, пока не истекут определенные тайм-ауты (или если перезагрузить windows или какая-тама операционка использовалась)... Кароче полный бардак и исправить его будет возможно только если полностью перепишу код управления в драйвере WiFi SDK (тот который в закрытых либах).
----------
Для @vad7 сообщаю - найдены ошибки в tcpsrv из темы к ESP8266, приводящие к вылету (до протектед) при определенных операциях открытия-закрытия TCP соединений и связанные с алгоритмами работы LwIP и исправлены только тут, для RTL... Т.е. можно "убить" ESP8266 с тем кодом на уровне стандартных посылок TCP пакетов c хитрой последовательностью ACK и FIN. :) (про глюки с переменными разговор не идет - через них можно переписать и заглючить всё - они для этого и сделаны - для тестов). Развитие ESP-Web-свалки - закрыто.
 
Последнее редактирование:

GDI

New member
SSI конечно надо, как же без них? Городить на вывод пары переменных json или websocket?
 

pvvx

Активный участник сообщества
SSI конечно надо, как же без них? Городить на вывод пары переменных json или websocket?
Для вывода переменных, вставки в файлы с атрибутом "парсить" при выводе в поток HTTP у web-свалки, используется формат [inline]~имя~[/inline] или [inline]~имя=параметры~[/inline]. SSI подразумевает язык [inline]IF[/inline] [inline]ELSE[/inline] и назначение форматов вывода стандартых переменных типа времени года - зима, лето - SSI (программирование) — Википедия, т.к. на каждой планете оно своё :)
Сейчас, к примеру, нет возможности переключения содержания файла в целом, к примеру по коду авторизации пользователя. Или запрета вывода по каким-то критериям каких-то файлов с подменой на другие. Один каталог для Васей, другой для Петей...
 
Последнее редактирование:

GDI

New member
Я имел в виду SSI который просто вставляет переменные в текст страницы как в lwip-шном httpd, т.е. [inline]~имя~[/inline].
 
Сверху Снизу