Përmbajtje:

Vendosni një server të azhurnimit automatik ESP8266: 7 hapa
Vendosni një server të azhurnimit automatik ESP8266: 7 hapa

Video: Vendosni një server të azhurnimit automatik ESP8266: 7 hapa

Video: Vendosni një server të azhurnimit automatik ESP8266: 7 hapa
Video: Управление 32 сервомоторами с помощью PCA9685 и Arduino: V3 2024, Nëntor
Anonim
Vendosni një server të azhurnimit automatik ESP8266
Vendosni një server të azhurnimit automatik ESP8266

Shumë njerëz tani po përdorin ESP8266 në formatin e tij të shumtë (ESP-01S, Wemos D1, NodeMCU, Sonoff etj) për sistemet e automatizimit të shtëpisë. Nëse shkruani kodin tuaj (siç bëj unë) përditësimi i secilës prej tyre veç e veç edhe përmes OTA (në ajër) bëhet pak i lodhshëm.

Sistemi im, për shembull ka 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV dhe një NodeMCU të cilat ndajnë një bazë të përbashkët të kodit, kështu që gjithsej 33 pajisje do të përditësohen kur të bëj një kod të thjeshtë ndryshim.

Por ka një mënyrë më të lehtë: Një "server përditësimi". Bërthama e shkëlqyer Arduino IDE + ESP8266 ka një bibliotekë për të bërë pjesën më të madhe të punës (ESP8266httpUpdate), por ju duhet të dini se si të krijoni serverin tuaj për ta bërë atë të funksionojë.

Ky udhëzues ju tregon se si të përdorni një server NODE-RED, por e njëjta logjikë vlen për çdo teknologji serveri sipas zgjedhjes tuaj p.sh. Apache + PHP etj

Hapi 1: Ajo që ju nevojitet

  1. Arduino IDE
  2. ESP8266 bërthamë
  3. Çdo bord ESP8266 dev me 1M ose më shumë RAM flash
  4. Një Web Server (edhe një mjedër i thjeshtë Pi do të bëjë - kjo është ajo që unë përdor)
  5. (opsional) mjeti mkspiffs nëse doni të azhurnoni automatikisht një imazh të sistemit të skedarëve SPIFFS

Hapi 2: Krijoni një depo për të mbajtur firmuaret binare

Krijoni një depo për të mbajtur firmuaret binare
Krijoni një depo për të mbajtur firmuaret binare

Në serverin tim, unë kam një dosje të quajtur/home/pi/trucFirmware e cila mban firmware të ndryshëm të pajisjeve dhe imazhe SPIFFS

Unë mbaj një binar të veçantë për secilin lloj hardueri (nga një skedar burimi i vetëm me disa #përkufizime) dhe kur një lëshim i ri të jetë gati unë përdor komandën e menysë Arduino IDE "skicë/Eksporto përpiluar Binary" për çdo pajisje të synuar. Vini re se edhe megjithëse ekzistojnë 5 lloje të ndryshme të harduerit, ekzistojnë vetëm dy binare SPIFFS: një version 1M dhe 4M - i ndërtuar me mjetin mkspiffs - pasi të gjitha pajisjet kanë flash 1M ose 4M.

Hapi 3: Krijoni Binaret

Duke përdorur skicën e menysë Arduino IDE/Export Compiled Binary, krijoni firmuerin që do të ngarkohet në pajisje kur ta kërkojë nga serveri i përditësimit.

Nëse keni nevojë për një binar SPIFFS, do t'ju duhet të instaloni mjetin mkspiffs.

Pasi ta keni, ndërtimi i binarit SPIFFS është i thjeshtë. Unë kam një skedar grumbull me një rresht për versionin 1M i cili merr numrin e versionit si parametër (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

dhe një tjetër për versionin 4M:

mkspiffs -p 256 -b 8192 -s 0x0FB000 -c të dhëna/ spiffs_%1_4M.bin

Pastaj kopjoj të gjitha binarët e përpiluar dhe skedarët binarë SPIFFS në depo

Hapi 4: Krijoni rrjedhën e serverit

Krijoni rrjedhën e serverit
Krijoni rrjedhën e serverit

Unë jam duke përdorur NODE-RED, por logjika e thjeshtë do të jetë e njëjtë në çdo teknologji / gjuhë serveri.

a) Përcaktoni një url e cila do të dëgjojë kërkesën ESP8266httpUpdate. My raspberryPi serevr është në 192.168.1.4 dhe dëgjon në portin 1880 për /përditësim me llojin e harduerit të bashkangjitur. Pra, nëse do të kërkoj një binar për një Wemos D1 Mini, url përfundon si:

192.168.1.4:1880/update/d1_mini

b) Krijoni kod për të trajtuar logjikën e mëposhtme:

ESP8266: "Përshëndetje, po ekzekutoj versionin e firmuerit a.b.c, keni një version më të ri?" Serveri: "Më lër të shoh … ah po kam a.b.d - ja ku po vjen …"

Nëse ekziston një version më i ri, serveri thjesht e dërgon atë si një ngarkesë e të dhënave binare në përgjigjen http. Klasa ESP8266httpUpdate bën pjesën e ndërlikuar të kopjimit të binarit në memorie, duke ndryshuar adresën e nisjes së firmuerit në kodin e ri sesa (nëse kërkohet) rindezjen e pajisjes për të ekzekutuar kodin e ri.

Nëse nga ana tjetër nuk ka ndonjë version më të lartë, ai përgjigjet me një gabim http 304 i cili në mënyrë efektive thotë: "Unë nuk kam asgjë për ju" dhe kodi juaj vazhdon të funksionojë si zakonisht.

Hapi 5: Shtoni logjikën e serverit

Nyja e parë në rrjedhë "dëgjon" për një kërkesë http në url https://192.168.1.4:1880/update me llojin e pajisjes të bashkangjitur. E kalon këtë në nyjen e funksionit "Ndërto rrugën e kërkimit" e cila ka kodin e mëposhtëm 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 == "skicë") {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"; } kthimi i mesazhit;

Kjo thjesht krijon rrugën e duhur me wildcard për funksionin sys që vijon, i cili thjesht funksionon

ls - r

Dalja pastaj furnizohet me nyjen e funksionit "Krahasoni versionet":

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

nëse (msg.mode == "skicë") {

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

nëse (msg.version <f) {

node.warn ("kërkohet përmirësim");

node.warn ("do të kthehet"+msg.filename); kthe mesazh; } node.warn ("pa azhurnim"); msg.statusCode = 304; msg.pagesa = ;

kthe mesazh;

Nyja e kalimit siguron që mesazhi 304 "nuk ka nevojë për përditësim" të dërgohet ose binari aktual i ri të kthehet dhe të kthehet përsëri në pajisje.

Hapi 6: Shtoni kodin në skicë për të kërkuar një azhurnim

Skica duhet të ketë kodin e mëposhtëm të përfshirë në të, në mënyrë që të azhurnohet automatikisht herën tjetër kur të rrisni numrin e versionit:

#përfshi

#përcakto TRUC_VERSION "0_4_99"

#përcakto SPIFFS_VERSION "0_5_0"

// THIS_DEVICE është vendosur më herët në varësi të përcaktimeve të ndryshme të kohës së përpilimit // të cilat përfundimisht përcaktojnë llojin hw, p.sh. #përcaktoni KIST_Pajisje "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // ky është serveri im i mjedrës Pi, 1880 është porta e paracaktuar NODE-RED // /përditësimi është url që kam zgjedhur për serverin për të "dëgjuar", e ndjekur nga lloji i pajisjes … bool aktualeUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (false); if (skicë) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Kjo është linja që "bën biznes"} tjetër {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } nëse (ret! = HTTP_UPDATE_NO_UPDATES) {nëse (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

kthehet e vërtetë; } tjetër {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Përditësimi dështoi");

}}} kthehu false; }

Hapi 7: Së fundi, Filloni Përditësimin

Në kohën e nisjes, ose ndoshta në përgjigje të një mesazhi MQTT (siç bëj unë) drejtoni kodin e mëposhtëm:

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

// ose për SPIFFS…

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

Pajisja do të azhurnohet vetë dhe do të rindizet duke ekzekutuar kodin e fundit nga serveri. Meshtë shumë më e thjeshtë për mua sesa azhurnimi manual i 33 pajisjeve!

Shumë informacione më të dobishme në lidhje me Automatizimin e Shtëpisë, IOT dhe programimin e ESP8266 mund të gjenden në My Blog

Recommended: