|
|
  |
Обновление прошивки через эзернет, Как сделать удобнее для пользователя, какой протокол? |
|
|
|
Aug 26 2015, 09:25
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Приветствую всех.
Делаю устройство, у которого основным каналом общения с пользователем будет эзернет. Не могу определиться, как лучше сделать обновление программы в нем. В устройстве есть еще 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) Для записи самой первой прошивки на карточку надо иметь считыватель. ******** Спасибо форуму. Пока формулировал это сообщение, хотелки стали понятны самому.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 26 2015, 09:36
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(Сергей Борщ @ Aug 26 2015, 12:25)  1) В процессе обновления нет обратной связи. Допустим, не понравился чем-то файл обновления загрузчику, а сказать чем именно не понравился ему некуда. Как вариант, писать на карту файл-лог.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Aug 26 2015, 10:02
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Сергей Борщ @ Aug 26 2015, 12:25)  загрузчик берет какой-то статический адрес по умолчанию, скажем 192.168.3.2 и я могу научить пользователя настроить свой комп для связи с этим адресом. Это самое экстремальное научить юзера IP адресам. У компьютеров могут быть самые дикие конфигурации сетевой маршрутизации и сетевых интерфейсов. Полагаться на какую-то стандартность сетевой конфигурации у клиента нельзя. Дивайс сразу должен работать по двум сценариям. Либо он сервер DHCP и сообщает свое имя в поле sname и юзер после втыкания провода идет по известному статичному имени дивайса на его HTTP сервер Либо дивайс сам принимает из сети свой IP адрес и по опции DHCP "Host Name Option" сообщает свое имя. Пересылка файлов по HTTP это тысяча способов. Но придется подучить JavaScript и фреймворки не нем. Но 48 К памяти очень мало. Надо хотя бы сотню.
|
|
|
|
|
Aug 26 2015, 10:28
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Сергей Борщ @ Aug 26 2015, 12:25)  Теперь чего хочу: Самое минималистичное - в устройстве 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 и всем, что сейчас здесь насоветуют  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 26 2015, 11:10
|

Гуру
     
Группа: Свой
Сообщений: 4 869
Регистрация: 28-02-08
Из: СПБ
Пользователь №: 35 463

|
QUOTE (zltigo @ Aug 26 2015, 13:28)  Самое минималистичное - в устройстве 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 без секюрнотости мало кому сегодня уже нужен, так поиграться только. Да и не локалка у него.
|
|
|
|
|
Aug 26 2015, 11:15
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Aner @ Aug 26 2015, 14:10)  TFTP без секюрнотости мало кому сегодня уже нужен, так поиграться только. Ой! Какой ужас! Все, 100500 битные ключи еще сейчас начем обсуждать. Вы бы хоть подумали, зачем это нужно при загрузке firmware, если его целостность (и почти наверняка шифрование) по любому должна обеспечиваться средствами загрузчика. QUOTE Да и не локалка у него. Причем тут к TFTP локалка, не локалка или кусок кабеля? Да и вообще при ПЕРВОНАЧАЛЬНОЙ заливке устройства речь о НЕ локалке ВООБЩЕ идти не может.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 26 2015, 11:33
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
не-не-не, не все так плохо. DHCP будет, но если у пользователя в сетке нет DHCP-сервера, то устройство сядет на статический адрес. И да, пользователь не совсем чайник, поменять один раз под чутким руководством IP-адрес компа и потом вернуть его взад сможет. А вот поднимать на устройстве DHCP-сервер желания нет. _pv, спасибо большое, почитаю. Похоже это то, что мне нужно. AlexandrY, у меня сейчас lwIP поднят на STM32F107, с DNS, DHCP, телнетом, USB (VCP), scmRTOS и кучей еще всего занимает 55 К. Думаю без всего лишнего в 48 уложусь. Ну в крайнем случае в 64. zltigo, TFTP я когда-то смотрел, но это опять же нужна какая-то программа-клиент, чего не хочется совсем. Ваш пример поиска явно не для WinXP. А есть ли она в XP? А если у пользователя Мак? Вот к гадалке не ходи - если у пользователя Мак, то мне придется искать ему эту программу, самому разбираться с ее установкой на Мак, которого я в глаза не видел и делать все остальные действия вместо того, чтобы заниматься чем-то действительно полезным. Потому что "а у меня ничего не работает, помогите!".
Да, и уточню - у меня именно локалка. Устройство будет втыкаться в домашнюю локалку или в примитивную локалку из устройства и одного-двух-трех компов. Эта локалка может не иметь выхода в инет.
Про DHCP и статический адрес - все попадавшиеся мне домашние роутеры при первом включении имеют статический адрес. Наверное есть какой-то глубокий смысл в том, что этот адрес именно статический. Хотя бы потому, что этот адрес точно известен.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|