Índice:

Configurar um servidor de atualização automática ESP8266: 7 etapas
Configurar um servidor de atualização automática ESP8266: 7 etapas

Vídeo: Configurar um servidor de atualização automática ESP8266: 7 etapas

Vídeo: Configurar um servidor de atualização automática ESP8266: 7 etapas
Vídeo: Como Programar o ESP8266 para ser um WEB SERVER - Video #3 - ESP8266 Primeiros Passos 2024, Novembro
Anonim
Configurar um servidor de atualização automática ESP8266
Configurar um servidor de atualização automática ESP8266

Muitas pessoas agora estão usando o ESP8266 em suas várias formas (ESP-01S, Wemos D1, NodeMCU, Sonoff etc.) para sistemas de automação residencial. Se você escrever seu próprio código (como eu faço), atualizar cada um deles separadamente, mesmo via OTA (pelo ar), torna-se um pouco tedioso.

Meu próprio sistema, por exemplo, tem 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV e um NodeMCU que compartilham uma base de código comum, ou seja, 33 dispositivos ao todo para atualizar quando faço um código simples mudança.

Mas existe uma maneira mais fácil: um "servidor de atualização". O excelente núcleo do Arduino IDE + ESP8266 tem uma biblioteca para fazer a maior parte do trabalho (ESP8266httpUpdate), mas você precisa saber como configurar seu próprio servidor para fazê-lo funcionar.

Este Instructable mostra como usar um servidor NODE-RED, mas a mesma lógica se aplica a qualquer tecnologia de servidor de sua escolha, por exemplo, Apache + PHP etc

Etapa 1: O que você precisa

  1. IDE Arduino
  2. ESP8266 core
  3. Qualquer placa dev ESP8266 com 1M ou mais de RAM flash
  4. Um servidor da Web (até mesmo um humilde Pi de framboesa serve - é o que eu uso)
  5. (opcional) ferramenta mkspiffs se você deseja atualizar automaticamente uma imagem do sistema de arquivos SPIFFS

Etapa 2: Criar um Repositório para Manter Firmwares Binários

Crie um Repositório para Manter Firmwares Binários
Crie um Repositório para Manter Firmwares Binários

No meu servidor, tenho uma pasta chamada / home / pi / trucFirmware que contém os diversos firmwares de dispositivos e imagens SPIFFS

Eu mantenho um binário separado para cada tipo de hardware (de um único arquivo de origem com alguns # define) e quando uma nova versão está pronta eu uso o comando de menu "esboço / Exportar binário compilado" do IDE do Arduino para cada dispositivo de destino. Observe que até embora existam 5 tipos de hardware diferentes, existem apenas dois binários SPIFFS: uma versão 1M e uma versão 4M - construída com a ferramenta mkspiffs - uma vez que todos os dispositivos têm flash de 1M ou 4M.

Etapa 3: Criar os binários

Usando a opção de menu do Arduino IDE sketch / Export Compiled Binary, crie o firmware que será carregado para o dispositivo quando ele solicitar do servidor de atualização.

Se precisar de um binário SPIFFS, você precisará instalar a ferramenta mkspiffs.

Depois de obtê-lo, construir o binário SPIFFS é simples. Eu tenho um arquivo em lote de uma linha para a versão 1M que leva o número da versão como parâmetro (% 1)

mkspiffs -c data / spiffs_% 1_1M.bin

e outro para a versão 4M:

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

Em seguida, copio todos os binários compilados e os arquivos SPIFFS.binary para o repositório

Etapa 4: crie o fluxo do servidor

Crie o fluxo do servidor
Crie o fluxo do servidor

Estou usando o NODE-RED, mas a lógica simples será a mesma em qualquer tecnologia / linguagem de servidor.

a) Defina um url que ouvirá a solicitação ESP8266httpUpdate. Meu serevr raspberryPi está em 192.168.1.4 e escuta na porta 1880 por / atualizar com o tipo de hardware anexado. Portanto, se vou solicitar um binário para um Wemos D1 Mini, a url terminará como:

192.168.1.4:1880/update/d1_mini

b) Crie um código para lidar com a seguinte lógica:

ESP8266: "Olá, estou executando a versão de firmware a.b.c, você tem uma versão mais recente?" Servidor: "Deixe-me ver … ah sim, eu tenho a.b.d - aí vem …"

Se houver uma versão mais recente, o servidor apenas a enviará como um carregamento de dados binários na resposta http. A classe ESP8266httpUpdate faz a parte complicada de copiar o binário na memória, alterando o endereço de inicialização do firmware para o novo código do que (se solicitado) reinicializar o dispositivo para executar o novo código.

Se por outro lado não houver uma versão superior, ele responde com um erro http 304 que efetivamente diz: "Não tenho nada para você" e seu código continua a funcionar normalmente.

Etapa 5: adicionar a lógica do servidor

O primeiro nó no fluxo "escuta" uma solicitação http para url https://192.168.1.4:1880/update com o tipo de dispositivo anexado. Ele passa isso para o nó de função "Construir caminho de pesquisa", que possui o seguinte código javascript:

msg.type = msg.req.params.type; var h = msg.req.headers; msg.version = h ["x-esp8266-version"];

msg.mode = h ["x-esp8266-mode"];

if (msg.mode == "sketch") {msg.payload = "/ home / pi / trucFirmware / *. ino." + msg.type + ". bin"; } else {var sz = h ['x-esp8266-chip-size']; msg.payload = "/ home / pi / trucFirmware / spiffs _ * _" + (sz / 1048576) + "M.bin"; } return msg;

Isso apenas configura o caminho apropriado com curinga para a função sys que se segue, que simplesmente executa

ls - r

A saída é então enviada para o nó de função "Comparar versões":

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 ("atualização necessária");

node.warn ("retornará" + msg.filename); return msg; } node.warn ("sem atualização"); msg.statusCode = 304; msg.payload = ;

return msg;

O nó de comutação então garante que a mensagem 304 "nenhuma atualização necessária" seja enviada ou o novo binário real seja retornado e enviado de volta ao dispositivo.

Etapa 6: adicionar código ao esboço para solicitar uma atualização

O esboço precisa ter o seguinte código incluído para que ele seja atualizado automaticamente na próxima vez que você aumentar o número da versão:

#incluir

# define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE é definido anteriormente dependendo de várias definições de tempo de compilação // que eventualmente definem o tipo de hw, por exemplo, #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // este é meu servidor raspberry Pi, o 1880 é a porta NODE-RED padrão // / update é o url que escolhi para o servidor "ouvir", seguido pelo tipo de dispositivo … bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (false); if (esboço) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Esta é a linha que "faz o negócio"} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("ATUALIZAÇÃO COM SUCESSO");

return true; } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Falha na atualização");

} } } retorna falso; }

Etapa 7: finalmente, inicie a atualização

No momento da inicialização, ou talvez em resposta a uma mensagem MQTT (como eu), execute o seguinte código:

if (_actualUpdate (true)) ESP.restart ();

// ou para SPIFFS…

if (_actualUpdate (false)) ESP.restart ();

O dispositivo se atualizará e reinicializará executando o código mais recente do servidor. É muito mais simples para mim do que atualizar manualmente 33 dispositivos!

Muitas outras informações úteis sobre Domótica, IOT e programação do ESP8266 podem ser encontradas em Meu Blog

Recomendado: