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

verybad

New member
Последняя версия с github не собирается в режиме rs485. Используется функция из файла tcp2uart, который в конфигурации rs485 не включен в трансляцию:
Код:
web_int_callbacks.c: In function 'web_int_callback':
web_int_callbacks.c:497:7: error: implicit declaration of function 'tcp2uart_ajax_rx' [-Werror=implicit-function-declaration]
       tcp2uart_ajax_rx(ts_conn, tmo);
EDIT: Рекомендацию закомментировать ветку с uart_data я видел. Но с учетом того, что мелкие исправления из RTL варианта, как пишется, попадают и в ESP, было бы логичным поправить код так, чтобы стандартные варианты проектов (0, 1, 2) исходно транслировались.
версия 0.6.3 у меня тоже не собралась а версия 0.6.4 собралась
 

osnwt

New member
С некоторыми переменными используется область данных буфера modbus, по тому и вызывается...
С этим-то я уже разобрался. А вот основной вопрос остался без ответа, к сожалению. Ну да ладно, что-то сделаю.

версия 0.6.3 у меня тоже не собралась а версия 0.6.4 собралась
Я обычно беру версию из git, считая ее априори последней. Не собирается мастер, и в релизах последняя 0.6.3. Где искать 0.6.4 - не знаю.

И спасибо @Neov: с небольшими доработками его питоновский вариант WebFS утилиты для генерации web-диска заработал, как надо. Теперь у меня полная система сборки на MacOS, а виртуальный Windows можно отключать. Доработки выложу в его тему.
 

osnwt

New member
Кстати, 0.6.3 не собирается без ругани более новым компилятором (gcc 4.8.5 на MacOS). Код сборки оверлеев ругается на нарушение strict aliasing, поскольку везде используется приведение типа uint16_t переменных modbus к другим не char (например, к IP адресу), что нарушает вышеуказанное правило. Пришлось отключить этот warning, ибо, иначе надо переделывать описание modbus table. В основном коде все хорошо. На винде собирается все компилятором из UDK (4.8.1, вроде).
 

pvvx

Активный участник сообщества
Пришлось отключить этот warning, ибо, иначе надо переделывать описание modbus table. В основном коде все хорошо. На винде собирается все компилятором из UDK (4.8.1, вроде).
Дык исправьте "ругающиеся" обращения ...
У меня нет MacOS (и наверно никогда не будет - не люблю) и код написан для компилятора UDK c виндой.
И спасибо @Neov: с небольшими доработками его питоновский вариант WebFS утилиты для генерации web-диска заработал, как надо.
Там реализован неполный алгоритм выбора файлов для сжатия, по этому не позволил использовать его в web-свалке.
Исходники оригинального WEBFS22.exe изначально вложены в проект -> webfs\WEBFS22.zip.
 
Последнее редактирование:

osnwt

New member
Дык исправьте "ругающиеся" обращения ...
У меня нет MacOS (и наверно никогда не будет - не люблю) и код написан для компилятора UDK c виндой.
MacOS тут ни причем. Речь о том, что приведение типов вида:
[inline]#define drv_host_ip ((ip_addr_t *)mdb_buf.ubuf)[42>>1][/inline],
где элементы ubuf имеют тип uint16_t, само по себе формально влечет undefined behavior, что может быть приемлемым в случае конкретного компилятора (что и делается путем -Wno-strict-aliasing), но никуда не годится в общем случае. Чтобы исправить сей момент, нужно изменять тип ubuf на char, после чего править все остальное. Либо еще сильнее обманывать компилятор, чтобы он не связывал приведение uint16_t к ip_addr_t (например, добавлять union в описание ubuf). Для проекта, который официально заброшен, это делать нет смысла с учетом того, что ошибки только в оверлеях, а автор считает нормальным, когда проект собирается компилятором 4.8.1, но не хочет при тех же настройках собираться 4.8.5 на другой платформе. Как по мне - это странно с учетом того, что все остальное действительно собирается без изменений в системе сборки. Хотя если бы проект не забросили, я бы несколько поправил бы Makefile и тулзы *.py для более корректного поиска тулчейна (нехорошо, когда C:\Espressiv hardcoded прямо в код питоновского инструмента без варианта ?= и/или поиска в PATH).

Там не полный алгоритм - надо ещё проверку на включение в файлы переменных, а если их там нет то сжимать. Так-же, в оригинале, есть ещё список исключения для файлов которые не сжимать, кроме указания "сжимаемых"...
Если в проекте будет web-диск побольше, то это сразу скажется. По этой причине использовать текущий вариант не получилось - итоговый вариант диска получается сильно больше, чем у "оригинала".
Я не знаю, в какой версии было неправильно. Но в текущей версии с моим патчем все работает корректно, а размер сжатого файла получается меньше. Если файл помечен как динамик, но переменных нет - он сжимается. Списки исключения для несжатия там тоже работают. Там действительно были проблемы в реализации этого (списки не работали корректно), что и исправлено моим патчем, но с ним все в порядке.

Есть два отличия в результате, но они не влияют на работоспособность. Первое - по умолчанию в текущем варианте сжатие максимальное (видимо, виндовая версия использует среднее). Не изучал вопрос, но полагаю, что на скорости распаковки степень сжатия мало сказывается, а упаковка нас не волнует. Второе - разные алгоритмы сравнения файлов со списками исключений. В оригинале проверяется только то, что файл заканчивается на заданное расширение. В питоновой версии используется полноценная файловая маска. В результате в оригинале нельзя указать "*" для "ничего не сжимать" - только конкретные типы, а в питоновой можно. Что я считаю более корректной реализацией.
 

osnwt

New member
Вот рабочая версия (прилагается, переименовать в .py). Вызывается так:
Код:
./webfs_tool.py build -d "*.htm, *.html, *.cgi, *.xml, *.bin, *.txt, *.wav" -n "mdbini.bin, *.inc, *.ini, snmp.bib, *.ovl" -s ./WEBFilesTCP2UART ./webbin/WEBFiles.bin
 

Вложения

pvvx

Активный участник сообщества
MacOS тут ни причем. Речь о том, что приведение типов вида:
[inline]#define drv_host_ip ((ip_addr_t *)mdb_buf.ubuf)[42>>1][/inline],
где элементы ubuf имеют тип uint16_t, само по себе формально влечет undefined behavior, что может быть приемлемым в случае конкретного компилятора (что и делается путем -Wno-strict-aliasing), но никуда не годится в общем случае.
В общем случае web-свалка не является примером для изучения СИ или других стандартов описания. По этому ваши претензии не катят. Тогда уж исправляйтье всё, включая и алгоритмы, т.к. они не являются общепринятыми и не годятся для "в общем случае" и вообще для примеров программирования.
Иначе выходит, что вы придираетесь к какой-то мелочи, но игнорируете главное. :)
Тем более у меня нет желания сдавать данный код "на выставку" или для целей получения каких-либо плюшек. Не все гоняться за всякими PR или прочими званиями. Данный проект выдан "как-есть" и не имеет "(с)" и других ограничений. И если хотите что-то исправить - исправляете и переписываете в свой git со своим "(c)", да занимаетесь поддержкой. Это приветствуется и я не отказываюсь от помощи в этом любому...
 
Последнее редактирование:

osnwt

New member
А нет никаких претензий!
Просто я понимаю, что на данный момент это лучшая реализация subj. И я не один, кто проявляет к ней интерес несмотря на то, что развитие прекращено. И что вопрос о том, почему последняя версия в git не собирается более новым компилятором, будет всплывать еще долго. Поэтому я посчитал полезным обратить внимание других на то, что такая-то проблема действительно есть, но обходится таким-то путем, после чего проект собирается на всех платформах (Windows, Linux, Mac).

Ну а будет ли оно правиться в официальном репозитории или нет - мне, в принципе, безразлично.
 

osnwt

New member
И если хотите что-то исправить - исправляете и переписываете в свой git со своим "(c)", да занимаетесь поддержкой. Это приветствуется и я не отказываюсь от помощи в этом любому...
У меня нет привычки перебивать чужие копирайты и я не занимаюсь коммерческими проектами на ESP8266. Просто у меня завалялось несколько модулей, которые хотелось к чему-то пристроить, чтобы не выкидывать. И тут вылезла неприятная привычка делиться опытом (не важно, своим кодом или найденным решением чужой проблемы). Видимо, тут это не нужно.

А вот на заданный вопрос о наиболее простой реализации полудуплексного RS-485 я ответа так и не увидел. Или это потому, что я не переписал в свой git со своим (с), а без этого помощи нет? :) Шутка, конечно, да и вопрос тот снят. Но, тем не менее...
 

pvvx

Активный участник сообщества
А вот на заданный вопрос о наиболее простой реализации полудуплексного RS-485 я ответа так и не увидел.
Есть же все исходники, а что надо выкинуть для специфики вашего варианта я не знаю. Описывать тут трактат что надо сделать или встраивать ещё одну ветку сборки в исходники долго, т.к. больше не желаю связываться с глюкодромом ESP8266.
Времени на хобби временно не хватает. Не могу даже переписать-приписать уже готовый modbus драйвер к RTL...
 

osnwt

New member
Ну вообще ожидался ответ вида:

"Полудуплексный TCP2RS485 поддерживается из коробки, для чего в прошивке RS485 надо запретить работу Modbus установкой X и разрешить работу полудуплексного RS-485 через TCP установкой Y".
Или
"Из коробки драйвер RS485 привязан только к Modbus. Для получения желаемого надо отключить Modbus (командой Z, так как исключить из трансляции не выйдет из за внутренних завязок) и написать свой обработчик по аналогии с TCP2UART, но через RS485DRV".

Ключевой момент вопроса был: поддерживается ли такая конфигурация штатно (потому что если есть драйвер Serial и есть драйвер RS485, то вполне логично предположить, что второй может использоваться точно также, как и первый, без привязки к конкретному протоколу). К сожалению, ответа не получил.

А за исходники спасибо - да, сделать можно все. Просто с учетом бесперспективности модуля хотелось сэкономить время, причем, не за счет времени автора, а за счет того, что он знает архитектуру системы и может дать мгновенный ответ в одно предложение, в которой в противном случае придется ковыряться. Но, как я уже писал, вопрос снят. На этого монстра писал драйверы и приложения в ранних восьмидесятых, и сейчас еще не все позабыл :)
 

pvvx

Активный участник сообщества
Ну вообще ожидался ответ вида:

"Полудуплексный TCP2RS485 поддерживается из коробки, для чего в прошивке RS485 надо запретить работу Modbus установкой X и разрешить работу полудуплексного RS-485 через TCP установкой Y".
Или
"Из коробки драйвер RS485 привязан только к Modbus. Для получения желаемого надо отключить Modbus (командой Z, так как исключить из трансляции не выйдет из за внутренних завязок) и написать свой обработчик по аналогии с TCP2UART, но через RS485DRV".

Ключевой момент вопроса был: поддерживается ли такая конфигурация штатно (потому что если есть драйвер Serial и есть драйвер RS485, то вполне логично предположить, что второй может использоваться точно также, как и первый, без привязки к конкретному протоколу). К сожалению, ответа не получил.

А за исходники спасибо - да, сделать можно все. Просто с учетом бесперспективности модуля хотелось сэкономить время, причем, не за счет времени автора, а за счет того, что он знает архитектуру системы и может дать мгновенный ответ в одно предложение, в которой в противном случае придется ковыряться. Но, как я уже писал, вопрос снят. На этого монстра писал драйверы и приложения в ранних восьмидесятых, и сейчас еще не все позабыл :)
В одно предложение или даже ограничение на размер поста на форуме это не укладывается. По тому ответа и нет. Ещё раз - там нет классического стиля структурированного программирования и понятий "отдельный драйвер". Иначе это не лезет в стандартную flash модуля и/или работает с дикими ограничениями.
 

osnwt

New member
Ещё раз повторю: меня интересовало, предусмотрена ли в том, что уже есть, возможность работы моста полудуплексного RS-485 через TCP без использования Modbus (при определенной конфигурации свалки) или нет.

Ожидался ответ вида:
- да, включить переменные X=off, Y=on, и установить порт через Z=P, либо
- да, только на этапе компиляции (#define RS485DRV, #undef TCP2UART, #undef MODBUS), либо
- нет без переписывания кода.

Не более того.
 

pvvx

Активный участник сообщества
Ещё раз повторю: меня интересовало, предусмотрена ли в том, что уже есть, возможность работы моста полудуплексного RS-485 через TCP без использования Modbus (при определенной конфигурации свалки) или нет.

Ожидался ответ вида:
- да, включить переменные X=off, Y=on, и установить порт через Z=P, либо
- да, только на этапе компиляции (#define RS485DRV, #undef TCP2UART, #undef MODBUS), либо
- нет без переписывания кода.

Не более того.
Ответ был в вашем вопросе:
Насколько я вижу, вариант TCP2UART мне не подходит - в нем нет драйвера RS-485 с управлением направлением передачи. А вариант RS485 содержит MODBUS, который мне не нужен. Итого, вопрос: можно ли штатно сконфигурировать второй вариант (RS485) в режиме TCP2RS485 на отдельном порту, запретив MODBUS? Если нет, то тогда, видимо, нужно делать свой вариант, используя драйвер RS485 без MODBUS, для чего придется править основной код (например, он вызывает init_mdbtab() при включении RS485DRV даже, если MODBUS отключен в конфигурации).
в котором последнее предложение гласит, что надо переписывать. А моё молчание - знак согласия с вашим-же утверждением.
 

AlekseyK

New member
Ещё раз повторю: меня интересовало, предусмотрена ли в том, что уже есть, возможность работы моста полудуплексного RS-485 через TCP без использования Modbus (при определенной конфигурации свалки) или нет.

Ожидался ответ вида:
- да, включить переменные X=off, Y=on, и установить порт через Z=P, либо
- да, только на этапе компиляции (#define RS485DRV, #undef TCP2UART, #undef MODBUS), либо
- нет без переписывания кода.

Не более того.
Посмотрите в сторону железа. Есть драйвер 485 интерфейса с авто переключением прем-передача max13487
 

pvvx

Активный участник сообщества
Посмотрите в сторону железа. Есть драйвер 485 интерфейса с авто переключением прем-передача max13487
То, с чем борется oswn - как вырезать автоматический стек-очередь управления транзакциями Modbus, стоящий между программным драйвером RS-485 и TCP, когда сам программный драйвер RS-485 адаптирован на данное применение и скорость обработки пакетов по протоколу Modbus.
Это примерно запрос на бесплатное написание среднего уровня (для ESP) ПО по его ТЗ :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
А нет никаких претензий!
Просто я понимаю, что на данный момент это лучшая реализация subj. И я не один, кто проявляет к ней интерес несмотря на то, что развитие прекращено. И что вопрос о том, почему последняя версия в git не собирается более новым компилятором, будет всплывать еще долго. Поэтому я посчитал полезным обратить внимание других на то, что такая-то проблема действительно есть, но обходится таким-то путем, после чего проект собирается на всех платформах (Windows, Linux, Mac).

Ну а будет ли оно правиться в официальном репозитории или нет - мне, в принципе, безразлично.
Это проблема "Свободного программного обеспечения" созданная в его корне Ричардом Столлманом из-за включения в само понятие и дальнейшее его развитие лицензирования и авторства. Это сильно проявлено в дальнейшем - в GPL. GPL вообще уже свободным не является, т.к. при получении исходных кодов в нем заложены обязательства и ограничения ваших действий - вы обязаны сопровождать (с) на авторское право. В итоге это всё является бомбой, заложенной в основание "Свободного программного обеспечения" и тормозящее его развитие. По этому на сегодня и не имеется корректных и простых путей создания переносимого ПО, добавки исправлений/улучшений и т.д.
Я вот не желаю наблюдать в тексте исходников свой ник, а ставлю его исключительно в целях пометки, что эту часть писал я, что указывает мне о возможности большого кол-ва ошибок и что возможно вспомнить о чем это, а не изучать как чужой. При переносе, т.к. это уже кто-то воспринял и проверил, или через некоторое время, т.к. всё равно уже не вспомню о чем это, данные маркеры желательно удалить. Но такой лицензии не существует, что обременительно.
 
Последнее редактирование:

Elik

New member
Доброго всем вечера, может кто подскажет есть ли версия под esp32 либо rtl8210? И ещё: как сделать так, что бы при подключении к esp8266 при наборе любого адреса в браузере происходила автоматическая переадресация на сайт вебсервера, что бы не гадать IP адрес?
 

pvvx

Активный участник сообщества
как сделать так, что бы при подключении к esp8266 при наборе любого адреса в браузере происходила автоматическая переадресация на сайт вебсервера, что бы не гадать IP адрес?
Поставить галочку в меню web: System Setup -> Captive Portal AP.
rtl8210 - это что за зверь? Есть (вариться) на RTL8711/8710/8195 серии "A" ->
Web-свалка на RTL871x
 
  • Like
Реакции: Elik
Сверху Снизу