İçindekiler:

Bir ESP8266 Otomatik Güncelleme Sunucusu Kurun: 7 Adım
Bir ESP8266 Otomatik Güncelleme Sunucusu Kurun: 7 Adım

Video: Bir ESP8266 Otomatik Güncelleme Sunucusu Kurun: 7 Adım

Video: Bir ESP8266 Otomatik Güncelleme Sunucusu Kurun: 7 Adım
Video: ESP8266 NodeMCU Nedir, Nasıl Kullanılır? Örnek Web Server Projesi ve Arduino ile Kıyaslama 2024, Kasım
Anonim
Bir ESP8266 Otomatik Güncelleme Sunucusu Kurun
Bir ESP8266 Otomatik Güncelleme Sunucusu Kurun

Artık birçok kişi, ev otomasyon sistemleri için ESP8266'yı birçok kılıkta (ESP-01S, Wemos D1, NodeMCU, Sonoff vb.) kullanıyor. Kendi kodunuzu yazarsanız (benim yaptığım gibi) bunların her birini OTA (havadan) üzerinden bile ayrı ayrı güncellemek biraz sıkıcı olur.

Örneğin kendi sistemimde 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV ve ortak bir kod tabanını paylaşan bir NodeMCU var, yani basit bir kod yaptığımda güncellenecek toplam 33 cihaz var değiştirmek.

Ancak daha kolay bir yol var: Bir "güncelleme sunucusu". Mükemmel Arduino IDE + ESP8266 çekirdeği, işin çoğunu yapmak için bir kütüphaneye sahiptir (ESP8266httpUpdate), ancak çalışması için kendi sunucunuzu nasıl kuracağınızı bilmeniz gerekir.

Bu Eğitim Tablosu size bir NODE-RED sunucusunu nasıl kullanacağınızı gösterir, ancak aynı mantık seçtiğiniz herhangi bir sunucu teknolojisi için de geçerlidir; Apache + PHP vb.

Adım 1: İhtiyacınız Olan Şey

  1. Arduino IDE'si
  2. ESP8266 çekirdek
  3. 1M veya daha fazla flash RAM'e sahip herhangi bir ESP8266 geliştirme kartı
  4. Bir Web Sunucusu (mütevazı bir ahududu Pi bile yapacak - Ben bunu kullanıyorum)
  5. (isteğe bağlı) bir SPIFFS dosya sistemi görüntüsünü otomatik olarak güncellemek istiyorsanız mkspiffs aracı

Adım 2: İkili Ürün Yazılımlarını Tutmak için Bir Depo Oluşturun

İkili Yazılımları Barındıracak Bir Depo Oluşturun
İkili Yazılımları Barındıracak Bir Depo Oluşturun

Sunucumda, çeşitli aygıt yazılımlarını ve SPIFFS görüntülerini tutan /home/pi/trucFirmware adlı bir klasör var.

Her donanım türü için ayrı bir ikili dosya tutuyorum (birkaç #tanım içeren tek bir kaynak dosyadan) ve yeni bir sürüm hazır olduğunda her hedef cihaz için Arduino IDE "sketch/Export derlenmiş Binary" menü komutunu kullanıyorum. 5 farklı donanım türü olmasına rağmen, yalnızca iki SPIFFS ikili dosyası vardır: 1M ve 4M sürümü - mkspiffs aracıyla oluşturulmuştur - çünkü tüm cihazlarda 1M veya 4M flash bulunur.

Adım 3: İkili Dosyaları Oluşturun

Arduino IDE menü seçeneği Sketch/Export Compiled Binary'yi kullanarak, güncelleme sunucusundan talep ettiğinde cihaza yüklenecek firmware'i oluşturun.

Bir SPIFFS ikili dosyasına ihtiyacınız varsa, mkspiffs aracını yüklemeniz gerekecektir.

Bir kez sahip olduğunuzda, SPIFFS ikili dosyasını oluşturmak basittir. 1M sürümü için sürüm numarasını parametre olarak alan tek satırlık bir toplu iş dosyam var (%1)

mkspiffs -c veri/ spiffs_%1_1M.bin

ve 4M versiyonu için bir tane daha:

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

Daha sonra derlenmiş tüm ikili dosyaları ve SPIFFS.binary dosyalarını depoya kopyalarım

4. Adım: Sunucu Akışını Oluşturun

Sunucu Akışını Oluşturun
Sunucu Akışını Oluşturun

NODE-RED kullanıyorum, ancak basit mantık herhangi bir sunucu teknolojisinde/dilinde aynı olacaktır.

a) ESP8266httpUpdate isteğini dinleyecek bir url tanımlayın. RaspberryPi serevr'im 192.168.1.4'te ve eklenen donanım türüyle /update için 1880 numaralı bağlantı noktasını dinliyor. Yani bir Wemos D1 Mini için bir ikili dosya talep edeceksem, url şu şekilde biter:

192.168.1.4:1880/update/d1_mini

b) Aşağıdaki mantığı işlemek için kod oluşturun:

ESP8266: "Merhaba, a.b.c donanım yazılımı sürümünü çalıştırıyorum, daha yeni bir sürümünüz var mı?"Sunucu: "Bir bakalım…ah evet a.b.d var - işte geliyor…"

Daha yeni bir sürüm varsa, sunucu onu http yanıtında bir ikili veri yükü olarak gönderir. ESP8266httpUpdate sınıfı, ikili dosyayı belleğe kopyalamanın zor kısmını yapar, bellenim önyükleme adresini yeni kodla değiştirir (istenirse) yeni kodu çalıştırmak için aygıtı yeniden başlatmaktansa.

Öte yandan, daha yüksek bir sürüm yoksa, etkin bir şekilde "Senin için hiçbir şeyim yok" yazan bir http 304 hatasıyla yanıt verir ve kodunuz normal şekilde çalışmaya devam eder.

Adım 5: Sunucu Mantığını ekleyin

Akıştaki ilk düğüm, eklenen aygıt türüyle https://192.168.1.4:1880/update url'sine yönelik bir http isteğini "dinler". Bunu, aşağıdaki javascript koduna sahip "Arama yolu oluştur" işlev düğümüne iletir:

msg.type=msg.req.params.type;var h=msg.req.headers; msg.version=h["x-esp8266-sürüm"];

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

if(msg.mode=="sketch"){ 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"; } mesaj gönder;

Bu, takip eden ve basitçe çalışan sys işlevi için joker karakterli uygun yolu ayarlar.

ls - r

Çıktı daha sonra "Sürümleri karşılaştır" işlev düğümüne beslenir:

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

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

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("yükseltme gerekli");

node.warn("+msg.dosyaadı döndürür"); dönüş mesajı; } node.warn("yükseltme yok"); msg.statusCode=304; msg.payload=;

dönüş mesajı;

Anahtar düğümü daha sonra ya 304 "güncelleme gerekli değil" mesajının gönderilmesini ya da gerçek yeni ikili sistemin döndürülmesini ve cihaza geri gönderilmesini sağlar.

Adım 6: Güncelleme Talep Etmek için Çizime Kod Ekleyin

Sürüm numarasını bir sonraki artırışınızda otomatik olarak güncellenmesi için çizimde aşağıdaki kodun bulunması gerekir:

#Dahil etmek

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// BU_DEVICE, sonunda hw türünü tanımlayan çeşitli derleme zamanı tanımlamalarına bağlı olarak daha erken ayarlanır, örn. #define BU_DEVICE "d1_mini" const char * updateUrl="https://192.168.1.4:1880/update/"BU_CİHAZ; // bu benim ahududu Pi sunucum, 1880 varsayılan NODE-RED bağlantı noktasıdır // /update, sunucunun "dinlemesi" için seçtiğim url'dir, ardından aygıt türü gelir … bool factUpdate(bool sketch=false) { Dize mesajı; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate(yanlış); if(sketch){ ret=ESPhttpUpdate.update(updateUrl, TRUC_VERSION); // **************** "İşi yapan" satır budur } else { ret=ESPhttpUpdate.updateSpiffs(updateUrl, SPIFFS_VERSION); } if(ret!=HTTP_UPDATE_NO_UPDATES){ if(ret==HTTP_UPDATE_OK){

Serial.printf("GÜNCELLEME BAŞARILI");

true döndür; } else { if(ret==HTTP_UPDATE_FAILED){

Serial.printf("Yükseltme Başarısız");

} } } false döndür; }

7. Adım: Son olarak Güncellemeyi Başlatın

Önyükleme sırasında veya belki bir MQTT mesajına yanıt olarak (benim yaptığım gibi) aşağıdaki kodu çalıştırın:

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

// veya SPIFFS için…

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

Cihaz kendini güncelleyecek ve sunucudan en son kodu çalıştırarak yeniden başlatacaktır. Benim için 33 cihazı manuel olarak güncellemekten çok daha kolay!

Ev Otomasyonu, Nesnelerin İnterneti ve ESP8266'nın programlanması hakkında daha birçok yararlı bilgiyi Blogum'da bulabilirsiniz.

Önerilen: