Mündəricat:

Bir ESP8266 Avtomatik Yeniləmə Serverini Qurun: 7 Addım
Bir ESP8266 Avtomatik Yeniləmə Serverini Qurun: 7 Addım

Video: Bir ESP8266 Avtomatik Yeniləmə Serverini Qurun: 7 Addım

Video: Bir ESP8266 Avtomatik Yeniləmə Serverini Qurun: 7 Addım
Video: Zigbee двусторонний энергомонитор постоянного тока MSH - интеграция DC UPS в Home Assistant 2024, Noyabr
Anonim
ESP8266 Avtomatik Yeniləmə Serverini qurun
ESP8266 Avtomatik Yeniləmə Serverini qurun

İndi bir çox insan ev avtomatlaşdırma sistemləri üçün ESP8266-nı bir çox görünüşlərində (ESP-01S, Wemos D1, NodeMCU, Sonoff və s.) İstifadə edir. Öz kodunuzu (mənim etdiyim kimi) yazsanız, bunların hər birini OTA (havada) vasitəsilə ayrıca yeniləmək bir qədər yorucu olur.

Mənim öz sistemim, məsələn, 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV və ortaq kod bazasını paylaşan bir NodeMCU-ya malikdir, buna görə də sadə bir kod hazırladığımda yenilənəcək 33 cihaz var. dəyişdirmək.

Ancaq daha asan bir yol var: "yeniləmə serveri". Mükəmməl Arduino IDE + ESP8266 nüvəsində işlərin çoxunu yerinə yetirmək üçün bir kitabxana var (ESP8266httpUpdate), ancaq işləmək üçün öz serverinizi necə quracağınızı bilməlisiniz.

Bu Təlimat NODE-RED serverinin necə istifadə edildiyini göstərir, lakin eyni məntiq seçdiyiniz hər hansı bir server texnologiyasına aiddir. Apache + PHP və s

Addım 1: Nə lazımdır

  1. Arduino IDE
  2. ESP8266 nüvəsi
  3. 1M və ya daha çox flash RAM ilə hər hansı bir ESP8266 inkişaf etdirici kartı
  4. Veb Server (hətta təvazökar bir moruq Pi də edəcək - İstifadə etdiyim budur)
  5. Bir SPIFFS fayl sistemi görüntüsünü avtomatik yeniləmək istəyirsinizsə (isteğe bağlı) mkspiffs aləti

Addım 2: İkili proqramları saxlamaq üçün bir depo yaradın

İkili Firmware saxlamaq üçün bir depo yaradın
İkili Firmware saxlamaq üçün bir depo yaradın

Serverimdə, müxtəlif cihaz proqramlarını və SPIFFS şəkillərini saxlayan/home/pi/trucFirmware adlı qovluğum var.

Hər bir hardware növü üçün ayrı bir ikili saxlayıram (bir neçə #defines olan bir mənbə faylından) və yeni bir buraxılış hazır olduqda, hər bir hədəf cihaz üçün Arduino IDE "tərtib edilmiş İxrac İkili" menyu əmrindən istifadə edirəm. 5 fərqli donanım növü olsa da, yalnız iki SPIFFS ikili var: 1M və 4M versiyası - mkspiffs vasitəsi ilə hazırlanmışdır - çünki bütün cihazlarda ya 1M, ya da 4M flaş var.

Addım 3: İkili faylları yaradın

Arduino IDE menyu eskiz/İxrac Edilmiş İkili seçimindən istifadə edərək, yeniləmə serverindən istədiyi zaman cihaza yüklənəcək firmware yaradın.

Bir SPIFFS ikili ehtiyacınız varsa, mkspiffs alətini quraşdırmalısınız.

Sahib olduqdan sonra SPIFFS ikili qurmaq çox sadədir. Versiya nömrəsini parametr olaraq qəbul edən 1M versiyası üçün bir satırlıq toplu faylım var (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

və 4M versiyası üçün başqa:

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

Daha sonra bütün tərtib edilmiş ikili faylları və SPIFFS.binary fayllarını depoya kopyalayıram

Addım 4: Server axını yaradın

Server axını yaradın
Server axını yaradın

NODE-RED istifadə edirəm, amma hər hansı bir server texnologiyasında / dildə sadə məntiq eyni olacaq.

a) ESP8266httpUpdate sorğusunu dinləyəcək bir url təyin edin. Mənim raspberryPi serevrim 192.168.1.4 -dədir və əlavə edilmiş hardware növü ilə /yenilənməsi üçün 1880 portunda dinləyir. Beləliklə, bir Wemos D1 Mini üçün ikili sənəd istəyəcəyəmsə, url belə bitir:

192.168.1.4:1880/update/d1_mini

b) Aşağıdakı məntiqi idarə etmək üçün kod yaradın:

ESP8266: "Salam, a.b.c firmware versiyasını işlədirəm, daha yeni bir versiyanız varmı?" Server: "Görüm … ah bəli, a.b.d var - bura gəlir …"

Daha yeni bir versiya varsa, server onu http cavabında ikili məlumat yükü olaraq göndərir. ESP8266httpUpdate sinfi, ikili quruluşu yaddaşa kopyalamağın çətin hissəsini yerinə yetirir, firmware açılış ünvanını yeni kodu dəyişdirmək üçün (tələb olunarsa) cihazı yeni kodu işə salmaq üçün yenidən başladın.

Digər tərəfdən daha yüksək bir versiya yoxdursa, bu, effektiv şəkildə "sizin üçün heç bir şeyim yoxdur" deyən bir http 304 xətası ilə cavab verir və kodunuz normal işləməyə davam edir.

Addım 5: Server Məntiqini əlavə edin

Axındakı ilk qovşaq, əlavə edilmiş cihaz növü ilə https://192.168.1.4:1880/update url üçün http sorğusunu "dinləyir". Bunu aşağıdakı JavaScript kodu olan "Axtarış yolunu qur" funksiya qovşağına keçir:

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

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

if (msg.mode == "eskiz") {msg.payload = "/home/pi/trucFirmware/*. ino."+msg.type+". bin"; } başqa {var sz = h ['x-esp8266-çip ölçüsü']; msg.payload = "/home/pi/trucFirmware/spiffs _*_"+(sz/1048576)+"M.bin"; } msg qaytar;

Bu, sadəcə işləyən sys funksiyası üçün joker ilə uyğun yolu qurur

ls - r

Çıxış daha sonra "Versiyaları müqayisə et" funksiyası qovşağına verilir:

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

əgər (msg.mode == "eskiz") {

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

if (msg.version <f) {

node.warn ("təkmilləşdirmə tələb olunur");

node.warn ("qayıdacaq"+msg.filename); msg qaytar; } node.warn ("təkmilləşdirmə yoxdur"); msg.statusCode = 304; msg.payload = ;

msg qaytar;

Keçid düyünü daha sonra 304 "yeniləməyə ehtiyac yoxdur" mesajının göndərilməsini və ya faktiki yeni ikili sənədin geri qaytarılmasını və cihaza geri göndərilməsini təmin edir.

Addım 6: Yeniləmə tələb etmək üçün Eskizə Kod əlavə edin

Növbəti versiya nömrəsini artırdığınız zaman eskizin avtomatik olaraq yenilənməsi üçün aşağıdakı kodun olması lazımdır:

#daxil edin

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE, əvvəlcədən hw növünü təyin edən // müxtəlif tərtib müddətlərindən asılı olaraq əvvəlcədən təyin olunur // #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // bu mənim moruq Pi serverimdir, 1880 standart NODE-RED portudur // /yeniləmə serverin "dinləməsi" üçün seçdiyim url, sonra cihaz növü… bool actualUpdate (bool eskiz = yalan) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (yalan); əgər (eskiz) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** "İşlə məşğul olan" xətti} başqa {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } əgər (ret! = HTTP_UPDATE_NO_UPDATES) {əgər (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

doğru qayıtmaq; } başqa {əgər (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Yeniləmə uğursuz oldu");

}}} false qaytar; }

Addım 7: Nəhayət, Yeniləməyə başlayın

Yükləmə zamanı və ya bəlkə də bir MQTT mesajına cavab olaraq (etdiyim kimi) aşağıdakı kodu işlədin:

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

// və ya SPIFFS üçün…

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

Cihaz özünü yeniləyəcək və serverdən ən son kodu işlədərək yenidən başlayacaq. Mənim üçün 33 cihazı əl ilə yeniləməkdən daha asandır!

Ev Otomasyonu, IOT və ESP8266 proqramlaşdırma haqqında daha çox faydalı məlumatı Blogumda tapa bilərsiniz

Tövsiyə: