Jump to content

    

Обновление прошивки через эзернет

Приветствую всех.

 

Делаю устройство, у которого основным каналом общения с пользователем будет эзернет. Не могу определиться, как лучше сделать обновление программы в нем. В устройстве есть еще RS-485, CAN, можно даже подцепиться к UART, но подключение компа к этим интерфейсам для обновления прошивки требует каких-то специальных переходников. В моем же случае устройство берет в руки обычный пользователь, у которого никаких переходников нет да и вообще не хотелось бы для обновления делать какие-то дополнительные подключения. Считаем, что устройство установлено в месте, доступ к которому затруднен.

В предельном случае пользователь берет в руки устройство, в котором прошит только загрузчик, т.е. приложение в процессе обновления может и не участвовать (чуть ниже распишу). Оно может сохранить где-то свои сетевые настройки, при отсутствии которых загрузчик берет какой-то статический адрес по умолчанию, скажем 192.168.3.2 и я могу научить пользователя настроить свой комп для связи с этим адресом. А что дальше? Как красивее и удобнее организовать сам процесс обновления? Я делал множество устройств с обновлением через UART, RS-485 и USB (VCP), там у меня все давно отработано, но мне никогда не приходилось до этого делать обновления по эзернету. Вся имеющаяся у меня информация об обновлении через эзернет - это слухи с форумов. Поэтому надеюсь, что более опытные в этом вопросе коллеги направят меня в сторону нужного решения.

 

Начну с того, чего я не хочу:

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

2) я не хочу, чтобы пользователю для обновления нужно было на свой компьютер устанавливать какой-то дополнительный сервер или программу-клиента, потому что неизвестно, какая ОС стоит у пользователя и найдется ли бесплатная программа под эту ОС. Тем более не хотелось бы писать никакую программу для компьютерной стороны. У всех есть браузер и хотелось бы ограничиться его возможностями.

 

Теперь чего хочу:

1) все это должно уместиться в первые сектора STM32F4xx, максимум 48К, поэтому полноценный сайт с апачем или полноценный ФТП-сервер развернуть там не удастся. Хотелось бы, чтобы пользователь попадал на страничку "бла-бла-бла, текущая версия такая-то, нажмите эту кнопку, чтобы выбрать у себя на компе файл обновления", а дальше как тут на форуме при прикреплении файлов к сообщению.

 

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

 

3) Чтобы прошивка происходила в процессе передачи файла, то есть чтобы пользователь имел обратную связь и наблюдал на экране какую-то полосу с процентами. Поэтому не хочу, чтобы прошивка сначала сохранялась где-то, а потом загрузчик молча переписывал ее собствено в память контроллера.

 

4) Я пока очень смутно представляю, как работают веб-морды. Хочу разделить процесс выбора файла и процесс его передачи, т.е. чтобы вот эту страницу выбора файла мог показывать как загрузчик, так и приложение(пункт 1 хотелок), а после выбора файла посылался бы какой-то сигнал серверу, соединение бы закрывалось, контроллер сбрасывался, попадал в загрузчик в режим обновления и уже загрузчик ждал бы нового соединения от браузера с передачей собственно содержимого файла.

 

Вот такие вот у меня мысли. Странного ли я хочу? Какие еще варианты обновления вы встречали и находили удобными (мне очень хочется, чтобы процесс обновления был удобным). Что еще посоветуете, что раскритикуете?

 

*********

На борту есть еще SD-карта. Можно было бы создать в ней отдельную директорию, в которую пользователь клал бы свежую прошивку. Класть можно как на компе со считываетем SD-карт, так и через веб-морду в основном приложении. И загрузчик вынимал бы версию прошивки из имен файлов в этой папке, находил самую свежую, сравнивал с текущей и при несовпадении переписывал бы приложение из этого файла. Откат на предыдущую версию сводится к удалению файла самой последней версии и перезагрузке.

 

Вроде все выглядит достаточно красиво и этот вариант был бы, наверное, гораздо проще в реализации, но мне он не нравится по следующим причинам:

1) В процессе обновления нет обратной связи. Допустим, не понравился чем-то файл обновления загрузчику, а сказать чем именно не понравился ему некуда.

2) Для записи самой первой прошивки на карточку надо иметь считыватель.

 

********

Спасибо форуму. Пока формулировал это сообщение, хотелки стали понятны самому.

Share this post


Link to post
Share on other sites
1) В процессе обновления нет обратной связи. Допустим, не понравился чем-то файл обновления загрузчику, а сказать чем именно не понравился ему некуда.

Как вариант, писать на карту файл-лог.

 

Share this post


Link to post
Share on other sites

ни разу не знаток html

но страничка с кнопкой добавить файл и отправка этого файла вроде как пару строчек всего.

https://www.cs.tut.fi/~jkorpela/forms/file.html

опять же для отображения прогресса на МК сделать отдельный файл который доступен через http и содержит текущий статус ругань если не получилось,

и отдать простенький яваскрипт который будет периодические в этот файл лазить и отображать в браузере прогресс бар тоже еще несколько строчек и без всяких наворотов с серверной (МК) стороны.

Share this post


Link to post
Share on other sites
загрузчик берет какой-то статический адрес по умолчанию, скажем 192.168.3.2 и я могу научить пользователя настроить свой комп для связи с этим адресом.

 

Это самое экстремальное научить юзера IP адресам.

У компьютеров могут быть самые дикие конфигурации сетевой маршрутизации и сетевых интерфейсов.

Полагаться на какую-то стандартность сетевой конфигурации у клиента нельзя.

 

Дивайс сразу должен работать по двум сценариям.

Либо он сервер DHCP и сообщает свое имя в поле sname и юзер после втыкания провода идет по известному статичному имени дивайса на его HTTP сервер

Либо дивайс сам принимает из сети свой IP адрес и по опции DHCP "Host Name Option" сообщает свое имя.

 

Пересылка файлов по HTTP это тысяча способов. Но придется подучить JavaScript и фреймворки не нем.

 

Но 48 К памяти очень мало. Надо хотя бы сотню.

Share this post


Link to post
Share on other sites

48 К памяти хватит, ... сделано, работает. Проблема неоговорённая: что будет если будет подвисание проца, сбой по сети, обрыв питания, и тп. во время абдейта. Откат назад должен быть гарантирован. DHCP да, порты тоже нужно будет выделять для доступа во внутреннюю сетку.

Share this post


Link to post
Share on other sites
Теперь чего хочу:

Самое минималистичное - в устройстве TFTP сервер - это буквально считанные байты над UDP.

https://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol

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

Control Panel -> Programs and Features -> Turn Windows features On -> Client TFTP

Проще нереально, если ставить задачу не писать приложение для PC. Если писать, то тогда все можно сделать проще, в том числе, если в локальной сети, то пофиг IP адреса вместе с DHCP, HTTP и всем, что сейчас здесь насоветуют :).

 

Share this post


Link to post
Share on other sites
Это самое экстремальное научить юзера IP адресам.

Незачем его учить - netsh и скрипты еще никто не отменял.

 

Share this post


Link to post
Share on other sites
Незачем его учить - netsh и скрипты еще никто не отменял.

 

netsh то чем поможет?

Исходим из того, что юзер не согласится менять сетевые настройки своего компа ради прошивки дивайса.

А то вам придется стать персональным администратором компа вашего юзера.

Share this post


Link to post
Share on other sites
Исходим из того, что юзер не согласится менять сетевые настройки своего компа ради прошивки дивайса.

Не спрашивать его чего-то делать и уж тем более не рассказывать ему о сетевых настройках и хочет-ли он их менять. Изменить и вернуть самостоятельно. Для этой операции скрипт прилагаемый в комплект к ПЕРВОНАЧАЛЬНО прошиваемому firmware.

Share this post


Link to post
Share on other sites
Не спрашивать его чего-то делать и уж тем более не рассказывать ему о сетевых настройках и хочет-ли он их менять. Изменить и вернуть самостоятельно. Для этой операции скрипт.

 

А как именно, телекинезом или телепатией? :biggrin:

 

 

Share this post


Link to post
Share on other sites
Самое минималистичное - в устройстве TFTP сервер - это буквально считанные байты над UDP.

https://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol

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

Control Panel -> Programs and Features -> Turn Windows features On -> Client TFTP

Проще нереально, если ставить задачу не писать приложение для PC. Если писать, то тогда все можно сделать проще, в том числе, если в локальной сети, то пофиг IP адреса вместе с DHCP, HTTP и всем, что сейчас здесь насоветуют :).

TFTP без секюрнотости мало кому сегодня уже нужен, так поиграться только. Да и не локалка у него.

Share this post


Link to post
Share on other sites
TFTP без секюрнотости мало кому сегодня уже нужен, так поиграться только.

Ой! Какой ужас! Все, 100500 битные ключи еще сейчас начем обсуждать. Вы бы хоть подумали, зачем это нужно при загрузке firmware, если его целостность (и почти наверняка шифрование) по любому должна обеспечиваться средствами загрузчика.

Да и не локалка у него.

Причем тут к TFTP локалка, не локалка или кусок кабеля?

Да и вообще при ПЕРВОНАЧАЛЬНОЙ заливке устройства речь о НЕ локалке ВООБЩЕ идти не может.

Share this post


Link to post
Share on other sites

не-не-не, не все так плохо. DHCP будет, но если у пользователя в сетке нет DHCP-сервера, то устройство сядет на статический адрес. И да, пользователь не совсем чайник, поменять один раз под чутким руководством IP-адрес компа и потом вернуть его взад сможет. А вот поднимать на устройстве DHCP-сервер желания нет.

_pv, спасибо большое, почитаю. Похоже это то, что мне нужно.

AlexandrY, у меня сейчас lwIP поднят на STM32F107, с DNS, DHCP, телнетом, USB (VCP), scmRTOS и кучей еще всего занимает 55 К. Думаю без всего лишнего в 48 уложусь. Ну в крайнем случае в 64.

zltigo, TFTP я когда-то смотрел, но это опять же нужна какая-то программа-клиент, чего не хочется совсем. Ваш пример поиска явно не для WinXP. А есть ли она в XP? А если у пользователя Мак? Вот к гадалке не ходи - если у пользователя Мак, то мне придется искать ему эту программу, самому разбираться с ее установкой на Мак, которого я в глаза не видел и делать все остальные действия вместо того, чтобы заниматься чем-то действительно полезным. Потому что "а у меня ничего не работает, помогите!".

 

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this