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

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

|
QUOTE (AlexandrY @ Aug 27 2015, 14:21)  Это уже не важно, как я понял ява тут вообще никого не возбудила. Это совершенно не аргумент. Большинство поступают "как все" - а нехай пользователь лезет и меняет IP я не буду об этом парится, а в устройство запихну, тоже "как все" чего-нибудь потолще, типа линукса и опять не буду париться. P.S. Я чего это у Вас в подписи уже давным давно дохлая ссылка висит?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 27 2015, 12:38
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(Сергей Борщ @ Aug 27 2015, 03:11)  Да, вот этим путем я и двигаюсь. На данный момент у меня вопрос вот о чем: пользователь нажал кнопку "обновить". Можно ли сделать так, чтобы по этой кнопке броузер отправлял одно сообщение типа "пааехали", закрывал соединение, а следом в отдельном сообщении и уже новом соединении посылал данные из файла? Для чего мне это нужно: по первому сообщению моя железка перезагрузится и войдет в режим обновления, т.е. в режим, в котором она с определенным таймаутом (скажем, 3 секунды) ожидает нового соединения с данными образа прошивки. Этот момент перезагрузки у меня отделяет собственно обновление от предыдущей работы. После него мне совершенно не важно, кто показывал пользователю страничку с выбором файла - приложение или загрузчик (при отсутсвии приложения). То есть фактически мы имеем три отдельные программы: 1) загрузчик, который умеет только принять файл и на лету из него обновить приложение. 2) приложение, которое кроме основной работы умеет по команде от пользователя запустить загрузчик. 3) минимальное приложение, которое живет в области загрузчика и умеет только проверить целостность приложения и если оно не целое, то по команде от пользователя запустить загрузчик. Такая схема у меня используется во всех проектах и показала свою неубиваемость. Переход на программу 1 у меня происходит по программному сбросу. Это позволяет начать жизнь с чистого листа и в процессе загрузки не зависеть от настроек периферии, которые могло сделать приложение. Да, заметно, что Вы и здесь это пытаетесь применить. Можно, наверное. Вам придется возится с javascript-ом, который само собой сожрет килобайты. Или писать все самому или пользовать какой нибудь dojo 27 килобайт и тоже часть писать самому. События по нажатию на кнопку итиси. Я бы сделал аплоад там же в загрузчике. Я вон перехожу после аплоад простым jump и ничего. Ну проверить регистры после джампа, убедится что все чисто, принудительно сбросить. В принципе вся периферия должна перед инициализацией проходить процесс деинициализации. Кстати, "моя" схема тоже используется в нескольких проектах и тоже показала свою неубиваемость. Цитата(AlexandrY @ Aug 27 2015, 01:59)  А, появилась неуверенность в голосе. Признайтесь, тестировали вы это на паре тройке платформ и то кое как. С java кросс платформенностью гораздо меньше возни чем с разными браузерами. Не помню, чтоб гдето у java было чтото не кроссплатформенное
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Aug 27 2015, 13:01
|

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

|
Цитата(Сергей Борщ @ Aug 26 2015, 12:25)  На борту есть еще SD-карта. Можно было бы создать в ней отдельную директорию, в которую пользователь клал бы свежую прошивку. Класть можно как на компе со считываетем SD-карт, так и через веб-морду в основном приложении. И загрузчик вынимал бы версию прошивки из имен файлов в этой папке, находил самую свежую, сравнивал с текущей и при несовпадении переписывал бы приложение из этого файла. Откат на предыдущую версию сводится к удалению файла самой последней версии и перезагрузке. По-моему это самый логичный вариант. Веб-морда и все скрипты лежат в основном приложении, не сжирается место в загрузчике, не усложняется процесс обновления переустановкой соединения. На неустойчивой сети это может вызвать проблемы. Если бы у меня была SD карта, я бы сделал так: 1) Страничка загрузки лежит в основной прошивке; 2) С её помощью пользователь загружает фаил прошивки на SD карту, основная прошивка проверяет целостность и если все ok, прыгает в бутлоадер; 3) Бутлоадер, обнаружив новое ПО на карте, начинает его прошивать (расшифровывать и прошивать?), после чего передает прошитому ПО управление, можно еще где-нибудь в ОЗУ оставить флаг статуса последнего обновления, для того, что бы пользователь в веб-морде увидел, что все ok (или не ok); 4) Пока все это происходит, на веб-странице горит прогресс бар (просто таймер на примерное время обновления), после того, как таймер истекает, JavaScript начинает пытаться обновлять страницу, дабы узнать статус.
|
|
|
|
|
Aug 27 2015, 14:05
|

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

|
Кста, только что сделал Telnet по WiFi вот для этой платы - http://geektimes.ru/post/260720/И сделал Telnet драйвером вместо RS232 для терминала в дивайсе. Мои дивайсы издавно программируются по Y-modem через RS232. Реперь же дивайс через CC3100 подключается в Wi-Fi локалку , а если ее нет становится AP и в обоих случаях открывает порт Telnet. Получая данные по telnet выдает их в задачу терминала вместо RS232. Открываю программу эмулятора терминала на PC типа TeraTerm и по Telnet старым добрым способом гружу апдейты. Вот это простота! На микроконтроллере только протокол SimpleLink (портированный на MQX) да пару строчек негоциации telnet.
|
|
|
|
|
Aug 27 2015, 14:22
|

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

|
QUOTE (AlexandrY @ Aug 27 2015, 17:05)  Вот это простота! "Простота" более, чем условная. Сначала добавим цельный Wi-Fi модуль со всем своим стеком, а потом "просто" зайдем телнетом. Нет, я понимаю, что дело идет к тому, что для помигать светодиодом надо просто взять контроллер с линуксом, ну или совсем по минимуму, Java на борту и все, но все-же не надо глупости нести, что все просто. Ну а действительно простому решению - наличию у устройства подключения терминала по RS232 для программирования и отладки, нималейших претензий нет - сам так делаю уже десятки лет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 21 2015, 13:22
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Сервер обновлений с белым ip На нем присутствует демон, udp сокет слушает обращения с любого ip отправителя на фикс. порт, т.е. bind("0.0.0.0",UDP_PORT) Отвечает тоже по фикс. порту и принятому адресу.
Клиенты имеют "серый" адрес за NATом. Поскольку NAT искажает номера портов, клиенту приходится слушать все входящие пакеты на любой порт. В пакете первым находится magic number(32 бита) плюс некоторые внутренние зависимости, скажем - поле команды имеет несколько предопределенных значений. Отвечать на входящие не нужно, т.к. это UDP - железный клиент просто игнорирует то, что не является программирующим пакетом. По приему программирующего пакета можно организовать минимальную поддержку сеанса - запомнить порт и по таймауту чтобы он обнулялся, снова открывая для прослушки все пакеты.
Дальше пакеты содержат команды - принять буфер данных (512 байт) по такому-то адресу и старт обновления. Клент отвечает что мол принял по такому то адресу с таким-то CRC И что ушел в ребут с обновлением.
Нет ответа - идет повтор. Сервер по таймауту иключает адрес из очереди и делает в своей базе пометку, на чем собсна остановились.
На клиенте: Код складывается в неиспользованную половину флеша, по старту обновления код работает в ОЗУ и пишет. Далбнейшие варианты обезопасить процесс - делать своп и оставлять какую-то фиксированную часть под бут. Чтобы он не мог самоубиться.
ЗЫ. Железо в базе различается по мак-адресу.
Сообщение отредактировал _Pasha - Oct 21 2015, 13:25
|
|
|
|
|
Oct 21 2015, 13:59
|

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

|
Цитата(_Pasha @ Oct 21 2015, 16:22)  Сервер обновлений с белым ip На нем присутствует демон, udp сокет слушает обращения с любого ip отправителя на фикс. порт, т.е. bind("0.0.0.0",UDP_PORT) Отвечает тоже по фикс. порту и принятому адресу. ... У..., как все замудренно. Вона недавно сделал обмен данными с дивайсами через месенджер Google Hangouts. Вот это реальное удобство. Ни где сервер, ни какой он, ни где дивайсы голова не болит.
|
|
|
|
|
Oct 25 2015, 21:23
|

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

|
Цитата(_Pasha @ Oct 21 2015, 16:22)  Поскольку NAT искажает номера портов, клиенту приходится слушать все входящие пакеты на любой порт. Ой. Вы хотите сказать, что клиенты, находящиеся за NAT'ом, ВСЕГДА слушают ЛЮБОЙ порт? Цитата(Сергей Борщ @ Aug 27 2015, 12:43)  Кому как. Мне проще сделать "как у всех", чем искать или писать и поддерживать еще какую-то хитрую утилиту. Причем обычный пользователь будет видеть это именно как "сделано черз Ж", потому что "не как у всех". Утилиты есть у многих вендоров, у Apple - AirPort, у D-LINK для их свитчей есть какая-то там утилита и т.д,. Это всего лишь вопрос выбранного пути. "Как у всех" или "не как у всех", тут не причем.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|