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

Web-свалка на RTL871x

pvvx

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

Увидел дополнение - ну да, это кажется хорошим вариантом.
Если Web-диск не запишется (отключение питания), то ничего и не запуститься - добейте его контрольной суммой. Если вы туда сами записали что кривое, то у вас есть JTAG. Или вы отдаете пользователям кривые прошивки вообще без испытаний? :)
Вообще модуль c WiFi в пользовательских вариантах обычно идет с внешним MCU. Если он типа STM32Fxxx, то там всегда возможен разъем USB для любой записи модуля, хоть через Jtag/CMSIS-DAP или UART. Примеры кода для OTA с UART есть в SDK, CMSIS-DAP и совмещенный с UART (копайте там).
 
Последнее редактирование:

aloika

Active member
Если Web-диск не запишется (отключение питания), то ничего и не запуститься. Если вы туда сами записали что кривое, то у вас есть JTAG.
У меня-то есть (J-link, но не суть), я говорю о пользователе, у которого ничего такого нет вообще. Было бы здорово отдать пользователю изделие, в котором он сам мог бы обновить прошивку. И в случае отключения питания во время такого обновления как-то изделие "раскирпичить".
 

pvvx

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

К примеру, в изделиях для пром.исполнения никаких авто-обновлений не используем. Это чревато последствиями – убитым устройством самими работниками для своих нужд или … :) Т.е. там без дополнительных устройств или пачки программных ключей со спецификой, передаваемых изготовителем никаких авто-обновлений быть не должно - иначе получите использование до истечения гарантийного срока и возврат, который выльется в лимоны рублей + пачку судов... В России так принято у "блатных". Несколько раз сломают, зафиксируют неработоспособность и оформят возврат через местный суд в n-ской области, где у них связи (псё связано). Потом будете бегать и переназначать суды в Москву... и т.п. :)
В 99.99% потом суды выиграете (если умеете и наняты правильные люди :) ), но получите изношенную установку, хоть даже с оплаченным демонтажем и доставкой обратно… И куда её потом? :) Цели то у таких – закупка оборудования, производство на нем товара и возврат всего оборудования (или навешивание на вас их специально сделанных простоев), мотивировать будут всем – не работала, создавала простои (за которые вы по их приколу будете должны :) ) и т.д.
Почему и нужны всякие логгеры даже для каждого транзистора в таких вещах :)

На всех чипах RTL871x есть NFC – можно запилить обновление и по нему, или только через ключ от него...
 
Последнее редактирование:

aloika

Active member
Вообще модуль c WiFi в пользовательских вариантах обычно идет с внешним MCU. Если он типа STM32Fxxx, то там всегда возможен разъем USB для любой записи модуля, хоть через Jtag/CMSIS-DAP или UART. Примеры кода для OTA с UART есть в SDK, CMSIS-DAP и совмещенный с UART (копайте там).
Спасибо за идеи, погляжу. Хотя сейчас у меня не STM, а ATTiny, для моей задачи хватает. У младших STM нет дифференциального АЦП, а мне надо. А старшие вроде как и ни к чему.

Но вариантов выходит слишком много и я не буду и не в состоянии все создавать и предоставлять для ваших условий...
Это понятно, я исхожу из того, что есть, и что я могу реально сделать дополнительно с учетом своих возможностей. С другой стороны, всегда есть надежда, что какие-то моменты вы посчитаете важными и достаточно общими, чтобы включить в сборку.
 

pvvx

Активный участник сообщества
Это понятно, я исхожу из того, что есть, и что я могу реально сделать дополнительно с учетом своих возможностей. С другой стороны, всегда есть надежда, что какие-то моменты вы посчитаете важными и достаточно общими, чтобы включить в сборку.
Большинство, что вы называете "сборкой" - это всего предварительные тесты на возможности. Потом это дело полностью перерабатывается с участием нескольких программистов и кучи тестов на реальном оборудовании. Иначе то как такое пускать в производство? Тем более итог уже имеет понятие "ноу-хау" предприятия, да и в 90% не годится для домашнего использования из-за специфичности...
Часто приходиться и просто накалякивать "по просьбам трудящихся", но одному это всё не проверить и не испытать "в боевых условиях", да вместо испытаний и подсказок получаются только новые хотелки и троллинг - оно наглядно показано в Разнообразные модули с RTL871x и RTL8195. :) Для исключения этого введен метод разделения - никаких полных и готовых проектов и повышение на них "уровня входимости", чтобы "телепузики" не лезли и не могли пользовать, по причине якобы особой сложности для них. :) Ныне уже подросли и Ameba и MBED для RTL-ов - вот его пусть и используют. У них именно то предназначение - поиграть, поучиться программированию, испытать какие-то "хотелки" и забросить на полку. В этом, в помощи не отказывается, но обучать основам программирования "старых-пердунов", которые ныне проходят уже в школе - нет никакого желания и не дает никому никакой перспективы... Их можно только использовать для описания под их завывания уже имеющегося... :)
 
Последнее редактирование:

sharikov

Active member
... во время OTA других оверлеев и функций от модуля не требуется, и так получается компактнее - вообще функции прошивки OTA и прочего не хранятся на модуле...
А где они хранятся ??? Облако не упоминать!

В качестве резервной прошивки для восстановления модуля проще сделать ужатый до предела TFTP. На смарт или PC пишется простая прога, подключающаяся к AP модуля ...
98% потребителей неспособны установить и настроить TFTP сервер особенно на смарт.
Оставшиеся 2% это не потребители а айтишники или гики, с ними еще хуже потому что они думают что умнее разработчиков девайса.

Поэтому неубиваемый HTTP апдейтер с одной кнопкой !
 

pvvx

Активный участник сообщества
А где они хранятся ??? Облако не упоминать!
В самом апдейте. "Оверлеи" грузятся и по сети, а не только с диска... В RTL00 можно загрузить 100 кило-байтный код в пустой "heap", а в "M"....
100к хватит с уже имеющимся кодом WiFi и прочим, для простого программатора flash?
98% потребителей неспособны установить и настроить TFTP сервер особенно на смарт.
Оставшиеся 2% это не потребители а айтишники или гики, с ними еще хуже потому что они думают что умнее разработчиков девайса.
Они об этом и не узнают, им надо всего запустить "новая прошивка.exe" :)
 
Последнее редактирование:

sharikov

Active member
В самом апдейте. "Оверлеи" грузятся и по сети, а не только с диска...
В модуле который нужно обновить прошивка на SDK 3.5 оверлей в апдейте создан под SDK 5.3.
API за это время поменялось 2,5 раза.
Нафиг-нафиг.

Они об этом и не узнают, им надо всего запустить "новая прошивка.exe" :)
И начнется: фаервол, антивирус, открытые порты, "у меня macOS и ничего не работает...".
Вы явно не работали с потребителями.
 

pvvx

Активный участник сообщества
В модуле который нужно обновить прошивка на SDK 3.5 оверлей в апдейте создан под SDK 5.3.
API за это время поменялось 2,5 раза.
Нафиг-нафиг.
Т.е. вы каждый раз меняете код аварийной загрузки? :) Сделайте табичку для 10 функций по абсолютному адресу. Больше, чем 10 шт. внешних процедур прошивальщику не требуется. Посчитайте сами.
Так-же вам никто не мешает получит дату сборки или даже её час и напихать в OTA 1000 загрузчиков. Это всего-то до 100 мегабайт пачка загрузчиков – меньше скачанного мультика :) Если новый код не снять из инета, то значит на оленях - а там минималка ныне microSD - у неё объемы больше и все ваши годовые модификации в бинарном виде туда полезут, а олени не перетрудятся :)
ОТА нужна только тем, кто продает некачественный недоделанный товар... :(
И начнется: фаервол, антивирус, открытые порты, "у меня macOS и ничего не работает...".
Вы явно не работали с потребителями.
Ваши методы устарели. Прямая связь через WiFi со смарта и оно само найдет SSID своего модуля, да кинет туда всё что надо, как в Wынь и в Лух...
На macOS вообще ничего не работает. Как же там продолбиться вообще пользователю через удаленный роутер на ваш WiFi модуль? :) И зачем "пользователь" вообще покупал МАK? Почему чуть менее экзотичное не нашел - например комп с CP/M? :)
Разницы там выходит никакой - всё можно сделать и автоматом в браузере - тем-же исполняемым файлом. Роутеры и фарволы тут не пир чем. Или вы вообще WiFi на модуле не используете? - Тогда дрова на USB и шнурком...
Я вот ни разу ещё не пользовался кнопками WPS и прочими - с кнопками, на бытовых штучках. Пробовал - нифига не соединяется и телефоном фотал наклейки и оно всё само соединялось...
Копаться надо только в *nix, в остальных системах работает java и jvascript.
---------
Cisco тоже не может передать даже через HTTPS автоматом IP для TFTP:
Cisco Wireless LAN Controller (WLC) Software Upgrade | Getting Started with Wireless | Cisco Support Community
Wireless LAN Controller (WLC) Software Upgrade
Тем более инкапсулировать его хотя-бы в webcocket и всё сделать автоматом... :(
---------
@sharikov - какой-же протокол обновления вы выбрали? Просто лить файл в HTTP в cоntent-е?
Это не всегда и везде проходит и требуется более правильный протокол - запросно-ответный. По этому и ближе TFTP (а инкапсулировать его можно как угодно - он мелко-блочный). Передающий часто не ждет и льет как льется до ошибок, ожидая что вы перезапросите с какого-то куска, если что, а flash не пишется с мега-байтным трафиком... И никакая домохозяйка не в состоянии указать файл на диске из Http/html странички.
И если потребуется какая переразметка общей структуры, то как лить такое через HTTP? Вот тут у вас и начнется описанное вами - версия 3, только после 2, а до этого обязательно 1...
Будете придумывать и менять с каждым обновлением свои протоколы дешифровки заголовков файлов в МБ-ы или воспользуетесь наработанным другими за годы, немного их покромсав (выкинув совсем не нужное) и облачив в современный вид?
 
Последнее редактирование:

aloika

Active member
В свалке на esp была функция get_mac_time(), и связанная с ней переменная (вроде бы ~mactime~). Возвращала время от момента включения модуля в микросекундах.

Здесь тоже есть такая переменная, но возвращает она вот такое: ux.dd = *((uint64_t *)(WIFI_REG_BASE + 0x0560));
А это не то же самое, это, похоже, что-то типа "счетчика моточасов" в танке :) Т.е. время работы модуля вообще, а не с момента включения.

Вопрос - а есть ли здесь готовая функция, которая вернет время с момента включения модуля (хотя, конечно, запомнить можно при включении и потом вычитать из текущего значения)?
Или проще, наверное, взять xTaskGetTickCount() - она же в мс (при соответствующей настройке rtos).
 

pvvx

Активный участник сообщества
Здесь тоже есть такая переменная, но возвращает она вот такое: ux.dd = *((uint64_t *)(WIFI_REG_BASE + 0x0560));
А это не то же самое, это, похоже, что-то типа "счетчика моточасов" в танке :) Т.е. время работы модуля вообще, а не с момента включения.
Это TSF счетчик WiFi. Он аппаратный и если WiFi выключен, то и он отключен - будет "протектед".
Там ещё много нюансов, связанных с TSF и его значением... При инициализации связи WiFi он обычно дублирует аналогичный счетчик у AP, к которой подключен модуль (в итоге там у вас и получается время работы от старта вашего роутера, а не модуля :) )... У RTL, синхронизация AP сделана по другому, чем у ESP. Модуль смотрит канал, и если есть ещё какая AP в данном канале с достаточным уровнем (близко работает), то синхронизируется с ней - итог: свой и соседний beacon идут рядом и высвобождается временной участок для связи между beаcon для передачи данных всем. У ESP AP работает асинхронно (не по стандарту WiFi) - ей пофиг до других и плодит дополнительные коллизии всем соседям...
Или проще, наверное, взять xTaskGetTickCount() - она же в мс (при соответствующей настройке rtos).
TickCount RTOS и берите.
 
Последнее редактирование:

pvvx

Активный участник сообщества
В связи с “летом” , времени “на сидение на попе”, совсем нет. Может кто поможет, адаптировать Dygraphs или Highcharts для нормального отображения поступающих текущих данных c датчиков?
Для отладки взят самый дешевый вариант для тестов (чтобы было доступно всем, как и в видео, взят самый дешевый генератор с али) - INA219, дающий к 1000 точек в сек.
Итог работы, с Dygraph, выходит такой:
RTL00_WEB/ws_test_ina219d.html at master · pvvx/RTL00_WEB · GitHub
Используется буфер на 50 000 точек и пример написан не оптимально - только для проверки возможности...
У Highcharts свои беды – он не умеет отображать интерактивный график с точками, поступающими чаще одной в сек.
Так-же есть беды у автоматического масштабирования при выводе бегущих графиков. Необходим параметр плавного изменения времени масштаба при уменьшении и ограничения масштабирования.
Иначе, при дурных датчиках (INA219), даже с осреднением в Dygraph, имеем это:
Снимок1538.gif

Что ещё желательно от библиотек javascript, для продвижения проекта web-свалки:

Отображение текущего синхронного графика нескольких датчиков с возможностью задания окна. При задании окна необходим вывод показаний средних значений за выбранное окно и их распечатка (доступ к данным). Желательно производить накопление с децимацией точек на период более суток. Глубина буфера отображения графика “текущих значений”, без понижения дискретности приема точек должна стремиться за период более часа. Дискретность точек при этом от 0.1 до 0.001 сек. При сложностях и ради экономии – ограничение 0.1 сек.
Отображение “графика статистики” (это уже есть в любой либе javascript). Данные графика статистики запрашиваются отдельно. Их будет накапливать сам модуль в flash, для увеличения дискрета точек, возможно в дополнительной flash, с периодом циклического буфера на год. Т.е. с “график статистики” проблем нет, а есть проблемs с “текущим графиком”. С ПО на RTL проблем нет – при помощи c javascript, все исходники будут в открытом доступе. Данные будут передаваться в javascript по websocket, а там уже проверена передача и 16-ти битных значений встроенного ADC вплоть до 48 кГц и отображение через AudioContext в javascript или даже на Dygraph. Но такие скорости не нужны, т.к. следует ограничиться полосой WiFi при наличии нескольких устройств до 100..200 КБ/сек.
Если "сообщество" ничем помочь не сможет, то проект перейдет в частный и закрытый, как и другое, связанное с RTL от меня. Спешки нет, время на раздумья более пару месяцев и это не ультиматум и подобное... Просто это необходимо многим и в случае не решения я просто возьму другой модуль WiFi, который не доступен всем или дорог, а вместо решения ПО на сам модуль займусь решением окучивания javascript...
 
Последнее редактирование:

АндрейМ

New member
pvvx, если терпит, присоединюсь к осени. Сейчас перегруз с реализацией WebRtc, времени не хватает
 

GDI

New member
Нет ли у кого реализованной поддержки хранения файлов на SD карте с FatFs от Чана?
Очевидно что надо переписать webfs.c, правильно я понимаю? Сам сейчас этим занимаюсь, но может кто то уже это сделал?
 

sharikov

Active member
Нет ли у кого реализованной поддержки хранения файлов на SD карте с FatFs от Чана?
Очевидно что надо переписать webfs.c, правильно я понимаю? Сам сейчас этим занимаюсь, но может кто то уже это сделал?
Нужно переписать HAL.
SDIOHC HAL на данный момент непригоден для production. Недоработки, ошибки и нестыковки с SDK 4.
Также в production строго обязателен ключ питания SD карты потому что из ряда состояний карта выводится только сбросом питания.
Пока - забудьте.
 

GDI

New member
А мне не для RTL :), да и карта у меня работает через SPI. В общем, эта часть реализована и работает нормально с lwip и его httpd. Мне нужно просто заменить обращения к Flash на обращения к функциям f_open, f_read и т.д. Но тут у pvvx сделаны кеши, хэши и прочие вещи с которыми надо разобраться чтобы с минимальными изменениями подсунуть файлы с карты.
SD прикручивается влет
Вот это хотелось бы чуть подробнее.
 
Последнее редактирование:

FGX

Member
Добрый день. Раньше (в аналогичной теме по ESP) в шапке темы или на гитхабе была картинка с подключением, понятно, что это просто на первый взгляд, но я туплю, как-то запутано все, вот картинка из спецификации с намеком на аналогиюESP-RTL.gif а вот в той же спецификации в таблице ниже и теме про ардуино(просто тут крисивее, чем таблица) ArduinoRTL00.gif Меня для этого проекта интересуют 4 вывода UART0_RX, UART0_TX, UART0_RTS , UART0_CTS. По идее, плату разводили для совместимости, но я смотрю, что самый главный уарт переехал. Можете картинку дать с подписями этих 4 ножек? Просто под ESP печатка разведена и нужно понимать, что под RTL нужна своя печатка.
 

sharikov

Active member
...
Меня для этого проекта интересуют 4 вывода UART0_RX, UART0_TX, UART0_RTS , UART0_CTS. По идее, плату разводили для совместимости, но я смотрю, что самый главный уарт переехал. Можете картинку дать с подписями этих 4 ножек? Просто под ESP печатка разведена и нужно понимать, что под RTL нужна своя печатка.
Под RTL нужна своя печатка или режьте старую под ESP12. Совместимость есть только по выводам питания, CH_EN и LOG_UART.
Для UART0 задействуйте GC0-GC3 (mux 0).
Полная таблица есть в теме "IOports и pinmap RTL8710AF"
 

aloika

Active member
Обнаружил непонятные глюки в веб-свалке. Проявляется, когда к soft AP подключена винда, и дополнительно подключаю еще клиент на Андроид. Андроид не подключается, пишет про ошибку идентификации. Отключаю винду - Андроид подключается. Через несколько подключений/отключений андроида и винды в разных комбинациях модуль начинает писать в лог:

RTL8195A[Driver]: skb_unavailable=1 in last 2 seconds
RTL8195A[Driver]: skb_unavailable=2 in last 2 seconds

При этом оба девайса подключились, но веб-интерфейс не открывается ни на одном.
Буду дальше смотреть.

UPD: скачал свежую версию с sdk 4.0.1 - пока таких глюков не наблюдается.
 
Последнее редактирование:
Сверху Снизу