Spisu treści:

Skonfiguruj serwer automatycznej aktualizacji ESP8266: 7 kroków
Skonfiguruj serwer automatycznej aktualizacji ESP8266: 7 kroków

Wideo: Skonfiguruj serwer automatycznej aktualizacji ESP8266: 7 kroków

Wideo: Skonfiguruj serwer automatycznej aktualizacji ESP8266: 7 kroków
Wideo: ESPeasy start 2023 jak zacząć, instalacja - ESP8266 + DS18B20 + Home Asisstant - sensor temperatury 2024, Lipiec
Anonim
Skonfiguruj serwer automatycznej aktualizacji ESP8266
Skonfiguruj serwer automatycznej aktualizacji ESP8266

Wiele osób używa obecnie ESP8266 w wielu wersjach (ESP-01S, Wemos D1, NodeMCU, Sonoff itp.) w systemach automatyki domowej. Jeśli napiszesz swój własny kod (tak jak ja) aktualizowanie każdego z nich osobno nawet przez OTA (over the air) staje się nieco nużące.

Mój własny system, na przykład, ma 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV i NodeMCU, które mają wspólną bazę kodów, więc to w sumie 33 urządzenia do aktualizacji, gdy wykonuję prosty kod reszta.

Ale jest prostszy sposób: „serwer aktualizacji”. Znakomity rdzeń Arduino IDE + ESP8266 ma bibliotekę do wykonywania większości pracy (ESP8266httpUpdate), ale musisz wiedzieć, jak skonfigurować własny serwer, aby działał.

Ta instrukcja pokazuje, jak korzystać z serwera NODE-RED, ale ta sama logika dotyczy dowolnej wybranej technologii serwerowej, np. Apache + PHP itp

Krok 1: Czego potrzebujesz

  1. IDE Arduino
  2. ESP8266 rdzeń
  3. Dowolna płyta deweloperska ESP8266 z 1M lub więcej pamięcią flash RAM
  4. Serwer WWW (nawet skromny Raspberry Pi - tego używam)
  5. (opcjonalnie) narzędzie mkspiffs, jeśli chcesz automatycznie zaktualizować obraz systemu plików SPIFFS

Krok 2: Utwórz repozytorium do przechowywania binarnego oprogramowania układowego

Utwórz repozytorium do przechowywania binarnego oprogramowania układowego
Utwórz repozytorium do przechowywania binarnego oprogramowania układowego

Na moim serwerze mam folder o nazwie /home/pi/trucFirmware, który zawiera różne oprogramowanie sprzętowe i obrazy SPIFFS

Utrzymuję osobny plik binarny dla każdego typu sprzętu (z jednego pliku źródłowego z kilkoma #definicjami), a kiedy nowa wersja jest gotowa, używam polecenia menu Arduino IDE „sketch/Export compiled Binary” dla każdego urządzenia docelowego. chociaż istnieje 5 różnych typów sprzętu, istnieją tylko dwa pliki binarne SPIFFS: wersja 1M i 4M - skonstruowane za pomocą narzędzia mkspiffs - ponieważ wszystkie urządzenia mają pamięć flash 1M lub 4M.

Krok 3: Utwórz pliki binarne

Korzystając z opcji menu Arduino IDE szkic/Eksportuj skompilowany plik binarny, utwórz oprogramowanie układowe, które zostanie przesłane do urządzenia, gdy zażąda tego z serwera aktualizacji.

Jeśli potrzebujesz pliku binarnego SPIFFS, musisz zainstalować narzędzie mkspiffs.

Kiedy już to zrobisz, zbudowanie pliku binarnego SPIFFS jest proste. Mam jednowierszowy plik wsadowy dla wersji 1M, który przyjmuje numer wersji jako parametr (%1)

mkspiffs -c dane/ spiffs_%1_1M.bin

i kolejny dla wersji 4M:

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

Następnie kopiuję wszystkie skompilowane pliki binarne i pliki SPIFFS.binary do repozytorium

Krok 4: Utwórz przepływ serwera

Utwórz przepływ serwera
Utwórz przepływ serwera

Używam NODE-RED, ale prosta logika będzie taka sama na każdej technologii/języku serwera.

a) Zdefiniuj adres URL, który będzie nasłuchiwał żądania ESP8266httpUpdate. Mój serwer raspberryPi jest na 192.168.1.4 i nasłuchuje na porcie 1880 dla /update z dołączonym typem sprzętu. Więc jeśli mam zamiar poprosić o plik binarny dla Wemos D1 Mini, adres URL kończy się jako:

192.168.1.4:1880/update/d1_mini

b) Utwórz kod do obsługi następującej logiki:

ESP8266: „Cześć, używam oprogramowania w wersji a.b.c, czy masz nowszą wersję?”

Jeśli nowsza wersja istnieje, serwer po prostu wysyła ją jako ładunek danych binarnych w odpowiedzi http. Klasa ESP8266httpUpdate wykonuje trudną część kopiowania pliku binarnego do pamięci, zmiany adresu rozruchowego oprogramowania układowego na nowy kod niż (jeśli jest to wymagane) ponownego uruchomienia urządzenia w celu uruchomienia nowego kodu.

Jeśli z drugiej strony nie ma wyższej wersji, odpowiada on błędem http 304, który skutecznie mówi: „Nie mam nic dla ciebie”, a Twój kod nadal działa normalnie.

Krok 5: Dodaj logikę serwera

Pierwszy węzeł w przepływie „nasłuchuje” żądania http na adres URL https://192.168.1.4:1880/update z dołączonym typem urządzenia. Przekazuje to do węzła funkcji „Construct search path”, który ma następujący kod javascript:

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

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"; } zwróć wiadomość;

To po prostu ustawia odpowiednią ścieżkę z symbolem wieloznacznym dla następującej funkcji sys, która po prostu działa

ls - r

Dane wyjściowe są następnie przekazywane do węzła funkcji „Porównaj wersje”:

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

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

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

if(wersja.komunikatu <f){

node.warn("wymagana aktualizacja");

node.warn("zwróci "+msg.filename); wiadomość zwrotna; } node.warn("bez aktualizacji"); msg.statusCode=304; msg.payload=;

wiadomość zwrotna;

Węzeł przełączający zapewnia następnie, że albo komunikat 304 „nie wymaga aktualizacji” albo zostanie zwrócony i odesłany z powrotem do urządzenia aktualny nowy plik binarny.

Krok 6: Dodaj kod do szkicu, aby poprosić o aktualizację

Szkic musi zawierać następujący kod, aby automatycznie aktualizował się przy następnym zwiększeniu numeru wersji:

#włączać

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// TO URZĄDZENIE jest ustawiane wcześniej w zależności od różnych definicji czasu kompilacji // które ostatecznie określają typ hw, np. #define THIS_DEVICE "d1_mini" const char * updateUrl="https://192.168.1.4:1880/update/"THIS_DEVICE; // to jest mój serwer raspberry Pi, 1880 to domyślny port NODE-RED // /update to adres URL, który wybrałem dla serwera do „nasłuchiwania”, a następnie typ urządzenia… bool currentUpdate(bool sketch=false) { Komunikat tekstowy; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate(false); if(szkic){ ret=ESPhttpUpdate.update(updateUrl, TRUC_VERSION); // **************** To jest wiersz, który „zajmuje się biznesem” } else { ret=ESPhttpUpdate.updateSpiffs(updateUrl, SPIFFS_VERSION); } if(ret!=HTTP_UPDATE_NO_UPDATES){ if(ret==HTTP_UPDATE_OK){

Serial.printf("AKTUALIZACJA UDAŁA SIĘ");

zwróć prawdę; } else { if(ret==HTTP_UPDATE_FAILED){

Serial.printf("Aktualizacja nie powiodła się");

} } } return false; }

Krok 7: Na koniec zainicjuj aktualizację

W czasie rozruchu, a może w odpowiedzi na komunikat MQTT (tak jak ja) uruchom następujący kod:

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

// lub dla SPIFFS…

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

Urządzenie zaktualizuje się i zrestartuje, uruchamiając najnowszy kod z serwera. To dla mnie o wiele prostsze niż ręczne aktualizowanie 33 urządzeń!

Dużo więcej przydatnych informacji na temat automatyki domowej, IOT i programowania ESP8266 można znaleźć na moim blogu

Zalecana: