реклама на сайте
подробности

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


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
HardEgor
сообщение Aug 27 2015, 03:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Сергей Борщ @ Aug 26 2015, 15:25) *
2) Запуск процесса обновления чаще всего будет происходить из работающего приложения, но при отсутсвии приложения (после сбоя обновления или сразу после производства) точно такой же запуск должен быть возможен и средствами самого загрузчика. Из этого вытекает, что загрузчик должен содержать весь минимально необходимый функционал, т.е. быть способным показать пользователю веб-страницу обновления.

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

У вас два несовместимых пункта. Новую прошивку придется сохранять где-то(в памяти, на SD-карте), плюс лучше делать бэкап текущей, потому что если что-то пошло не так - например отключилось питание прошиваемого устройства, то вы получите "кирпич", а так есть вариант поднять bootloader'ом. Обычно кстати bootloader'ы работают по tftp, потому что он проще чем http.

Цитата(Сергей Борщ @ Aug 26 2015, 15:25) *
4) Я пока очень смутно представляю, как работают веб-морды. Хочу разделить процесс выбора файла и процесс его передачи, т.е. чтобы вот эту страницу выбора файла мог показывать как загрузчик, так и приложение(пункт 1 хотелок), а после выбора файла посылался бы какой-то сигнал серверу, соединение бы закрывалось, контроллер сбрасывался, попадал в загрузчик в режим обновления и уже загрузчик ждал бы нового соединения от браузера с передачей собственно содержимого файла.

Посмотрите как это сделано во всяких wi-fi роутерах. Вписан фиксированный адрес типа 192.168.0.1 и все нормально на него настраиваются и подключают.
Саму страничку, которую контроллер будет отдавать броузеру для обновления можно взять там-же и её можно существенно упростить если выкинуть все красивости.
Вам надо почитать как работает протокол http, тогда отпадут многие вопросы. По-простому, броузер посылается http-серверу ASCII команды, в ответ получает поток данных(содержащих html-страницы). Командами GET или POST броузер может сказать http-серверу что он отправляет бинарные данные. Как понимаете, контроллеру потребуется иметь собственный http-сервер, но можно самому написать simple-httpd, которые выполняет две-три команды протокола http, больше и не потребуется. Он-же и выдаст клиенту возникающие ошибки, но, чем сложнее интерфейс с пользователем - тем сложнее будет сервер.

Есть два момента определяющие сложность загрузчика через Ethernet - будет-ли необходима защита, т.е. будет ли обновление производится через общедоступные сети или это будет локальная сеть.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 27 2015, 07:11
Сообщение #3


Гуру
******

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



Цитата(HardEgor @ Aug 27 2015, 06:24) *
У вас два несовместимых пункта. Новую прошивку придется сохранять где-то(в памяти, на SD-карте), плюс лучше делать бэкап текущей, потому что если что-то пошло не так - например отключилось питание прошиваемого устройства, то вы получите "кирпич", а так есть вариант поднять bootloader'ом.
Нет, я не получу кирпич. После таймаута произодет перезагрузка, загрузчик обнаружит порушенное приложение и будет сам показывать ту страницу с полем выбора файла образа прошивки. Сохранять предыдущую прошивку по этой причине мне тоже не нужно. Так что эти пункты прекрасно совместимы.

Цитата(HardEgor @ Aug 27 2015, 06:24) *
Обычно кстати bootloader'ы работают по tftp, потому что он проще чем http.
Сложность в разумных пределах меня не пугает. scmRTOS+lwIP+DHCP вчера заняли 33 К, нашел очень компактный HTTP-парсер, есть надежда уложиться в 48 К.

Цитата(HardEgor @ Aug 27 2015, 06:24) *
Посмотрите как это сделано во всяких wi-fi роутерах. Вписан фиксированный адрес типа 192.168.0.1 и все нормально на него настраиваются и подключают.
Вот я тоже не понимаю, почему вопрос настройки сетевого адреса вызвал такое обсуждение. Я тут не вижу никакой проблемы. Приложение сохраняет сетевые настройки во флеше. Загрузчик их берет оттуда, т.е. загрузчик работает на тех настройках, которые были у приложения. Если настроек там нет, то приложение еще не запускалось и загрузчик висит на прибитом гвоздями фиксированном адресе. Подключение к нему не сложнее подклюения к свежекупленному домашнему маршрутизатору. Любого пользователя можно отослать к инструкции от любого маршрутизатора. Все, на этом вопрос сетевых настроек предлагаю свернуть.

Цитата(HardEgor @ Aug 27 2015, 06:24) *
Саму страничку, которую контроллер будет отдавать броузеру для обновления можно взять там-же и её можно существенно упростить если выкинуть все красивости.
Разумеется, я же так ее и описал: строка текста, поле ввода имени файла и кнопка "обновить". _pv в третьем сообщении темы дал хорошую ссылку.

Цитата(HardEgor @ Aug 27 2015, 06:24) *
Как понимаете, контроллеру потребуется иметь собственный http-сервер, но можно самому написать simple-httpd, которые выполняет две-три команды протокола http, больше и не потребуется. Он-же и выдаст клиенту возникающие ошибки, но, чем сложнее интерфейс с пользователем - тем сложнее будет сервер.
Да, вот этим путем я и двигаюсь. На данный момент у меня вопрос вот о чем: пользователь нажал кнопку "обновить". Можно ли сделать так, чтобы по этой кнопке броузер отправлял одно сообщение типа "пааехали", закрывал соединение, а следом в отдельном сообщении и уже новом соединении посылал данные из файла? Для чего мне это нужно: по первому сообщению моя железка перезагрузится и войдет в режим обновления, т.е. в режим, в котором она с определенным таймаутом (скажем, 3 секунды) ожидает нового соединения с данными образа прошивки. Этот момент перезагрузки у меня отделяет собственно обновление от предыдущей работы. После него мне совершенно не важно, кто показывал пользователю страничку с выбором файла - приложение или загрузчик (при отсутсвии приложения). То есть фактически мы имеем три отдельные программы:
1) загрузчик, который умеет только принять файл и на лету из него обновить приложение.
2) приложение, которое кроме основной работы умеет по команде от пользователя запустить загрузчик.
3) минимальное приложение, которое живет в области загрузчика и умеет только проверить целостность приложения и если оно не целое, то по команде от пользователя запустить загрузчик.
Такая схема у меня используется во всех проектах и показала свою неубиваемость. Переход на программу 1 у меня происходит по программному сбросу. Это позволяет начать жизнь с чистого листа и в процессе загрузки не зависеть от настроек периферии, которые могло сделать приложение.

Цитата(HardEgor @ Aug 27 2015, 06:24) *
Есть два момента определяющие сложность загрузчика через Ethernet - будет-ли необходима защита, т.е. будет ли обновление производится через общедоступные сети или это будет локальная сеть.
Это будет локальная сеть. Проект открытый, защита от чтения прошивки не нужна. Если в следующих проектах потребуется защита, добавлю AES-шифрование из предыдущих проектов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 27 2015, 07:43
Сообщение #4


Ally
******

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



Цитата(Сергей Борщ @ Aug 27 2015, 10:11) *
Подключение к нему не сложнее подклюения к свежекупленному домашнему маршрутизатору. Любого пользователя можно отослать к инструкции от любого маршрутизатора.



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




Цитата(Quasar @ Aug 27 2015, 09:33) *
На IOS не работает! Сафари умеет грузить только картинки! Юзер останется недоволен smile3046.gif [/off]


О, а у вас уже проблемы.

Невозможность аплодить произвольные файлы из мобильного Safari знает весь интернет.
Он же знает как это обойти.
Такую мелочь по сравнению с вашей явой могли бы и не упоминать.
Go to the top of the page
 
+Quote Post
Quasar
сообщение Aug 27 2015, 08:47
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(AlexandrY @ Aug 27 2015, 10:43) *
О, а у вас уже проблемы.

Невозможность аплодить произвольные файлы из мобильного Safari знает весь интернет.
Он же знает как это обойти.
Такую мелочь по сравнению с вашей явой могли бы и не упоминать.


То есть начали с того, что пользователь не может IP поменять, а теперь домохозяйка, решившая обновить вашу железку, должна решать вопрос с Safari? Или ставить другой браузер? Или делать джеил? Или переходить на андроид? Вы очень последовательны и логичны в рассуждениях.

Ладно, я понял, что вы не знакомы с технологией Java (раз спрашиваете о перекомпиляции), и будете как и древние люди, доказывать, что все это черти, бесы и от лукавого. Но по-моему, это не является предметом данного треда.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 27 2015, 10:31
Сообщение #6


Ally
******

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



Цитата(Quasar @ Aug 27 2015, 11:47) *
То есть начали с того, что пользователь не может IP поменять, а теперь домохозяйка, решившая обновить вашу железку, должна решать вопрос с Safari? Или ставить другой браузер? Или делать джеил? Или переходить на андроид? Вы очень последовательны и логичны в рассуждениях.

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


Да я тут было потянулся к гугле чтобы узнать что такое ява, но подумал что наверно ничего интересного не увижу.
Потому как если бы действительно существовало кроссплатформенные средство разработки я бы давно на нем программировал. biggrin.gif
Go to the top of the page
 
+Quote Post
Quasar
сообщение Aug 27 2015, 11:11
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(AlexandrY @ Aug 27 2015, 13:31) *
Потому как если бы действительно существовало кроссплатформенные средство разработки я бы давно на нем программировал. biggrin.gif


Ну да, вы даже не поняли, что Java это не средство разработки.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 27 2015, 11:21
Сообщение #8


Ally
******

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



Цитата(Quasar @ Aug 27 2015, 14:11) *
Ну да, вы даже не поняли, что Java это не средство разработки.

Это уже не важно, как я понял ява тут вообще никого не возбудила.

А вот постоянные TCP соединения кроме самого HTTP на Web странице можно создавать как раз с помощью WebSocket.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Сергей Борщ   Обновление прошивки через эзернет   Aug 26 2015, 09:25
- - Lotor   Цитата(Сергей Борщ @ Aug 26 2015, 12:25) ...   Aug 26 2015, 09:36
- - _pv   ни разу не знаток html но страничка с кнопкой доба...   Aug 26 2015, 09:53
- - AlexandrY   Цитата(Сергей Борщ @ Aug 26 2015, 12:25) ...   Aug 26 2015, 10:02
|- - zltigo   QUOTE (AlexandrY @ Aug 26 2015, 13:02) Эт...   Aug 26 2015, 10:39
|- - AlexandrY   Цитата(zltigo @ Aug 26 2015, 13:39) Незач...   Aug 26 2015, 10:43
|- - zltigo   QUOTE (AlexandrY @ Aug 26 2015, 13:43) Ис...   Aug 26 2015, 11:00
|- - AlexandrY   Цитата(zltigo @ Aug 26 2015, 14:00) Не сп...   Aug 26 2015, 11:05
- - SSerge   У ST есть пара примеров в обычном для них стиле: L...   Aug 26 2015, 10:16
- - Aner   48 К памяти хватит, ... сделано, работает. Проблем...   Aug 26 2015, 10:25
|- - AlexandrY   Цитата(Aner @ Aug 26 2015, 13:25) 48 К па...   Aug 26 2015, 10:35
- - zltigo   QUOTE (Сергей Борщ @ Aug 26 2015, 12:25) ...   Aug 26 2015, 10:28
|- - Aner   QUOTE (zltigo @ Aug 26 2015, 13:28) Самое...   Aug 26 2015, 11:10
|- - zltigo   QUOTE (Aner @ Aug 26 2015, 14:10) TFTP бе...   Aug 26 2015, 11:15
- - Сергей Борщ   не-не-не, не все так плохо. DHCP будет, но если у ...   Aug 26 2015, 11:33
|- - zltigo   QUOTE (Сергей Борщ @ Aug 26 2015, 14:27) ...   Aug 26 2015, 11:42
|- - AlexandrY   Цитата(Сергей Борщ @ Aug 26 2015, 14:27) ...   Aug 26 2015, 11:42
||- - zltigo   QUOTE (AlexandrY @ Aug 26 2015, 14:42) До...   Aug 26 2015, 12:01
|- - zltigo   QUOTE (Сергей Борщ @ Aug 26 2015, 14:33) ...   Aug 26 2015, 11:50
|- - AlexandrY   По нынешним временам проще Wi-Fi использовать. Уви...   Aug 26 2015, 11:59
- - _pv   я так понимаю основная проблема со статическим адр...   Aug 26 2015, 13:15
|- - zltigo   QUOTE (_pv @ Aug 26 2015, 16:15) но это в...   Aug 26 2015, 16:00
|- - _pv   Цитата(zltigo @ Aug 26 2015, 23:00) Отроу...   Aug 26 2015, 19:59
|- - zltigo   QUOTE (_pv @ Aug 26 2015, 22:59) и роутит...   Aug 26 2015, 20:10
|- - _pv   Цитата(zltigo @ Aug 27 2015, 03:10) Тольк...   Aug 27 2015, 07:14
|- - zltigo   QUOTE (_pv @ Aug 27 2015, 10:14) есть жел...   Aug 27 2015, 08:46
|- - Сергей Борщ   Цитата(zltigo @ Aug 27 2015, 11:46) А вот...   Aug 27 2015, 09:43
|- - zltigo   QUOTE (Сергей Борщ @ Aug 27 2015, 12:43) ...   Aug 27 2015, 09:57
|- - _Pasha   Цитата(Сергей Борщ @ Aug 27 2015, 12:43) ...   Oct 21 2015, 12:18
|- - Сергей Борщ   Цитата(_Pasha @ Oct 21 2015, 15:18) Белый...   Oct 21 2015, 12:23
- - Quasar   Что-то вы тут все усложняете со своими IP адресами...   Aug 26 2015, 18:07
|- - zltigo   QUOTE (Quasar @ Aug 26 2015, 21:07) Что-т...   Aug 26 2015, 18:42
||- - Quasar   Цитата(zltigo @ Aug 26 2015, 21:42) Что-т...   Aug 26 2015, 20:26
||- - zltigo   QUOTE (Quasar @ Aug 26 2015, 23:26) Поэто...   Aug 26 2015, 20:40
|- - AlexandrY   Цитата(Quasar @ Aug 26 2015, 21:07) Поско...   Aug 27 2015, 04:37
|- - Quasar   Цитата(AlexandrY @ Aug 27 2015, 07:37) Да...   Aug 27 2015, 05:37
|- - AlexandrY   Цитата(Quasar @ Aug 27 2015, 08:37) Но эт...   Aug 27 2015, 05:59
||- - zltigo   QUOTE (AlexandrY @ Aug 27 2015, 08:59) Ко...   Aug 27 2015, 06:14
||- - Quasar   Цитата(AlexandrY @ Aug 27 2015, 08:59) А,...   Aug 27 2015, 06:33
|- - Aner   QUOTE (Quasar @ Aug 27 2015, 08:37) ... н...   Aug 27 2015, 07:17
||- - Quasar   Цитата(AlexandrY @ Aug 27 2015, 14:21) Эт...   Aug 27 2015, 11:51
||- - zltigo   QUOTE (AlexandrY @ Aug 27 2015, 14:21) Эт...   Aug 27 2015, 12:12
|- - HardEgor   Цитата(Сергей Борщ @ Aug 27 2015, 13:11) ...   Aug 27 2015, 10:42
|- - A. Fig Lee   Цитата(Сергей Борщ @ Aug 27 2015, 03:11) ...   Aug 27 2015, 12:38
- - Mahagam   делал подобное. только у меня лимит был в 64к кажи...   Aug 27 2015, 11:19
- - Quasar   Цитата(Сергей Борщ @ Aug 26 2015, 12:25) ...   Aug 27 2015, 13:01
|- - AlexandrY   Кста, только что сделал Telnet по WiFi вот для это...   Aug 27 2015, 14:05
|- - zltigo   QUOTE (AlexandrY @ Aug 27 2015, 17:05) Во...   Aug 27 2015, 14:22
- - _Pasha   Сервер обновлений с белым ip На нем присутствует д...   Oct 21 2015, 13:22
- - AlexandrY   Цитата(_Pasha @ Oct 21 2015, 16:22) Серве...   Oct 21 2015, 13:59
|- - _Pasha   Цитата(AlexandrY @ Oct 21 2015, 16:59) У....   Oct 21 2015, 14:03
- - Quasar   Цитата(_Pasha @ Oct 21 2015, 16:22) Поско...   Oct 25 2015, 21:23


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 18:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016