Mundarija:

ESP8266 avtomatik yangilash serverini o'rnating: 7 qadam
ESP8266 avtomatik yangilash serverini o'rnating: 7 qadam

Video: ESP8266 avtomatik yangilash serverini o'rnating: 7 qadam

Video: ESP8266 avtomatik yangilash serverini o'rnating: 7 qadam
Video: How to use DHT11 DHT22 with NodeMCU ESP8266 to read temperature over WiFi - IoT 2024, Iyul
Anonim
ESP8266 avtomatik yangilash serverini o'rnating
ESP8266 avtomatik yangilash serverini o'rnating

Hozir ko'p odamlar uy avtomatlashtirish tizimlari uchun ESP8266-ni turli ko'rinishlarda ishlatishadi (ESP-01S, Wemos D1, NodeMCU, Sonoff va boshqalar). Agar siz o'z kodingizni yozsangiz (men qilgandek), ularning har birini OTA (havo orqali) orqali alohida yangilash biroz zerikarli bo'ladi.

Mening shaxsiy tizimimda, masalan, 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV va umumiy kodlar bazasiga ega NodeMCU bor, shuning uchun men oddiy kodni yaratganimda 33 ta qurilma yangilanadi. o'zgartirish.

Ammo osonroq yo'l bor: "yangilash serveri". Zo'r Arduino IDE + ESP8266 yadrosi ko'p ishlarni bajaradigan kutubxonaga ega (ESP8266httpUpdate), lekin uning ishlashi uchun siz o'z serveringizni qanday sozlashni bilishingiz kerak.

Bu ko'rsatma sizga NODE-RED serveridan qanday foydalanishni ko'rsatadi, lekin xuddi shu mantiq siz tanlagan server texnologiyasi uchun amal qiladi. Apache + PHP va boshqalar

1 -qadam: Sizga nima kerak

  1. Arduino IDE
  2. Yadro ESP8266
  3. 1M yoki undan ko'p flesh -RAMga ega har qanday ESP8266 dev
  4. Veb -server (hatto oddiy malina Pi ham shunday qiladi - men buni ishlataman)
  5. (ixtiyoriy) mkspiffs vositasi, agar siz SPIFFS fayl tizimi tasvirini avtomatik yangilashni xohlasangiz

2 -qadam: Ikkilik dasturiy ta'minotni saqlash uchun ombor yarating

Ikkilik dasturiy ta'minotni saqlash uchun ombor yarating
Ikkilik dasturiy ta'minotni saqlash uchun ombor yarating

Serverda menda/home/pi/trucFirmware nomli papka bor, u har xil qurilma dasturlari va SPIFFS tasvirlarini saqlaydi.

Men har bir uskuna uchun alohida ikkilikni saqlayman (bir nechta #definesli bitta manba faylidan) va yangi versiya tayyor bo'lganda, men har bir maqsadli qurilma uchun Arduino IDE "eskiz/eksport kompilyatsiya qilingan ikkilik" menyu buyrug'idan foydalanaman. 5 xil uskuna mavjud bo'lsa -da, faqat ikkita SPIFFS ikkiliklari mavjud: 1M va 4M versiyasi - mkspiffs vositasi bilan yaratilgan, chunki barcha qurilmalarda 1M yoki 4M fleshli.

3 -qadam: Ikkilik fayllarni yarating

Arduino IDE menyusining sketch/Exiled Compined Binary variantidan foydalanib, uni yangilash serveridan so'ralganda qurilmaga yuklanadigan dasturiy ta'minotni yarating.

Agar sizga SPIFFS ikkilik kerak bo'lsa, siz mkspiffs vositasini o'rnatishingiz kerak bo'ladi.

Agar sizda bo'lsa, SPIFFS ikkilik tuzish juda oddiy. Menda 1M versiyasi uchun versiya raqamini parametr sifatida qabul qiladigan bitta qatorli ommaviy ish fayli bor (%1)

mkspiffs -c ma'lumotlar/ spiffs_%1_1M.bin

va 4M versiyasi uchun boshqasi:

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

Keyin barcha tuzilgan ikkilik fayllarni va SPIFFS.binary fayllarini omborga ko'chiraman

4 -qadam: Server oqimini yarating

Server oqimini yarating
Server oqimini yarating

Men NODE-RED dan foydalanayapman, lekin har qanday server texnologiyasi / tilida oddiy mantiq bir xil bo'ladi.

a) ESP8266httpUpdate so'rovini tinglaydigan urlni aniqlang. Mening raspberryPi serevr 192.168.1.4da va 1880 portda /yangilangan uskuna turi bilan tinglanadi. Agar men Wemos D1 Mini uchun ikkilik so'rov qilmoqchi bo'lsam, url quyidagicha tugaydi:

192.168.1.4:1880/update/d1_mini

b) quyidagi mantiqni boshqarish uchun kod yarating:

ESP8266: "Salom, men a.b.c dasturiy ta'minot versiyasini ishlayapman, sizda yangi versiya bormi?" Server: "Ko'raylik … ha ha menda a.b.d bor - mana keldi …"

Agar yangi versiya mavjud bo'lsa, server uni http javobida ikkilik ma'lumotlarning yuklanishi sifatida yuboradi. ESP8266httpUpdate klassi ikkilikni xotiraga nusxalashning qiyin qismini bajaradi, proshivka yuklash manzilini yangi kodga o'zgartiradi (agar so'ralsa) qurilmani yangi kodni ishga tushirish uchun.

Agar boshqa versiyasi bo'lmasa, u http 304 xatosi bilan javob beradi, unda: "Menda siz uchun hech narsa yo'q" va sizning kodingiz odatdagidek ishlashda davom etadi.

5 -qadam: Server mantig'ini qo'shing

Oqimdagi birinchi tugun, qurilma turi qo'shilgan holda https://192.168.1.4:1880/update URL manziliga http so'rovini "tinglaydi". Buni quyidagi JavaScript kodi bo'lgan "Qidiruv yo'lini yaratish" funktsiya tuguniga o'tkazadi:

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

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

if (msg.mode == "eskiz") {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"; } xabarni qaytarish;

Bu shunchaki ishlaydigan sys funktsiyasi uchun joker belgi bilan mos yo'lni o'rnatadi

ls - r

Keyin chiqish "Versiyalarni solishtirish" funktsiya tuguniga uzatiladi:

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

agar (msg.mode == "eskiz") {

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

agar (msg.version <f) {

node.warn ("yangilash kerak");

node.warn ("qaytadi"+msg.filename); xabarni qaytarish; } node.warn ("yangilanish yo'q"); msg.statusCode = 304; msg.to'lov = ;

xabarni qaytarish;

Keyin tugun tugmasi 304 "yangilanishga hojat yo'q" xabari yuborilishini yoki haqiqiy ikkilik qaytarilishini va qurilmaga qaytarilishini ta'minlaydi.

6 -qadam: Yangilashni so'rash uchun eskizga kod qo'shing

Eskizda quyidagi kod bo'lishi kerak, shunda u keyingi safar versiya raqamini ko'paytirganda avtomatik ravishda yangilanadi:

#qo'shing

#ta'rif TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE kompilyatsiya vaqtining // ta'rifiga qarab, oldinroq o'rnatiladi, ular hw turini aniqlaydi, masalan. #DISH BU_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // bu mening malina Pi serverim, 1880-bu NODE-RED standart porti // /yangilash-bu serverni "tinglash" uchun tanlagan url, so'ngra qurilma turi … bool actualUpdate (bool eskiz = noto'g'ri) {String xabari; t_httpUpdate_return qaytish; ESPhttpUpdate.rebootOnUpdate (noto'g'ri); if (eskiz) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Bu "ishni bajaradigan" qator}} boshqa {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("YANGILASH MUVOFIQ");

haqiqatga qaytish; } boshqa {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Yangilash muvaffaqiyatsiz tugadi");

}}} false qaytarish; }

7 -qadam: Nihoyat, yangilanishni boshlang

Yuklash vaqtida, yoki MQTT xabariga javoban (men qilganimdek) quyidagi kodni ishga tushiring:

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

// yoki SPIFFS uchun …

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

Qurilma o'zini yangilaydi va serverdan so'nggi kodni ishga tushiradi. Men uchun 33 ta qurilmani qo'lda yangilashdan ko'ra ancha sodda!

Mening blogimda uy avtomatizatsiyasi, IOT va ESP8266 dasturlash haqida ko'proq foydali ma'lumotlarni topishingiz mumkin

Tavsiya: