Можно ли сделать обновление OTA, используя ссылку GitHub
Мне нужно иметь возможность загружать обновления программного обеспечения через Интернет, не подключая MKR1000 к сети. Либо это, либо новый код будет загружен с моего сервера (C++) на мой MKR1000, а затем перезагружен с новым кодом. Любая помощь полезна. Спасибо.
@Alex Boisvert, 👍0
Обсуждение1 ответ
Это возможно, если вы сможете написать свой собственный загрузчик, но это определенно будет непросто.
Обычный способ выполнения обновлений OTA заключается в использовании микросхемы с сегментируемой и переназначаемой флэш-памятью (например, ESP32, ESP8266, PIC32MZ и т. д.), когда ваш скетч запускается из одного сегмента, а новый код загружается из любой источник в другой сегмент. Затем он изменяет единственный флаг загрузки и сбрасывает MCU, а MCU сопоставляет второй сегмент с первым (переставляет два сегмента местами) и запускает новый код.
Это невозможно сделать с SAMD21, так как у него нет переназначаемых сегментов флэш-памяти.
Поэтому лучшее, на что вы можете надеяться, это перезагрузиться в пользовательский загрузчик, который затем подключается к Интернету, чтобы загрузить новый код для прошивки в основную часть флэш-памяти. И, конечно же, это заменит существующий загрузчик, и для его создания потребуется много работы.
Дополнение:
Очевидно, существует библиотека «WiFi101OTA», которая позволяет обновлять платы SAMD21 по беспроводной сети. По общему мнению, он получает новый код и сохраняет его где-то (фрагмент внутренней флэш-памяти, SD-карта и т. д.), а затем копирует эти данные в основную часть флэш-памяти с помощью функции, работающей из ОЗУ.
Хотя это звучит хорошо, я бы не рекомендовал использовать его в живом исполнении. Для разработки нормально, но не "в поле".
Это просто потому, что нет защиты от "замуровывания" юнита. Как только начнется копирование из хранилища на основную флэш-память, вы никогда не сможете вернуться назад. Если эта запись по какой-то причине не удалась (отключение питания, сбой скетча или любая из множества других непредсказуемых причин), устройство мертво. Вам придется вручную перепрограммировать устройство с помощью кабеля, чтобы вернуть его к жизни.
Поскольку программирование выполняется загрузчиком (между прочим, некоторые устройства, такие как платы на базе AVR, могут только записывать во флэш-память из загрузчика), код, выполняющий запись, никогда не перезаписывается, поэтому простой ручной сброс устройства может перезапустить программирование и восстановить плату.
Если бы вы приняли эту библиотеку, вам, конечно, пришлось бы модифицировать ее, чтобы «загружать» обновления, а не получать «выталкиваемые» обновления. Это должно быть тривиально, но потребуется некоторый уровень навыков сетевого программирования.
но библиотека WiFi101OTA это делает. с функцией в ОЗУ, которая копирует двоичный файл, хранящийся в верхней части флэш-памяти, в целевое место во флэш-памяти. и я расширил эту библиотеку до других сетевых библиотек и других MCU (nrf5, AVR) в библиотеке ArduinoOTA., @Juraj
@Juraj Я не знал о такой библиотеке. О, а как это работает с AVR, который может записывать во флэш-память только из сегмента загрузчика?, @Majenko
@Juraj Кроме того, этот метод небезопасен. Если вы начнете перезаписывать код, выполняющий программирование, и произойдет сбой или отключение питания, устройство заблокируется. С сегментами с двойной флэш-памятью этого никогда не произойдет, поскольку переключение сегментов происходит только после того, как будет проверено, что весь код написан. Вот почему вы хотите сделать это из загрузчика, а не из основного скетча, чтобы можно было восстановиться после сбоя при запуске обновления ota., @Majenko
не портит плату. загрузчик не меняется. в случае сбоя OTA возможна загрузка через USB. AVR ArduinoOTA нуждается в улучшенной Optiboot: https://github.com/jandrassy/ArduinoOTA#atmega-support, @Juraj
@Juraj «Bricked» означает, что вам нужно вручную повторно загрузить код через USB - то, что вы не хотите делать в полевых условиях. Я, конечно, никогда не хотел бы использовать такую вещь в живой системе. Все, что не использует двухсегментную флэш-память или загрузчик, который работает за вас, небезопасно в реальной среде. Развитие, хорошо. Живи, черт возьми!, @Majenko
Корзина сохраняется в верхней половине флэш-памяти и после успешной загрузки копируется в место выполнения. существует не так много причин, по которым копирование с флэш-памяти на флэш-память может завершиться ошибкой после ее запуска. но да, это уровень "ардуино", а не профессиональный уровень. Я использую его каждый день, и если у меня есть проблема, то это потому, что я внес изменение, которое не позволяет запускать скетч и сервер OTA. но мой М0 только внизу, @Juraj
- Проанализировать большой ответ json с помощью ESP8266
- Библиотека Arduino для выполнения http post запроса с аутентификацией носителя (bearer)
- Отправить только один пакет с одного ESP32 на другой ESP32 без подтверждения
- Несколько подключений WiFi клиент/сервер
- HTTPS-клиент с MKR1000
- Запрос POST (HTTPClient) с ESP8266, не работающим на локальном хосте (код http = -1)
- POST-запрос на Arduino MKR1400 GSM не работает
- Невозможно установить связь между модулем ESP-12E и мобильным устройством через маршрутизатор ESP-12E.
вы можете использовать объект InternalStorage библиотеки WiFi101OTA для хранения и применения загруженного двоичного файла, @Juraj
Ну, цель состоит в том, чтобы я мог иметь несколько MKR, разбросанных по провинции, и мне больше не нужно было их трогать, и иметь возможность обновлять их по мере необходимости, чтобы внутреннее хранилище не использовалось., @Alex Boisvert
он называется InternalStorage, потому что он сохраняет загруженный или загруженный двоичный файл в верхнюю половину флэш-памяти. после успешной загрузки вы вызываете apply(), и он копирует двоичный файл в место запуска и сбрасывает плату. новый скетч запущен, @Juraj