OTA Updates

出自YFRobotwiki
在2017年5月24日 (三) 09:46由Allblue對話 | 貢獻所做的修訂版本

(差異) ←上個修訂 | 最新修訂 (差異) | 下一修訂→ (差異)
跳轉到: 導覽搜尋

最新原文文檔地址:ESP8266 Arduino Core-latest version


介紹 Introduction

OTA(空中)更新是使用Wi-Fi連接而不是串行端口將固件加載到ESP模塊的過程。在對模塊進行有限或無物理訪問的情況下,這種功能變得非常有用。

OTA需要一下幾個方面的支持:

  • Arduino IDE
  • Web Browser
  • HTTP Server

Arduino IDE選項主要用於軟件開發階段。 另外兩個選項將在部署後更有用,通過Web瀏覽器手動提供應用程序更新模塊,或者自動使用http服務器。 在任何情況下,必須通過串行端口完成第一個固件上傳。 如果OTA例程在草圖中正確實現,則所有後續上傳都可以在空中完成。

OTA進程沒有強加的安全性被黑客入侵。確保開發人員只能從合法/受信任的來源獲得更新。更新完成後,模塊將重新啟動,並執行新的代碼。開發人員應確保在模塊上運行的應用程序以安全的方式關閉並重新啟動。以下章節提供有關OTA過程的安全性和安全性的其他信息。

保密性 Security

模塊必須以無線方式顯示,以便通過新的草圖進行更新。 這使得模塊被強行入侵併加載了其他代碼。 為了減少被黑客入侵的可能性,請考慮使用密碼保護您的上傳,選擇某些OTA端口等。

檢查可以提高安全性的ArduinoOTA庫提供的功能:

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

已經內置了某些保護功能,不需要開發人員進行任何其他編碼。ArduinoOTA和espota.py使用Digest-MD5來驗證上傳。使用MD5校驗和,在ESP端驗證傳輸數據的完整性。

進行自己的風險分析,並根據應用決定什麼庫功能來實現。如果需要,請考慮實施其他保護手段被黑客入侵。僅根據具體時間安排上傳的模塊,觸發OTA只能按用戶專用的“更新”按鈕連接到ESP等。

安全性 Safety

OTA過程在上傳過程中採用ESP的資源和帶寬。然後重新啟動模塊並執行新的草圖。分析和測試它如何影響現有和新草圖的功能。

如果將ESP放置在遠程位置並控制某些設備,則應該額外注意如果本設備的操作突然被更新過程中斷,會發生什麼。因此,在開始更新之前,請決定如何將本設備置於安全狀態。例如,您的模塊可能會按順序控制花園澆水系統。如果這個順序沒有正確關閉並且水閥打開,你的花園可能會被淹沒。

ArduinoOTA庫提供以下功能,旨在處理OTA特定階段應用程序的功能或OTA錯誤:

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

基本要求 Basic Requirements

閃存芯片尺寸應該能夠同時保持舊的草圖(當前正在運行)和新的草圖(OTA)。

請記住文件系統和EEPROM例如需要的空間(一次)也看到閃光布局。

ESP.getFreeSketchSpace();

可用於檢查新草圖的可用空間。

有關內存布局的概述,存儲新草圖以及在OTA過程中如何複製它們,請參閱更新進程 - 內存視圖

以下章節提供了更多的細節和具體的OTA做法。

Arduino IDE

從Arduino IDE無線上傳模塊適用於以下典型場景: - 在固件開發過程中,通過串行加載更快的替代方案 - 用於更新少量模塊 - 只有模塊在與Arduino IDE的計算機相同的網絡上可用。

要求 Requirements

  • ESP和計算機必須連接到同一個網絡。

應用實例 Application Example

以下說明在NodeMCU 1.0(ESP-12E Module)板上配置OTA。你可以使用任何其他董事假定其符合要求,如上所述。該指令適用於Arduino IDE支持的所有操作系統。在Windows 7上進行了屏幕截圖,如果您使用的是Linux和MacOS,您可能會看到較小的差異(如串行端口名稱)。

1.在開始之前,請確保您安裝了以下s / w:

- Arduino IDE 1.6.7或更高版本 - https://www.arduino.cc/en/Main/Software

- esp8266 / Arduino平台軟件包2.0.0或更新 - 有關說明請遵循 https://github.com/esp8266/Arduino#installing-with-boards-manager

- Python 2.7(不安裝不支持的Python 3.5) - https://www.python.org/

注意: Windows用戶應選擇“將python.exe添加到路徑”(見下文 - 默認情況下未選擇此選項)。

fetch

2.現在準備通過串行端口上傳的草圖和配置。 - 啟動Arduino IDE並加載草圖BasicOTA.ino可在File> Examples> ArduinoOTA下找到

fetch1

- 在草圖中更新SSID和密碼,以便模塊可以加入您的Wi-Fi網絡

fetch2

- 配置上傳參數如下(如果使用不同的模塊,可能需要調整配置):

fetch3


注意:根據平台包和板的版本,您可能會 Upload Using: 在上面的菜單中看到。此選項不活動,您選擇的內容並不重要。它已經與舊版OTA實現兼容,目標是在平台軟件包版本2.2.0中進行刪除。


3.上傳草圖(Ctrl + U)。完成後,打開串行監視器(Ctrl + Shift + M)並檢查模塊是否已加入Wi-Fi網絡:

fetch4

只有模塊連接到網絡,幾秒鐘後,esp8266- ota端口將顯示在Arduino IDE中。選擇串行監視器中顯示的IP地址的端口,步驟如下:

fetch5

注意:如果OTA端口沒有出現,請退出Arduino IDE,再次打開並檢查端口是否存在。如果沒有幫助檢查您的防火牆設置。


4.現在通過選擇OTA端口為您的第一個OTA上傳做好準備:

fetch6

注意:菜單條目 Upload Speed: 在這一點上並不重要,因為它涉及串行端口。只是保持不變。

5.如果您已成功完成上述所有步驟,您可以通過OTA上傳(Ctrl + U)相同(或任何其他)草圖:

fetch7

注意:為了能夠一遍又一遍地使用OTA上傳草圖,您需要在其中嵌入OTA例程。請以BasicOTA.ino為例。


密碼保護

使用密碼 保護您的OTA上傳是非常簡單的。所有你需要做的,是在你的代碼中包括以下語句:

ArduinoOTA.setPassword((const char *)"123");

其中123是您應該用自己替換的樣本密碼。

在草圖中實現之前,最好使用 File > Examples > ArduinoOTA 下的BasicOTA.ino草圖來檢查它的工作原理。繼續,打開BasicOTA.ino,取消注釋已經存在的上述語句,並上傳草圖。為了使故障排除更容易,除了絕對需要的外,不要修改示例草圖。這包括原始簡單的OTA密碼。然後嘗試再次上傳草圖(使用OTA)。編譯完成後,一旦上傳即將開始,您將看到如下提示輸入密碼:123

fetch8

輸入密碼,上傳應該像往常一樣啟動,唯一的區別是 Authenticating...OK 消息在上傳日誌中可見。

fetch9

下次不會提示您重新輸入相同的密碼。Arduino IDE會為您記住它。只有在重新打開IDE之後,才會看到提示輸入密碼,或者如果您在草圖中更改密碼,請上傳草圖,然後嘗試重新上傳。

請注意,如果IDE自上次上傳以來尚未關閉,可以顯示以前在Arduino IDE中輸入的密碼。這可以通過在“文件”>“首選項”中上傳,並嘗試上傳模塊來啟用“ 顯示詳細”輸出。

fetch10

上圖顯示了密碼在日誌中可見,因為它被傳遞給espota.py上傳腳本。

下面的另一個例子顯示了在上傳之間更改密碼時的情況。

fetch11

上傳時,Arduino IDE使用以前輸入的密碼,因此上傳失敗,並已由IDE清楚報告。只有IDE才提示輸入新密碼。正確輸入,第二次上傳嘗試已成功。


故障排除

如果OTA更新失敗,首先要檢查可能在Arduino IDE的上傳窗口中顯示的錯誤消息。如果沒有提供任何有用的提示,請嘗試在檢查ESP在串行端口上顯示的內容時再次上傳。在這種情況下,IDE的串行監視器將不會有用。嘗試打開它時,您可能會看到以下內容:

fetch12

這個窗口是為ArduinoYún而尚未實現的esp8266 / Arduino。它出現,因為IDE嘗試使用您為OTA上傳選擇的網絡端口打開串行監視器。

相反,您需要一個外部串行監視器。如果您是Windows用戶,請查看Termite。這是方便,光滑和簡單的RS232端子,不強制RTS或DTR流量控制。如果使用各自的線路切換ESP上的GPIO0和RESET引腳進行上傳,則此類流量控制可能會導致問題。

在外部終端程序中選擇COM端口和波特率,就像使用Arduino串行監視器一樣。請參閱以下Termite的典型設置:

fetch13

然後從IDE 運行OTA,看看終端上顯示的內容。使用BasicOTA.ino草圖的成功ArduinoOTA過程如下所示(IP地址取決於您的網絡配置):

fetch14

如果上傳失敗,您可能會看到上傳者捕獲的錯誤,異常和堆棧轉儲,或兩者兼而有之。

OTA故障 的最常見原因如下:*芯片上沒有足夠的物理內存(例如,具有512K閃存的ESP01,對於OTA來說不夠),*為SPIFFS指定了太多的內存,因此新的草圖將不適合現有的草圖和SPIFFS - 請參閱 更新過程 - 內存視圖,*在Arduino IDE中為您選定的電路板聲明的內存太少(即小於物理大小)。

有關閃存布局的更多詳細信息,請檢查文件系統。有關存儲新草圖的概述,如何複製以及如何為OTA目的組織內存,請參閱更新進程 - 內存視圖


網頁瀏覽器 Web Browser

本章中描述的更新使用可在以下典型場景中使用的Web瀏覽器:

  • 應用程序部署後,直接從Arduino IDE加載是不方便或不可能的
  • 部署後,如果用戶無法從外部更新服務器公開OTA的模塊
  • 在設置更新服務器不可行時,將部署後的更新提供給少量模塊

要求 Requirements

  • ESP和計算機必須連接到同一個網絡。

實施概況 Implementation Overview

使用Web瀏覽器的更新是使用 ESP8266HTTPUpdateServer 類 ESP8266WebServer 和 ESP8266mDNS 類一起實現的。需要以下代碼才能使其工作:

setup()

	MDNS.begin(host);
 
	httpUpdater.setup(&httpServer);
	httpServer.begin();
 
	MDNS.addService("http", "tcp", 80);


loop()

        httpServer.handleClient();


應用例程 Application Example

以下提供的示例實現使用:

  • ESP8266HTTPUpdateServer 庫中的示例草圖WebUpdater.ino
  • NodeMCU 1.0(ESP-12E模塊)

如果符合先前desribed您可以使用另一個模塊的要求。

1.在開始之前,請確保您已安裝以下軟件:

- Arduino IDE和2.0.0-rc1(2015年11月17日)版本的平台包,如 https://github.com/esp8266/Arduino#安装与板管理器

- 主機軟件取決於您使用的O / S:

a. Avahi http://avahi.org/ for Linux
b. Bonjour http://www.apple.com/support/bonjour/ for Windows
c. Mac OSX和iOS - 支持已經內置/不需要任何額外的s / w

2.使用串行端口準備草圖和配置以進行初始上傳。

- 啟動Arduino IDE並加載草圖WebUpdater.ino,可在File> Examples> ESP8266HTTPUpdateServer中找到。

- 在草圖中更新SSID和密碼,以便模塊可以加入您的Wi-Fi網絡。

- 打開文件>首選項,查找“顯示詳細輸出期間:/ Show verbose output during:”,並查看“編譯/complation”選項。

fetch15

注意:在下面的步驟5中將需要此設置。之後,您可以取消選中此設置。

3.上傳草圖(Ctrl + U)。完成打開串行監視器(Ctrl + Shift + M)並檢查是否看到顯示以下消息,其中包含OTA更新的URL 。

fetch16

注意:只有模塊成功加入網絡並準備進行OTA上傳後,才會顯示此類消息。

4.現在打開Web瀏覽器並輸入Serial Monitor提供的URL,即 http://esp8266-webupdate.local/update。一旦输入,浏览器应该显示下面由您的模块提供的表单。表单邀请您选择要更新的文件。

fetch17

注意:如果輸入 http://esp8266-webupdate.local/update 不起作用,請嘗試 esp8266-webupdate 使用模塊的IP地址替換。例如,如果你的模塊IP是 192.168.1.100 url應該是 http://192.168.1.100/update 。如果步驟2中安裝的主機軟件不起作用,此解決方法很有用。如果仍然沒有任何工作,串行監視器上沒有任何線索,請嘗試通過在Google Chrome中打開提供的網址來診斷問題,然後按F12並檢查“控制台”和“網絡”選項卡的內容。Chrome在這些標籤上提供了一些高級日誌記錄。

5.要獲取文件導航到Arduino IDE使用的目錄來存儲編譯結果。您可以在IDE調試窗口中顯示的編譯日誌中檢查此文件的路徑,如下所示。

fetch18

6.現在在網絡瀏覽器中按“選擇文件”,進入上述步驟5中找到的目錄,找到文件“WebUpdater.cpp.bin”並上傳。如果上傳成功,您將在下面的Web瀏覽器中看到“OK”。

fetch19

模塊將重新啟動,應該在串行監視器上可見:

fetch20

重新啟動後,您應該看到完全相同的消息, HTTPUpdateServer ready! Open http:// esp8266-webupdate.local /update in your browser如步驟3.這是因為模塊已重新加載相同的代碼 - 首先使用串行端口,然後使用OTA。

一旦你對這個程序感到舒服,就可以修改WebUpdater.ino草圖來打印一些額外的消息,編譯它,找到新的二進制文件並使用Web瀏覽器上傳,以便在串行監視器上查看輸入的更改。

您還可以按照上述實施概述中的準則,將OTA例程添加到您自己的草圖中。如果這樣做正確,您應該總是能夠使用Web瀏覽器上傳新的草圖。

如果在草圖中輸入修改後OTA更新失敗,您可以隨時通過將其加載到串行端口來恢復模塊。然後使用串行監視器用草圖診斷問題。一旦問題被修復,再次嘗試OTA。


HTTP服務器

ESPhttpUpdate類可以檢查更新並從HTTP Web服務器下載二進制文件。可以從網絡或Internet上的每個IP或域名地址下載更新。


要求

- 網絡服務器


Arduino代碼

簡單的更新程序

簡單的更新程序每次調用函數時都會下載該文件。

ESPhttpUpdate.update("192.168.0.2", 80, "/arduino.bin");

高級更新器

它可以將更新功能指向服務器上的腳本。如果給出版本字符串參數,它將被發送到服務器。服務器端腳本可以使用它來檢查是否應該執行更新。

服務器端腳本可以如下響應: - 響應代碼200,並發送固件映像,或響應代碼304,通知ESP,不需要更新。

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;
}


服務器請求處理

簡單的更新程序

對於簡單的更新程序,服務器只需要提供二進制文件進行更新。

高級更新器

對於高級更新管理,腳本需要在服務器端運行,例如PHP腳本。在每次更新請求時,ESP將HTTP頭中的一些信息發送到服務器。

標題數據示例:

    [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] => 4194304
    [HTTP_X_ESP8266_SDK_VERSION] => 1.3.0
    [HTTP_X_ESP8266_VERSION] => DOOR-7- g14f53a19

有了這個信息,腳本現在可以檢查是否需要更新。例如,也可以根據MAC地址傳送不同的二進制文件。

腳本示例:


<?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);

流接口 Stream Interface

TODO描述流界面

流接口是所有其他更新模式(如OTA,http服務器/客戶端)的基礎。


更新器類 Updater class

更新程序在Core中,處理將固件寫入閃存,檢查其完整性,並告知Bootloader在下次啟動時加載新固件。

更新進程 - 內存視圖 Update process - memory view

  • 新草圖將存儲在舊素描和螺紋之間的空間中。
  • 在下次重新啟動時,“eboot”引導程序檢查命令。
  • 新的草圖現在被複制“舊”。
  • 新草圖開始了。

fetch21




給我寫信

返回ESP8266_Arduino

返回首頁

購買地址 arduino_ESP8266

更多建議和問題歡迎反饋至 YFRobot論壇