Daftar Isi:

Siapkan Server Pembaruan Otomatis ESP8266: 7 Langkah
Siapkan Server Pembaruan Otomatis ESP8266: 7 Langkah

Video: Siapkan Server Pembaruan Otomatis ESP8266: 7 Langkah

Video: Siapkan Server Pembaruan Otomatis ESP8266: 7 Langkah
Video: #002 ESP8266 | Nodemcu - Membuat halaman web dan Routing di Server ESP8266 2024, November
Anonim
Siapkan Server Pembaruan Otomatis ESP8266
Siapkan Server Pembaruan Otomatis ESP8266

Banyak orang sekarang menggunakan ESP8266 dalam banyak samarannya (ESP-01S, Wemos D1, NodeMCU, Sonoff dll) untuk sistem otomasi rumah. Jika Anda menulis kode Anda sendiri (seperti yang saya lakukan) memperbarui masing-masing secara terpisah bahkan melalui OTA (over the air) menjadi sedikit membosankan.

Sistem saya sendiri, misalnya memiliki 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV dan NodeMCU yang berbagi basis kode yang sama, jadi ada 33 perangkat yang akan diperbarui ketika saya membuat kode sederhana mengubah.

Tetapi ada cara yang lebih mudah: "Server pembaruan". Inti Arduino IDE + ESP8266 yang sangat baik memiliki perpustakaan untuk melakukan sebagian besar pekerjaan (ESP8266httpUpdate), tetapi Anda perlu tahu cara mengatur server Anda sendiri untuk membuatnya berfungsi.

Instruksi ini menunjukkan kepada Anda bagaimana menggunakan server NODE-RED, tetapi logika yang sama berlaku untuk teknologi server apa pun pilihan Anda, mis. Apache + PHP dll

Langkah 1: Yang Anda Butuhkan

  1. Arduino IDE
  2. ESP8266 inti
  3. Papan dev ESP8266 apa pun dengan RAM flash 1M atau lebih
  4. Server Web (bahkan raspberry Pi yang sederhana akan melakukannya - Itu yang saya gunakan)
  5. (opsional) alat mkspiffs jika Anda ingin memperbarui gambar sistem file SPIFFS secara otomatis

Langkah 2: Buat Repositori untuk Menyimpan Firmware Biner

Buat Repositori untuk Menyimpan Firmware Biner
Buat Repositori untuk Menyimpan Firmware Biner

Di server saya, saya memiliki folder bernama /home/pi/trucFirmware yang menyimpan berbagai firmware perangkat dan gambar SPIFFS

Saya memelihara biner terpisah untuk setiap jenis perangkat keras (dari satu file sumber dengan beberapa #defines) dan ketika rilis baru sudah siap, saya menggunakan perintah menu "sketsa/Ekspor Biner yang dikompilasi" Arduino IDE untuk setiap perangkat target. Perhatikan bahwa bahkan meskipun ada 5 jenis perangkat keras yang berbeda, hanya ada dua biner SPIFFS: versi 1M dan 4M - dibuat dengan alat mkspiffs - karena semua perangkat memiliki flash 1M atau 4M.

Langkah 3: Buat Binari

Menggunakan sketsa opsi menu Arduino IDE/Export Compiled Binary, buat firmware yang akan diunggah ke perangkat saat memintanya dari server pembaruan.

Jika Anda memerlukan biner SPIFFS, Anda perlu menginstal alat mkspiffs.

Setelah Anda memilikinya, membangun biner SPIFFS itu sederhana. Saya memiliki file batch satu baris untuk versi 1M yang menggunakan nomor 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 dikompilasi dan file.binary SPIFFS ke repositori

Langkah 4: Buat Aliran Server

Buat Aliran Server
Buat Aliran Server

Saya menggunakan NODE-RED, tetapi logika sederhananya akan sama pada teknologi/bahasa server apa pun.

a) Tentukan url yang akan mendengarkan permintaan ESP8266httpUpdate. Serevr raspberryPi saya ada di 192.168.1.4 dan mendengarkan di port 1880 untuk /update dengan jenis perangkat keras yang ditambahkan. Jadi jika saya akan meminta biner untuk Wemos D1 Mini, url berakhir sebagai:

192.168.1.4:1880/update/d1_mini

b) Buat kode untuk menangani logika berikut:

ESP8266: "Hai, saya menjalankan versi firmware a.b.c, apakah Anda memiliki versi yang lebih baru?" Server: "Coba saya lihat … ah ya saya punya a.b.d - ini dia …"

Jika versi yang lebih baru memang ada, server hanya mengirimkannya sebagai beban data biner dalam balasan http. Kelas ESP8266httpUpdate melakukan bagian yang sulit dalam menyalin biner ke dalam memori, mengubah alamat boot firmware ke kode baru daripada (jika diminta) me-reboot perangkat untuk menjalankan kode baru.

Jika di sisi lain tidak ada versi yang lebih tinggi, itu membalas dengan kesalahan http 304 yang secara efektif mengatakan: "Saya tidak punya apa-apa untuk Anda" dan kode Anda terus berjalan seperti biasa.

Langkah 5: Tambahkan Logika Server

Node pertama dalam aliran "mendengarkan" permintaan http ke url https://192.168.1.4:1880/update dengan jenis perangkat yang ditambahkan. Ini meneruskan ini ke simpul fungsi "Buat jalur pencarian" yang memiliki kode javascript berikut:

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

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

if(msg.mode=="sketsa"){ 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"; } kembali pesan;

Ini hanya mengatur jalur yang sesuai dengan wildcard untuk fungsi sys yang mengikuti, yang hanya berjalan

ls - r

Outputnya kemudian diumpankan ke node fungsi "Bandingkan versi":

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

if(msg.mode=="sketsa"){

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

if(msg.version < f){

node.warn("perlu upgrade");

node.warn("akan mengembalikan "+msg.namafile); kembali pesan; } node.warn("tidak ada peningkatan"); msg.statusCode=304; msg.payload=;

kembali pesan;

Node sakelar kemudian memastikan bahwa pesan 304 "tidak diperlukan pembaruan" dikirim atau biner baru yang sebenarnya dikembalikan dan dikirim kembali ke perangkat.

Langkah 6: Tambahkan Kode ke Sketsa untuk Meminta Pembaruan

Sketsa harus memiliki kode berikut yang disertakan di dalamnya sehingga akan diperbarui secara otomatis saat berikutnya Anda menambah nomor versi:

#termasuk

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE diatur lebih awal tergantung pada berbagai definisi waktu kompilasi // yang akhirnya menentukan tipe hw, mis. #define THIS_DEVICE "d1_mini" const char * updateUrl="https://192.168.1.4:1880/update/"THIS_DEVICE; // ini adalah server raspberry Pi saya, 1880 adalah port NODE-RED default // /update adalah url yang saya pilih untuk "didengarkan" oleh server, diikuti oleh jenis perangkat … bool actualUpdate(bool sketch=false) { Pesan string; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate(salah); if(sketsa){ ret=ESPhttpUpdate.update(updateUrl, TRUC_VERSION); // **************** Ini adalah baris yang "melakukan bisnis" } else { ret=ESPhttpUpdate.updateSpiffs(updateUrl, SPIFFS_VERSION); } if(ret!=HTTP_UPDATE_NO_UPDATES){ if(ret==HTTP_UPDATE_OK){

Serial.printf("PEMBARUAN BERHASIL");

kembali benar; } else { jika(ret==HTTP_UPDATE_FAILED){

Serial.printf("Upgrade Gagal");

} } } mengembalikan salah; }

Langkah 7: Akhirnya, Mulai Pembaruan

Saat boot, atau mungkin sebagai tanggapan atas pesan MQTT (seperti yang saya lakukan) jalankan kode berikut:

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

// atau untuk SPIFFS…

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

Perangkat akan memperbarui dirinya sendiri dan reboot menjalankan kode terbaru dari server. Ini jauh lebih sederhana bagi saya daripada memperbarui 33 perangkat secara manual!

Banyak lagi informasi berguna tentang Otomasi Rumah, IOT, dan pemrograman ESP8266 dapat ditemukan di Blog Saya

Direkomendasikan: