Isi kandungan:

Sediakan Pelayan Kemas Kini Automatik ESP8266: 7 Langkah
Sediakan Pelayan Kemas Kini Automatik ESP8266: 7 Langkah

Video: Sediakan Pelayan Kemas Kini Automatik ESP8266: 7 Langkah

Video: Sediakan Pelayan Kemas Kini Automatik ESP8266: 7 Langkah
Video: Start Using Wemos D1 Mini NodeMCU WiFi ESP8266 module with Arduino 2024, Julai
Anonim
Sediakan Pelayan Kemas kini Automatik ESP8266
Sediakan Pelayan Kemas kini Automatik ESP8266

Banyak orang sekarang menggunakan ESP8266 dengan banyak penyamarannya (ESP-01S, Wemos D1, NodeMCU, Sonoff dll) untuk sistem automasi rumah. Sekiranya anda menulis kod anda sendiri (seperti saya) mengemas kini masing-masing secara berasingan walaupun melalui OTA (melalui udara) menjadi sedikit membosankan.

Sistem saya sendiri, misalnya mempunyai 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV dan NodeMCU yang berkongsi pangkalan kod yang sama, jadi terdapat 33 peranti yang perlu dikemas kini apabila saya membuat kod mudah ubah.

Tetapi ada cara yang lebih mudah: "pelayan kemas kini". Inti Arduino IDE + ESP8266 yang sangat baik mempunyai perpustakaan untuk melakukan sebahagian besar kerja (ESP8266httpUpdate), tetapi anda perlu mengetahui cara menyediakan pelayan anda sendiri untuk membuatnya berfungsi.

Instructable ini menunjukkan kepada anda bagaimana menggunakan pelayan NODE-RED, tetapi logik yang sama berlaku untuk teknologi pelayan pilihan anda, mis. Apache + PHP dll

Langkah 1: Apa yang Anda Perlu

  1. Arduino IDE
  2. Teras ESP8266
  3. Mana-mana papan dev ESP8266 dengan RAM kilat 1M atau lebih
  4. Pelayan Web (walaupun raspberry Pi yang rendah hati - Itu yang saya gunakan)
  5. (pilihan) alat mkspiffs jika anda ingin mengemas kini imej sistem fail SPIFFS secara automatik

Langkah 2: Buat Repositori untuk Memegang Firmware Perduaan

Buat Repositori untuk Memegang Firmware Perduaan
Buat Repositori untuk Memegang Firmware Perduaan

Di pelayan saya, saya mempunyai folder bernama / home / pi / trucFirmware yang menyimpan pelbagai perisian peranti dan gambar SPIFFS

Saya mengekalkan binari yang berasingan untuk setiap jenis perkakasan (dari satu fail sumber dengan beberapa # definisi) dan apabila pelepasan baru siap, saya menggunakan perintah menu Arduino IDE "sketch / Export compinary Binary" untuk setiap peranti sasaran. Perhatikan bahawa walaupun terdapat 5 jenis perkakasan yang berbeza, hanya ada dua binari SPIFFS: versi 1M dan 4M - dibina dengan alat mkspiffs - kerana semua peranti mempunyai flash 1M atau 4M.

Langkah 3: Buat Binari

Dengan menggunakan sketsa pilihan menu Arduino IDE / Export Compiled Binary, buat firmware yang akan dimuat ke peranti apabila memintanya dari pelayan kemas kini.

Sekiranya anda memerlukan binari SPIFFS, anda perlu memasang alat mkspiffs.

Setelah anda memilikinya, membina binari SPIFFS adalah mudah. Saya mempunyai fail kumpulan satu baris untuk versi 1M yang mengambil nombor versi sebagai parameter (% 1)

mkspiffs -c data / spiffs_% 1_1M.bin

dan satu lagi untuk versi 4M:

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

Saya kemudian menyalin semua binari yang disusun dan fail binari SPIFFS ke repositori

Langkah 4: Buat Aliran Pelayan

Buat Aliran Pelayan
Buat Aliran Pelayan

Saya menggunakan NODE-MERAH, tetapi logik mudah akan sama pada teknologi / bahasa pelayan mana pun.

a) Tentukan url yang akan mendengar permintaan ESP8266httpUpdate. RaspberryPi serevr saya ada pada 192.168.1.4 dan mendengar di port 1880 untuk / dikemas kini dengan jenis perkakasan yang dilampirkan. Oleh itu, jika saya akan meminta perduaan untuk Wemos D1 Mini, urlnya berakhir sebagai:

192.168.1.4:1880/update/d1_mini

b) Buat kod untuk menangani logik berikut:

ESP8266: "Hai, saya menjalankan versi firmware a.b.c, adakah anda mempunyai versi yang lebih baru?" Pelayan: "Biar saya lihat … ah ya saya ada a.b.d - ini dia …"

Sekiranya versi yang lebih baru wujud pelayan hanya menghantarnya sebagai muatan data binari dalam balasan http. Kelas Pembaharuan ESP8266http melakukan bahagian yang sukar untuk menyalin perduaan ke dalam memori, mengubah alamat but firmware ke kod baru daripada (jika diminta) menghidupkan semula peranti untuk menjalankan kod baru.

Sekiranya di sisi lain tidak ada versi yang lebih tinggi, ia membalas dengan ralat http 304 yang secara berkesan mengatakan: "Saya tidak mempunyai apa-apa untuk anda" dan kod anda terus berjalan seperti biasa.

Langkah 5: Tambahkan Logik Pelayan

Node pertama dalam aliran "mendengar" permintaan http untuk url https://192.168.1.4:1880/kemas kini dengan jenis peranti yang dilampirkan. Ia meneruskannya ke nod fungsi "Construct search path" yang mempunyai kod javascript berikut:

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

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

jika (msg.mode == "sketsa") {msg.payload = "/ home / pi / trucFirmware / *. ino." + msg.type + ". bin"; } lain {var sz = h ['x-esp8266-chip-size']; msg.payload = "/ home / pi / trucFirmware / spiffs _ * _" + (sz / 1048576) + "M.bin"; } kembalikan msg;

Ini hanya menetapkan jalan yang sesuai dengan wildcard untuk fungsi sys yang berikut, yang hanya berjalan

ls - r

Keluaran kemudian dimasukkan ke node fungsi "Bandingkan versi":

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

jika (msg.mode == "lakaran") {

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

jika (msg.version <f) {

node.warn ("diperlukan peningkatan");

node.warn ("akan kembali" + msg.filename); kembalikan msg; } node.warn ("tiada peningkatan"); msg.statusCode = 304; msg.payload = ;

kembalikan msg;

Node suis kemudian memastikan bahawa mesej 304 "tidak perlu kemas kini diperlukan" dihantar atau binari baru yang sebenarnya dikembalikan dan dihantar kembali ke peranti.

Langkah 6: Tambahkan Kod ke Sketsa untuk Meminta Kemas kini

Sketsa perlu memasukkan kod berikut di dalamnya sehingga ia akan dikemas kini secara automatik pada saat anda menambah nombor versi:

#sertakan

#tentukan TRUC_VERSION "0_4_99"

#tentukan SPIFFS_VERSION "0_5_0"

// THIS_DEVICE ditetapkan lebih awal bergantung pada pelbagai definisi masa kompilasi // yang akhirnya menentukan jenis hw, mis. #definisikan INI_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // ini adalah pelayan raspberry Pi saya, tahun 1880 adalah port NODE-MERAH lalai {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (false); jika (lakaran) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Inilah garis yang "menjalankan perniagaan"} lain {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } jika (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("KEMASKINI BERJAYA");

kembali benar; } lain {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Peningkatan Gagal");

}}} kembali palsu; }

Langkah 7: Akhirnya, Mulakan Kemas kini

Pada masa boot, atau mungkin sebagai tindak balas kepada mesej MQTT (seperti yang saya lakukan) jalankan kod berikut:

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

// atau untuk SPIFFS…

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

Peranti akan diperbaharui sendiri dan but semula menjalankan kod terkini dari pelayan. Jauh lebih mudah bagi saya daripada mengemas kini 33 peranti secara manual!

Banyak maklumat yang lebih berguna mengenai Automasi Rumah, IOT dan pengaturcaraan ESP8266 boleh didapati di Blog Saya

Disyorkan: