Բովանդակություն:

Տեղադրեք ESP8266 ավտոմատ թարմացման սերվեր ՝ 7 քայլ
Տեղադրեք ESP8266 ավտոմատ թարմացման սերվեր ՝ 7 քայլ

Video: Տեղադրեք ESP8266 ավտոմատ թարմացման սերվեր ՝ 7 քայլ

Video: Տեղադրեք ESP8266 ավտոմատ թարմացման սերվեր ՝ 7 քայլ
Video: CPU Mining Paling Profit Menambang Bamboo BMB Coin 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. Arduino IDE
  2. ESP8266 միջուկ
  3. Eանկացած ESP8266 dev տախտակ 1 Մ կամ ավելի ֆլեշ RAM- ով
  4. Վեբ սերվեր (նույնիսկ համեստ ազնվամորի Pi- ն դա կանի. Դա այն է, ինչ ես օգտագործում եմ)
  5. (ըստ ցանկության) mkspiffs գործիք, եթե ցանկանում եք ինքնաբերաբար թարմացնել SPIFFS ֆայլային համակարգի պատկերը

Քայլ 2. Ստեղծեք պահեստ երկուական ծրագրակազմեր պահելու համար

Ստեղծեք պահեստ ՝ երկուական ծրագրակազմեր պահելու համար
Ստեղծեք պահեստ ՝ երկուական ծրագրակազմեր պահելու համար

Իմ սերվերի վրա ես ունեմ մի թղթապանակ, որը կոչվում է/home/pi/trucFirmware, որը պահում է սարքի տարբեր ծրագրակազմեր և SPIFFS պատկերներ

Ես պահում եմ առանձին երկուականություն յուրաքանչյուր ապարատային տիպի համար (մեկ աղբյուրի ֆայլից ՝ մի քանի #սահմանումներով) և երբ նոր թողարկումը պատրաստ լինի, ես օգտագործում եմ Arduino IDE «ուրվագիծ/արտահանել կազմված երկուական» մենյուի հրամանը յուրաքանչյուր թիրախային սարքի համար: Նկատի ունեցեք, որ նույնիսկ թեև կան 5 տարբեր տեսակի սարքավորումներ, կան ընդամենը երկու SPIFFS երկուական ֆայլեր ՝ 1M և 4M տարբերակ ՝ կառուցված mkspiffs գործիքով, քանի որ բոլոր սարքերն ունեն 1M կամ 4M ֆլեշ:

Քայլ 3: Ստեղծեք երկուական ֆայլեր

Օգտագործելով Arduino IDE ընտրացանկի ընտրանքի ուրվագիծը/Արտահանել կազմված երկուական, ստեղծեք որոնվածը, որը կբեռնվի սարքում, երբ այն խնդրի թարմացման սերվերից:

Եթե Ձեզ անհրաժեշտ է SPIFFS երկուական ֆայլ, ապա ձեզ հարկավոր է տեղադրել mkspiffs գործիքը:

Երբ այն ունեք, SPIFFS երկուական կառուցելը պարզ է: Ես ունեմ 1 տող տարբերակի մեկ տողանոց խմբաքանակ, որը որպես պարամետր ընդունում է տարբերակի համարը (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

և մեկ այլ 4M տարբերակի համար.

mkspiffs -p 256 -b 8192 -s 0x0FB000 -c տվյալներ/ spiffs_%1_4M.bin

Այնուհետև ես պատճենում եմ բոլոր կազմված երկուական ֆայլերն ու SPIFFS. Երկուական ֆայլերը պահեստ

Քայլ 4: Ստեղծեք սերվերի հոսքը

Ստեղծեք սերվերի հոսքը
Ստեղծեք սերվերի հոսքը

Ես օգտագործում եմ NODE-RED, բայց պարզ տրամաբանությունը նույնը կլինի սերվերի ցանկացած տեխնոլոգիայի / լեզվի վրա:

ա) Սահմանեք 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- ի ՝ https://192.168.1.4:1880/lpdate հասցեագրման հայցման համար ՝ կցված սարքի տեսակին: Այն փոխանցում է «Կառուցել որոնման ուղի» գործառական հանգույցին, որն ունի հետևյալ 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 == "ուրվագիծ") {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"; } վերադարձ msg;

Սա պարզապես ստեղծում է համապատասխան ուղի ՝ նշագծով, որը հետևում է sys գործառույթին, որը պարզապես աշխատում է

ls - r

Այնուհետեւ ելքը սնվում է «Համեմատել տարբերակները» գործառական հանգույցին.

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

եթե (msg.mode == "ուրվագիծ") {

f = f. փոխարինել ("/home/pi/trucFirmware/truc_", ""); f = f.replace (". ino."+msg.type+". bin", ""); } else {f = f.replace ("/home/pi/trucFirmware/spiffs_", ""); f = f. փոխարինել (/_ / dM \.bin/, ""); }

եթե (msg.version <f) {

node.warn («արդիականացումը պարտադիր է»);

node.warn ("կվերադառնա"+msg.filename); վերադարձնել msg; } node.warn («արդիականացում չկա»); msg.statusCode = 304; msg.payload = ;

վերադարձնել msg;

Անջատիչ հանգույցն այնուհետև ապահովում է, որ կամ 304 «թարմացում չի պահանջվում» հաղորդագրությունը ուղարկվի, կամ փաստացի նոր երկուականը վերադարձվի և հետ ուղարկվի սարքին:

Քայլ 6: Թարմացում պահանջելու համար էսքիզին ավելացրեք ծածկագիր

Էսքիզը պետք է պարունակի հետևյալ ծածկագիրը, որպեսզի հաջորդ անգամ ավտոմատ կերպով թարմացվի տարբերակի համարը.

#ներառում

#սահմանեք TRUC_VERSION «0_4_99»

#սահմանել SPIFFS_VERSION «0_5_0»

// THIS_DEVICE- ը ավելի վաղ է դրված ՝ կախված կազմման ժամանակի տարբեր սահմանումներից // որոնք ի վերջո սահմանում են hw տեսակը, օրինակ. #սահմանեք ԱՅՍ_ՍԱՐՔԸ «d1_mini» const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // սա իմ ազնվամորու Pi սերվերն է, 1880-ը լռելյայն NODE-RED պորտն է // /թարմացումն այն URL- ն է, որը ես ընտրել եմ սերվերի համար «լսելու» համար, որին հաջորդում է սարքի տեսակը … bool actualUpdate (bool sketch = false) {Լարային հաղորդագրություն; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (կեղծ); if (ուրվագիծ) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Սա այն տողն է, որը «զբաղվում է բիզնեսով»} այլապես {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

վերադարձնել ճշմարիտ; } այլ {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf («Թարմացումը ձախողվեց»);

}}} վերադարձնել կեղծ; }

Քայլ 7: Վերջապես, նախաձեռնեք թարմացումը

Բեռնման ժամանակ, կամ գուցե ի պատասխան MQTT հաղորդագրության (ինչպես ես եմ անում) գործարկել հետևյալ ծածկագիրը.

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

// կամ SPIFFS- ի համար…

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

Սարքը ինքնաբերաբար կթարմացվի և կվերագործարկվի սերվերի վերջին ծածկագրի գործարկմամբ: Ինձ համար շատ ավելի պարզ է, քան 33 սարք ձեռքով թարմացնելը:

Տան ավտոմատացման, IOT- ի և ESP8266- ի ծրագրավորման մասին շատ ավելի օգտակար տեղեկություններ կարելի է գտնել Իմ բլոգում

Խորհուրդ ենք տալիս: