Talaan ng mga Nilalaman:

Mag-set up ng isang ESP8266 Awtomatikong Pag-update ng Server: 7 Mga Hakbang
Mag-set up ng isang ESP8266 Awtomatikong Pag-update ng Server: 7 Mga Hakbang

Video: Mag-set up ng isang ESP8266 Awtomatikong Pag-update ng Server: 7 Mga Hakbang

Video: Mag-set up ng isang ESP8266 Awtomatikong Pag-update ng Server: 7 Mga Hakbang
Video: Home Automation: control AC bombilya gamit ang Relay sa NodeMCU at D1 Mini sa WiFi 2024, Nobyembre
Anonim
Mag-set up ng isang ESP8266 Awtomatikong Update Server
Mag-set up ng isang ESP8266 Awtomatikong Update Server

Maraming mga tao ang gumagamit ngayon ng ESP8266 sa maraming mga guises nito (ESP-01S, Wemos D1, NodeMCU, Sonoff atbp) para sa mga system ng automation ng bahay. Kung sumulat ka ng iyong sariling code (tulad ng ginagawa ko) na pag-update ng bawat isa sa mga ito nang hiwalay kahit sa pamamagitan ng OTA (sa paglipas ng hangin) ay medyo nakakapagod.

Ang aking sariling system, halimbawa ay mayroong 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV at isang NodeMCU na nagbabahagi ng isang karaniwang base ng code, kaya't 33 na aparato ang lahat upang mai-update kapag gumawa ako ng isang simpleng code magbago

Ngunit may isang mas madaling paraan: Isang "update server". Ang mahusay na core ng Arduino IDE + ESP8266 ay may silid-aklatan upang gawin ang karamihan sa gawain (ESP8266httpUpdate), ngunit kailangan mong malaman kung paano i-set up ang iyong sariling server upang ito ay gumana.

Ipinapakita sa iyo ng Instructable na ito kung paano gumagamit ng isang NODE-RED server, ngunit ang parehong lohika ay nalalapat sa anumang teknolohiya ng server na iyong pinili hal. Apache + PHP atbp

Hakbang 1: Ano ang Kailangan Mo

  1. Arduino IDE
  2. Core ng ESP8266
  3. Anumang ESP8266 dev board na may 1M o higit pang flash RAM
  4. Isang Web Server (kahit na ang isang mapagpakumbabang raspberry Pi ay gagawin - Ito ang ginagamit ko)
  5. (opsyonal) tool na mkspiff kung nais mong awtomatikong i-update ang isang imahe ng SPIFFS file system

Hakbang 2: Lumikha ng isang Repository upang Maghawak ng Mga Binary Firmwares

Lumikha ng isang Repository upang Maghawak ng Mga Binary Firmwares
Lumikha ng isang Repository upang Maghawak ng Mga Binary Firmwares

Sa aking server, mayroon akong isang folder na tinatawag na / home / pi / trucFirmware na humahawak sa iba't ibang mga firmwares ng aparato at mga imahe ng SPIFFS

Pinapanatili ko ang isang hiwalay na binary para sa bawat uri ng hardware (mula sa isang solong pinagmulan ng file na may ilang #defines) at kapag handa na ang isang bagong paglabas ginagamit ko ang Arduino IDE na "sketch / Export compiled Binary" na menu command para sa bawat target na aparato. Tandaan na kahit bagaman mayroong 5 magkakaibang uri ng hardware, mayroon lamang dalawang mga binary na SPIFFS: isang 1M at isang bersyon na 4M - na itinayo gamit ang tool na mkspiff - dahil ang lahat ng mga aparato ay may alinman sa 1M o 4M flash.

Hakbang 3: Lumikha ng Mga Binary

Gamit ang sketch ng pagpipilian ng menu ng Arduino IDE / I-export ang Pinagsama na Binary, lumikha ng firmware na mai-upload sa aparato kapag hiniling nito ito mula sa server ng pag-update.

Kung kailangan mo ng isang binary na SPIFFS kakailanganin mong i-install ang tool na mkspiff.

Kapag mayroon ka nito, ang pagbuo ng SPIFFS binary ay simple. Mayroon akong isang linya na file ng batch para sa bersyon ng 1M na kukuha ng numero ng bersyon bilang isang parameter (% 1)

mkspiff -c data / spiff_% 1_1M.bin

at isa pa para sa bersyon ng 4M:

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

Kinopya ko pagkatapos ang lahat ng naipong mga binary at ang SPIFFS.binary files papunta sa repository

Hakbang 4: Lumikha ng Daloy ng Server

Lumikha ng Daloy ng Server
Lumikha ng Daloy ng Server

Gumagamit ako ng NODE-RED, ngunit ang simpleng lohika ay magiging pareho sa anumang teknolohiya / wika ng server.

a) Tukuyin ang isang url na makikinig para sa kahilingan sa ESP8266httpUpdate. Ang aking raspberryPi serevr ay nasa 192.168.1.4 at nakikinig sa port 1880 para sa / pag-update sa aparatong hardware na nakadugtong. Kaya't kung hihiling ako ng isang binary para sa isang Wemos D1 Mini, ang url ay nagtatapos bilang:

192.168.1.4:1880/update/d1_mini

b) Lumikha ng code upang hawakan ang sumusunod na lohika:

ESP8266: "Kumusta, nagpapatakbo ako ng bersyon ng firmware a.b.c, mayroon ka bang isang mas bagong bersyon?" Server: "Tingnan mo ako … ah oo mayroon akong a.b.d - narito na …"

Kung mayroong isang mas bagong bersyon ay ipapadala lamang ito ng server bilang isang pag-load ng binary data sa sagot sa http. Ginagawa ng klase ng ESP8266httpUpdate ang nakakalito na bahagi ng pagkopya ng binary sa memorya, binabago ang firmware boot address sa bagong code kaysa sa (kung hiniling) na muling i-reboot ang aparato upang patakbuhin ang bagong code.

Kung sa kabilang banda walang mas mataas na bersyon, ito ay tumugon nang may error na http 304 na mabisang nagsasabing: "Wala akong para sa iyo" at ang iyong code ay patuloy na tumatakbo bilang normal.

Hakbang 5: Idagdag ang Server Logic

Ang unang node sa daloy na "nakikinig" para sa isang kahilingan sa http na url https://192.168.1.4:1880/update kasama ang uri ng aparato na naidugtong. Ipinapasa ito sa node ng function na "Bumuo ng paghahanap ng landas" na may mga sumusunod na javascript code:

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

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

kung (msg.mode == "sketch") {msg.payload = "/ home / pi / trucFirmware / *. ino." + msg.type + ". bin"; } iba pa {var sz = h ['x-esp8266-size-chip']; msg.payload = "/ home / pi / trucFirmware / spiff _ * _" + (sz / 1048576) + "M.bin"; } ibalik ang msg;

Itinatakda lamang nito ang naaangkop na landas na may wildcard para sa pagpapaandar ng sys na sumusunod, na simpleng tumatakbo

ls - r

Pagkatapos ang output ay pinakain sa node ng function na "Paghambingin ang mga bersyon":

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

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

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

kung (msg.version <f) {

node.warn ("kinakailangan ng pag-upgrade");

node.warn ("babalik" + msg.filename); ibalik ang msg; } node.warn ("walang pag-upgrade"); msg.statusCode = 304; msg.payload = ;

ibalik ang msg;

Ang switch node pagkatapos ay tinitiyak na ang alinman sa 304 "walang kinakailangang pag-update" na mensahe ay naipadala o ang aktwal na bagong binary ay naibalik at ipinadala pabalik sa aparato.

Hakbang 6: Magdagdag ng Code sa Sketch upang Humiling ng isang Update

Ang sketch ay kailangang may kasamang sumusunod na code dito upang awtomatiko itong mag-update sa susunod na taasan mo ang numero ng bersyon:

# isama

# tukuyin ang TRUC_VERSION "0_4_99"

# tukuyin ang SPIFFS_VERSION "0_5_0"

// IT_DEVICE ay itinakda nang mas maaga depende sa iba't ibang mga tumutukoy sa oras ng pagsasaayos // na sa kalaunan ay tumutukoy sa uri ng hw, hal. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // this is my raspberry Pi server, the 1880 is the default NODE-RED port // / update is the url pinili ko para sa server na "makinig" para sa, sinusundan ng uri ng aparato … bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (false); kung (sketch) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Ito ang linya na "ginagawa ang negosyo"} iba pa {ret = ESPhttpUpdate.updateSpiff (updateUrl, SPIFFS_VERSION); } kung (ret! = HTTP_UPDATE_NO_UPDATE) {kung (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

bumalik totoo; } iba pa {kung (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Nabigo ang Pag-upgrade");

}}} bumalik na hindi totoo; }

Hakbang 7: Panghuli, Simulan ang Update

Sa oras ng pag-boot, o marahil bilang tugon sa isang mensahe ng MQTT (tulad ng ginagawa ko) patakbuhin ang sumusunod na code:

kung (_actualUpdate (totoo)) ESP. restart ();

// o para sa SPIFFS…

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

I-a-update ng aparato ang sarili nito at i-reboot ang pagpapatakbo ng pinakabagong code mula sa server. Mas simple para sa akin kaysa sa manu-manong pag-update ng 33 mga aparato!

Maraming mas kapaki-pakinabang na impormasyon tungkol sa Home Automation, IOT at pag-program ng ESP8266 ay matatagpuan sa Aking Blog

Inirerekumendang: