Оглавление:

Настройка сервера автоматического обновления ESP8266: 7 шагов
Настройка сервера автоматического обновления ESP8266: 7 шагов

Видео: Настройка сервера автоматического обновления ESP8266: 7 шагов

Видео: Настройка сервера автоматического обновления ESP8266: 7 шагов
Видео: ESP8266 - загрузка прошивки с сервера в Интернет. 2024, Ноябрь
Anonim
Настройка сервера автоматического обновления ESP8266
Настройка сервера автоматического обновления ESP8266

Многие люди сейчас используют ESP8266 во многих его проявлениях (ESP-01S, Wemos D1, NodeMCU, Sonoff и т. Д.) Для систем домашней автоматизации. Если вы напишете свой собственный код (как я), обновление каждого из них по отдельности даже через OTA (по воздуху) станет немного утомительным.

Моя собственная система, например, имеет 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic, 12x Sonoff S20, 2x Sonoff SV и NodeMCU, которые имеют общую кодовую базу, так что всего 33 устройства для обновления, когда я создаю простой код. изменение.

Но есть более простой способ: «сервер обновлений». Отличное ядро Arduino IDE + ESP8266 имеет библиотеку для выполнения большей части работы (ESP8266httpUpdate), но вам нужно знать, как настроить свой собственный сервер, чтобы он работал.

В этом руководстве показано, как использовать сервер NODE-RED, но та же логика применима к любой серверной технологии по вашему выбору, например. Apache + PHP и т. Д.

Шаг 1. Что вам нужно

  1. IDE Arduino
  2. ESP8266 ядро
  3. Любая плата разработчика ESP8266 с 1 МБ или более флэш-ОЗУ.
  4. Веб-сервер (подойдет даже скромный Raspberry Pi - это то, что я использую)
  5. (необязательно) инструмент mkspiffs, если вы хотите автоматически обновить образ файловой системы SPIFFS

Шаг 2: Создайте репозиторий для хранения двоичных прошивок

Создайте репозиторий для хранения двоичных прошивок
Создайте репозиторий для хранения двоичных прошивок

На моем сервере есть папка с именем / home / pi / trucFirmware, в которой хранятся различные прошивки устройств и образы SPIFFS.

Я поддерживаю отдельный двоичный файл для каждого типа оборудования (из одного исходного файла с несколькими #defines), и когда новый выпуск будет готов, я использую команду меню Arduino IDE «Эскиз / Экспорт скомпилированного двоичного файла» для каждого целевого устройства. Обратите внимание, что даже Хотя существует 5 различных типов оборудования, есть только два двоичных файла SPIFFS: версия 1M и версия 4M, созданная с помощью инструмента mkspiffs, поскольку все устройства имеют либо 1M, либо 4M flash.

Шаг 3: Создайте двоичные файлы

Используя параметр меню Arduino IDE sketch / Export Compiled Binary, создайте прошивку, которая будет загружена на устройство, когда оно запросит ее с сервера обновлений.

Если вам нужен двоичный файл SPIFFS, вам необходимо установить инструмент mkspiffs.

Как только он у вас есть, создать двоичный файл SPIFFS очень просто. У меня есть однострочный пакетный файл для версии 1M, который принимает номер версии в качестве параметра (% 1)

mkspiffs -c data / spiffs_% 1_1M.bin

и еще один для версии 4M:

mkspiffs -p 256 -b 8192 -s 0x0FB000 -c data / spiffs_% 1_4M.bin

Затем я копирую все скомпилированные двоичные файлы и двоичные файлы SPIFFS в репозиторий.

Шаг 4: Создайте поток сервера

Создайте поток сервера
Создайте поток сервера

Я использую NODE-RED, но простая логика будет одинаковой для любой серверной технологии / языка.

a) Определите URL-адрес, который будет прослушивать запрос ESP8266httpUpdate. Мой raspberryPi serevr находится на 192.168.1.4 и прослушивает порт 1880 для / обновления с добавленным типом оборудования. Поэтому, если я собираюсь запросить двоичный файл для Wemos D1 Mini, URL-адрес будет выглядеть следующим образом:

192.168.1.4:1880/update/d1_mini

б) Создайте код для обработки следующей логики:

ESP8266: «Привет, я использую версию прошивки a.b.c, у вас есть более новая версия?» Сервер: «Дайте посмотреть… ах, да, у меня есть a.b.d - вот оно…»

Если более новая версия существует, сервер просто отправляет ее как загрузку двоичных данных в ответе http. Класс ESP8266httpUpdate выполняет сложную часть копирования двоичного файла в память, изменяя адрес загрузки прошивки на новый код, а затем (если требуется) перезагружает устройство для запуска нового кода.

Если, с другой стороны, нет более новой версии, он отвечает ошибкой http 304, которая фактически говорит: «У меня нет ничего для вас», и ваш код продолжает работать в обычном режиме.

Шаг 5: Добавьте серверную логику

Первый узел в потоке «прослушивает» HTTP-запрос к URL-адресу https://192.168.1.4:1880/update с добавленным типом устройства. Он передает это в функциональный узел «Построить путь поиска», который имеет следующий код javascript:

msg.type = msg.req.params.type; var h = msg.req.headers; msg.version = h ["x-esp8266-версия"];

msg.mode = h ["режим x-esp8266"];

если (msg.mode == "эскиз") {msg.payload = "/ home / pi / trucFirmware / *. ino." + msg.type + ". bin"; } else {var sz = h ['размер-микросхемы x-esp8266']; msg.payload = "/ home / pi / trucFirmware / spiffs _ * _" + (sz / 1048576) + "M.bin"; } return msg;

Это просто устанавливает соответствующий путь с подстановочным знаком для следующей функции sys, которая просто запускается

ls - r

Затем вывод передается в узел функции «Сравнить версии»:

var f = msg.payload.split ("\ n") [0]; msg.filename = f;

if (msg.mode == "sketch") {

f = f.replace ("/ home / pi / trucFirmware / truc_", ""); f = f.replace (". ino." + msg.type + ". bin", ""); } else {f = f.replace ("/ home / pi / trucFirmware / spiffs_", ""); f = f.replace (/ _ / dM \.bin /, ""); }

if (msg.version <f) {

node.warn («требуется обновление»);

node.warn ("вернет" + msg.filename); return msg; } node.warn («без обновления»); msg.statusCode = 304; msg.payload = ;

return msg;

Затем коммутационный узел гарантирует, что либо отправлено сообщение 304 «обновление не требуется», либо фактический новый двоичный файл будет возвращен и отправлен обратно на устройство.

Шаг 6. Добавьте код в эскиз, чтобы запросить обновление

В скетч должен быть включен следующий код, чтобы он автоматически обновлялся при следующем увеличении номера версии:

#включают

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE устанавливается раньше в зависимости от различных // определений времени компиляции, которые в конечном итоге определяют тип hw, например #define ЭТО_УСТРОЙСТВО "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" ЭТО_УСТРОЙСТВО; // это мой сервер Raspberry Pi, 1880 - порт NODE-RED по умолчанию // / update - это URL-адрес, который я выбрал для сервера, который будет «слушать», за которым следует тип устройства… bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (ложь); если (эскиз) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Эта строка «делает свое дело»} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf («ОБНОВЛЕНИЕ УСПЕШНО»);

вернуть истину; } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf («Ошибка обновления»);

}}} return false; }

Шаг 7. Наконец, запустите обновление

Во время загрузки или, возможно, в ответ на сообщение MQTT (как и я) запустите следующий код:

если (_actualUpdate (true)) ESP.restart ();

// или для SPIFFS…

если (_actualUpdate (false)) ESP.restart ();

Устройство обновится и перезагрузится, запустив последний код с сервера. Для меня это намного проще, чем вручную обновить 33 устройства!

Еще больше полезной информации о домашней автоматизации, IOT и программировании ESP8266 можно найти в моем блоге.

Рекомендуемые: