ESP8266-01: OTA Update

Merhabalar, ESP wifi modulünü kablosuz işler için kullanıyoruz. Peki kablosuz programlama yapmak mümkün mü bu konuya değineceğim.

Giriş

OTA (Over the Air) update, ESP modülüne bir seri bağlantısı noktası yerine Wi-Fi bağlantısını kullanarak ESP modülüne sabit yazılım yükleme işlemidir. Bu gibi işlevler modüle zor ve hiç erişiminin olmadığı durumlarda yararlı olabilir.

OTA 3 farklı şekilde yapılabilir. Bunlar;

  • Arduino IDE’si yoluyla,
  • WEB browser yoluyla,
  • HTTP Server yoluyla.

Arduino IDE seçeneği öncelikle yazılım geliştirme aşamasında kullanılmak üzere tasarlanmıştır. Diğer iki seçenek, modülün bir web tarayıcısı ile manuel olarak veya bir http sunucusu kullanarak manuel olarak sağlanması için dağıtımdan sonrası için daha yararlı olacaktır.

Her durumda, ilk yazılım yüklemesi bir seri port üzerinden yapılmalıdır. OTA rutinleri doğru bir şekilde uygulanırsa, sonraki tüm yüklemeler kablosuz yapılabilir.

OTA işleminde saldırıya uğramamak için geliştirilen herhangi bir güvenlik protokolü yoktur. Güncellemelere yalnızca güvenilir kaynaktan izin verildiğinden emin olmak geliştiricinin sorumluluğundadır. Güncelleme tamamlandıktan sonra modül yeniden başlatılır ve yeni kod çalıştırılır. Geliştirici, modülde çalışan uygulamanın kapatıldığından ve güvenli bir şekilde yeniden başlatıldığından emin olmalıdır. Aşağıdaki bölüm OTA sürecinin güvenliği ve güvenliği ile ilgili ek bilgiler sağlar.

Güvenlik

Modülün yeni bir eskiz (sketch) ile güncellenmesi için kablosuz olarak yapılması gerekir. Bu, modülün kötü amaçla saldırıya uğrayabileceği ve başka bir kod yüklenme ihtimallerini ortaya çıkarmaktadır. Saldırıya uğramanın olasılığını azaltmak için, yüklemelerinizi bir şifreyle, belirli OTA bağlantı noktası vb. seçerek koruyabilirsiniz.

Güvenliği artıracak ArduinoOTA kütüphanesi ile sağlanan işlevselliği kontrol edelim:

void setPort(uint16_t port);
void setHostname(const char* hostname);
void setPassword(const char* password);

Bunun gibi belli koruma işlevleri önceden oluşturulmuştur ve geliştirici tarafından herhangi bir ek kodlama gerektirmez. ArduinoOTA ve espota.py, karşıdan yüklemeyi doğrulamak için Digest-MD5 kullanıyor. Aktarılan verilerin bütünlüğü, ESP tarafında MD5 kullanılarak doğrulanır.

Kendi risk analizinizi yapın ve uygulamaya bağlı olarak hangi kütüphane işlevlerini uygulayacağınıza karar verin. Gerekirse, diğer koruma yöntemlerinin saldırıya maruz kalmamak üzere uygulanmasını göz önünde bulundurun, ör. Sadece belirli bir programa göre yüklemeler için modül açığa, OTA yalnızca kullanıcı vb adanmış “Update” düğmesine basarak tetiklemek gibi senaryolar geliştirebilirsiniz.

Emniyet

OTA işlemi, yükleme sırasında ESP’nin kaynaklarını ve bant genişliğini alır. Ardından, modül yeniden başlatılır ve yeni bir eskiz (skecth) gerçekleştirilir. Mevcut ve yeni eskizinizin işlevselliğini nasıl etkilediğini analiz edin ve test edin.

ESP uzak bir yere yerleştirilirse ve bazı ekipmanları kontrol ediyorsanız, bu ekipmanın çalışması aniden güncelleme işlemi tarafından kesilirse ne olacağına dikkat etmeniz gerekir. Bu nedenle, güncellemeye başlamadan önce bu ekipmanın nasıl güvenli bir hale getirileceğine karar verin. Örneğin, modülünüz bahçe sulama sistemini sırayla kontrol ediyor olabilir. Bu sıra düzgün şekilde kapatılmazsa ve bir su vanası açık kalırsa, OTA bittikten ve modül yeniden başlatıldıktan sonra bu vana kapalı değilse, bahçeniz su basabilir.

Aşağıdaki işlevler ArduinoOTA kitaplığı ile sağlanır ve OTA’nın belirli aşamalarında veya OTA hatasında uygulamanızın işlevselliğini ele almayı amaçlar:

void onStart(OTA_CALLBACK(fn));
void onEnd(OTA_CALLBACK(fn));
void onProgress(OTA_CALLBACK_PROGRESS(fn));
void onError(OTA_CALLBACK_ERROR (fn));

 

Temel Gereksinimler

  • Skeç dosyasının iki katı büyüklüğünde flash chip hafızası

Aşağıdaki bölümlerde, OTA’nın yapılmasına ilişkin daha ayrıntılı bilgi ve özel yöntemler içermektedir.

 


1. Arduino IDE yoluyla

Arduino IDE’den kablosuz olarak modüller yüklemek, aşağıdaki tipik senaryolara yöneliktir:

  • Bir seri port üzerinden yüklemeye daha hızlı bir alternatif olarak yazılım geliştirme sırasında,
  • Küçük miktardaki modülleri güncellemek için,
  • Arduino IDE ile bilgisayarlar ve modüller aynı ağda bulunuyorsa,

Gereksinimler

  • ESP ve bilgisayar aynı ağda olmalıdır.

 

Uygulama Örneği

Şu anda OTA güncellemelerini destekleyen iki yazılım yapılandırması vardır. Bunlar;

  • Classic OTA: Arduino IDE 1.6.5 ve 1.6.5-947-g39819f0 (23 Temmuz 2015’tir) veya 1.6.5-1160-gef26c5f (30 Eylül 2015’in) ilk OTA uygulanmasını sağlayan platform paketinin sürümüdür ve henüz ArduinoOTA kütüphanesi olmadan destek için yazılmıştır. Bu özel konfigürasyonu Arduino IDE’de yapılandırmak daha kolaydır ve bu nedenle daha az tecrübeli kullanıcılar için önerilir. Aşağıdaki uygulama tanımları tamamıyla yayımlandıktan sonra  uygulamaya geçilecektir.
  • ArduinoOTA: Arduino-PR-4107-BUILD-421 ve ArduinoOTA kitaplığını içeren platform paketinin son sürümüdür. Bu yapılandırmada Arduino IDE ön hazırlığı bulunur ve daha tecrübeli kullanıcılar için tasarlanmıştır.

1.1 Classic OTA

  1. Başlamadan önce lütfen aşağıdakilerin kurulu olduğundan emin olun:
    • Arduino IDE ve ESP8266 kurulu desteği, https://github.com/esp8266/Arduino#installing-with-boards-manager adresinde anlatıldığı gibi
    • Python 2.7 (desteklenmeyen Python 3.5’i kurmayın): Not: Windows kullanıcıları “Path’a python.exe ekle” yi seçmelidir (aşağıya bakın – bu seçenek varsayılan olarak seçilmez).
  2. Şimdi seri port üzerinden yükleme için çizimi ve yapılandırmayı hazırlayın.
    • Arduino IDE’yi başlatın ve Dosya> Örnekler> ESP8266mDNS altında DNS_SD_Arduino_OTA.ino dosyasını yükleyin.Not: Bu çizim, Arduino IDE’ye yüklenen platform paketlerinin yalnızca 1.6.5-947-g39819f0 (23 Temmuz 2015’in) ve 1.6.5-1160-gef26c5f’nin (30 Eylül 2015’in) sürümleri için kullanılabilir. https://github.com/esp8266/Arduino#installing-with-boards-manager  #980‘de GitHub deposundan kaldırıldı.
    • Modül Wi-Fi ağınıza katılabilmeniz için SSID’yi ve parolayı çizimde güncelleyin;
    • Yükleme parametrelerini aşağıdaki gibi yapılandırın (farklı bir modül kullanıyorsanız yapılandırmayı ayarlamanız gerekebilir);
  3. Kroki yükle (Ctrl + U). Seri Monitör’ü açtıktan sonra (Ctrl + ÜstKrkt + M) modülün Wi-Fi ağınıza katıp katılmadığını kontrol edin.
  4. Sadece modül ağa bağlıysa, birkaç saniye sonra esp8266-ota portu Arduino IDE’de görünecektir:
  5. Yapılandırma ayarlarını aşağıdaki gibi değiştirerek ilk OTA yüklemeniz için hazır olun:
  6. Yukarıdaki tüm adımları başarıyla tamamladıysanız, OTA üzerinde aynı (veya başka herhangi bir) eskizi yükleyebilirsiniz (Ctrl + U):

Not: Çiziminizi OTA kullanarak defalarca yükleyebilmek için OTA rutinlerini içine yerleştirmelisin. Örnek olarak lütfen DNS_SD_Arduino_OTA.ino’yu kullanın.

 

1.2 ArduinoOTA

  1. Aşağıdaki yazılımı yükleyin ve kurun:
  2. Bunun yerine BasicOTA.ino veya OTALeds.ino eskizini kullanarak Klasik OTA Yapılandırması altındaki 2. adıma geçin.
  3. Kalan adımlarla devam edin.

 

 

Bu konuyla ilgili github kodlarıma buradan ulaşabilirsiniz. > https://github.com/haknkayaa/esp8266-ota


 

2. Web Browser yoluyla

Bu bölümde açıklanan güncellemeler, aşağıdaki tipik senaryolarda yararlı olabilecek bir web tarayıcısı ile yapılır:

  • Uygulama dağıtımı sonrası Arduino IDE’den direkt olarak yükleme yapılması uygunsuz veya mümkün değilse,
  • Dağıtımdan sonra kullanıcı güncelleme sunucularından güncelleyemeyecek durumdaysa,
  • Bazı modüller için güncelleme sunucusu ayarlamak mümkün değilse bu yolla güncelleme yapılabilir.

 

Gereksinimler

  • ESP ve bilgisayar aynı ağa bağlı olmalıdır.

 

Uygulamaya Genel Bakış

Bir web tarayıcı güncellemeleri, ESP8266WebServer ve ESP8266mDNS sınıflarıyla birlikte ESP8266HTTPUpdateServer sınıfını kullanarak gerçekleştirilir. Çalışması için aşağıdaki kod gereklidir:

setup()

    MDNS.begin(host);

    httpUpdater.setup(&httpServer);
    httpServer.begin();

    MDNS.addService("http", "tcp", 80);

loop()

    httpServer.handleClient();

 

Uygulama Örneği

Aşağıda verilen örnek uygulama şu yöntemlerle yapılmıştır:

  • ESP8266HTTPUpdateServer kitaplığında mevcut olan WebUpdater.ino eskiz taslağı
  • NodeMCU 1.0 (ESP-12E Modülü)

“Flash çip boyutu, eskizin 2x boyutu” gereksinimini karşılıyorsa, başka bir modül kullanabilirsiniz.

  1. Başlamadan önce lütfen aşağıdaki yazılımların yüklü olduğundan emin olun:
    • Arduino IDE ve 2.0.0-rc1 (17 Kasım 2015’in) platform paketinin sürümü https://github.com/esp8266/Arduino#installing-with-boards-manager
    • Kullandığınız işletim sistemine bağlı olarak host yazılımı:
  2. Bir seri port ile ilk yükleme için eskiz ve konfigürasyon hazırlayın.
    • Arduino IDE’yi başlatın ve Dosya> Örnekler> ESP8266HTTPUpdateServer altında Eskiz WebUpdater.ino yükleyin.
    • Modülü Wi-Fi ağınıza dahil edebilmek için ssid’i güncelleyin ve çizimi geçin.
    • Dosya> Tercihler’i açın, “Ayrıntılı çıktıları göster” i arayın ve “derleme” seçeneğini işaretleyin.
  3. Eskiz yükle (Ctrl + U). Seri Monitör’ü açtıktan sonra (Ctrl + ÜstKrktr + M) OTA güncellemesi için url içeren aşağıdaki mesajı görüp görmediğini kontrol edin. (Not: Bu mesaj, yalnızca modül başarıyla ağa katıldığında ve bir OTA yüklemesi için hazır olduğunda görüntülenecektir.)
  4. Şimdi web tarayıcısını açın ve Seri Monitör’de sağlanan url’yi girin, yani http: //esp8266-webupdate.local/update. Girildiğinde, tarayıcı modülünüz tarafından sunulan aşağıdaki gibi bir formu görüntülemelidir. Form sizi güncelleme için bir dosya seçmeye davet ediyor.
    • Not: “http: //esp8266-webupdate.local/update” girilemiyorsa, “esp8266-webupdate” adresini modülün IP adresiyle değiştirmeyi deneyin. Örneğin, modül IP’niz “192.168.1.100” ise url “http://192.168.1.100/update” olmalıdır. Bu geçici çözüm, 2. adımda yüklü ana yazılımın çalışmaması durumunda yararlıdır. Sabit Monitör’de hala bir şey yoksa ve ipucu yoksa, Google Chrome’da sağlanan url’yi açıp F12’ye basarak ve “Konsol” ve “Ağ” sekmelerinin içeriğini kontrol ederek sorunu teşhis etmeye çalışın. Chrome bu sekmelerde bazı gelişmiş günlüğe kaydetme sağlar.
  5. Dosyayı edinmek için Arduino IDE tarafından derleme sonuçlarını saklamak için kullanılan dizine gidin. Aşağıda işaretlendiği gibi IDE hata ayıklama penceresinde gösterilen derleme günlüğünde bu dosyanın yolunu kontrol edebilirsiniz.
  6. Şimdi web tarayıcısında “Dosya Seç” düğmesine basın, yukarıdaki 5. adımda tanımlanan dizine gidin, “WebUpdater.cpp.bin” dosyasını bulun ve yükleyin. Yükleme başarılı olursa, aşağıdaki gibi web tarayıcısında “Tamam” ı göreceksiniz.
    • Seri Monitör’de görünür olması gereken Modül yeniden başlatılacak:

Bu prosedürü tamamladıktan sonra, WebUpdater.ino eskizini değiştirerek bazı ek mesajlar yazdırabilir, derleyebilir, yeni binary dosyalar bulabilir ve Seri Monitör’de girilen değişiklikleri görmek için web tarayıcısı kullanarak yükleyebilirsiniz.

Yukarıdaki Uygulama Genel Bakış’taki yönergeleri izleyerek OTA rutinlerini kendi çiziminize de ekleyebilirsiniz. Bu doğru yapılırsa, bir web tarayıcısı kullanarak bir öncekinin üzerine yeni bir çizim yükleyebilirsiniz.

Eskiz defterinize modifikasyonlar girdikten sonra OTA güncellemesi başarısız olursa, modülü seri bağlantı noktasına yükleyerek her zaman kurtarabilirsiniz. Ardından, Seri Monitör’ü kullanarak eskiz ile konuyu teşhis edin. Sorun giderildikten sonra OTA’yı tekrar deneyin.

 


 

3. HTTP Server yoluyla

ESPhttpUpdate sınıfı güncellemeleri kontrol edebilir ve HTTP web sunucusundan bir binary dosya indirebilir. Güncellemeleri ağdaki veya internetteki herhangi IP veya alan adından indirmek mümkündür.

Gereksinimler

  • Web server

 

Basit güncelleyici

Basit güncelleyici için sunucunun güncelleme için binary (.bin) dosyasını sunması yeterlidir.

 

Gelişmiş güncelleyici

Sunucuda bir komut dosyasına güncelleme işlevini işaret etmek mümkündür. Sürüm dizesi bağımsız değişkeni verilirse, sunucuya gönderilir. Sunucu tarafı komut dosyası, güncellemenin gerçekleştirilip gerçekleştirilmemesi gerektiğini kontrol etmek için bunu kullanabilir.

Sunucu tarafı betiği şu şekilde tepki verebilir: – yanıt kodu 200 ve firmware güncellemesi – veya yanıt kodu 304’ü göndererek ESP’ye güncelleme gerekmediğini bildirir.

t_httpUpdate_return ret = ESPhttpUpdate.update("192.168.0.2", 80, "/esp/update/arduino.php", "optional current version string here");
switch(ret) {
    case HTTP_UPDATE_FAILED:
        Serial.println("[update] Update failed.");
        break;
    case HTTP_UPDATE_NO_UPDATES:
        Serial.println("[update] Update no Update.");
        break;
    case HTTP_UPDATE_OK:
        Serial.println("[update] Update ok."); // may not called we reboot the ESP
        break;
}

Gelişmiş güncelleme yönetimi için bir betik, sunucu tarafında, örneğin bir PHP betiği gibi çalışmalıdır. Her güncelleme talebinde, ESP sunucuya HTTP başlıklarında bazı bilgiler gönderir.

Example header data: [HTTP_USER_AGENT] => ESP8266-http-Update [HTTP_X_ESP8266_STA_MAC] => 18:FE:AA:AA:AA:AA [HTTP_X_ESP8266_AP_MAC] => 1A:FE:AA:AA:AA:AA [HTTP_X_ESP8266_FREE_SPACE] => 671744 [HTTP_X_ESP8266_SKETCH_SIZE] => 373940 [HTTP_X_ESP8266_CHIP_SIZE] => 524288 [HTTP_X_ESP8266_SDK_VERSION] => 1.3.0 [HTTP_X_ESP8266_VERSION] => DOOR-7-g14f53a19

 

Bu bilgilerle, betik artık bir güncellemenin gerekli olup olmadığını kontrol edebilir. Örneğin, MAC adresine dayalı farklı ikili dosyalar sunmak da mümkündür.

Script örneği;

<?PHP

header('Content-type: text/plain; charset=utf8', true);

function check_header($name, $value = false) {
    if(!isset($_SERVER[$name])) {
        return false;
    }
    if($value && $_SERVER[$name] != $value) {
        return false;
    }
    return true;
}

function sendFile($path) {
    header($_SERVER["SERVER_PROTOCOL"].' 200 OK', true, 200);
    header('Content-Type: application/octet-stream', true);
    header('Content-Disposition: attachment; filename='.basename($path));
    header('Content-Length: '.filesize($path), true);
    header('x-MD5: '.md5_file($path), true);
    readfile($path);
}

if(!check_header('HTTP_USER_AGENT', 'ESP8266-http-Update')) {
    header($_SERVER["SERVER_PROTOCOL"].' 403 Forbidden', true, 403);
    echo "only for ESP8266 updater!\n";
    exit();
}

if(
    !check_header('HTTP_X_ESP8266_STA_MAC') ||
    !check_header('HTTP_X_ESP8266_AP_MAC') ||
    !check_header('HTTP_X_ESP8266_FREE_SPACE') ||
    !check_header('HTTP_X_ESP8266_SKETCH_SIZE') ||
    !check_header('HTTP_X_ESP8266_CHIP_SIZE') ||
    !check_header('HTTP_X_ESP8266_SDK_VERSION') ||
    !check_header('HTTP_X_ESP8266_VERSION')
) {
    header($_SERVER["SERVER_PROTOCOL"].' 403 Forbidden', true, 403);
    echo "only for ESP8266 updater! (header)\n";
    exit();
}

$db = array(
    "18:FE:AA:AA:AA:AA" => "DOOR-7-g14f53a19",
    "18:FE:AA:AA:AA:BB" => "TEMP-1.0.0"
);

if(isset($db[$_SERVER['HTTP_X_ESP8266_STA_MAC']])) {
    if($db[$_SERVER['HTTP_X_ESP8266_STA_MAC']] != $_SERVER['HTTP_X_ESP8266_VERSION']) ) {
        sendFile("./bin/".$db[$_SERVER['HTTP_X_ESP8266_STA_MAC']]."bin");
    } else {
        header($_SERVER["SERVER_PROTOCOL"].' 304 Not Modified', true, 304);
    }
    exit();
}

header($_SERVER["SERVER_PROTOCOL"].' 500 no version for ESP MAC', true, 500);

 

Akış Arabirimi

TODO, Akış Arayüzünü tanımlar

Akış Arayüzü, OTA, http Server / istemci gibi diğer tüm güncelleme modlarının temelidir.

Güncelleyici sınıfı

TODO Updater sınıfını tanımlar

Updater Core’da ve firmware’i flaşa yazarken, bütünlüğünü kontrol ederken ve önyükleyiciye yeni önyüklemede yeni bellenimi yüklemesini söylüyor.

 


 

 

Kaynak:

Resimler ve içerik konusunda http://esp8266.github.io/Arduino/versions/2.0.0/doc/ota_updates/ota_updates.html ‘den yararlanılmıştır.

 

Hakan Kaya
Yarı zamanlı mühendis. Yarı zamanlı eğitmen. Biraz da film sever.
error: 5846 sayılı Fikir ve Sanat Eserleri Kanunu tarafında içeriklerin izinsiz kopyalanması, paylaşılması ve çoğaltılması yasaktır.