OTA Updates:修訂版本之間的差異
(由1名用戶作出的8個中途修訂版本未被顯示) | |||
第 1 行: | 第 1 行: | ||
− | '''最新原文文档地址:[https://arduino-esp8266.readthedocs.io/en/latest/ | + | '''最新原文文档地址:[https://arduino-esp8266.readthedocs.io/en/latest/ota_updates/readme.html ESP8266 Arduino Core-latest version ]''' |
第 59 行: | 第 59 行: | ||
可用于检查新草图的可用空间。 | 可用于检查新草图的可用空间。 | ||
− | 有关内存布局的概述,存储新草图以及在OTA过程中如何复制它们,请参阅更新进程 - 内存视图。 | + | 有关内存布局的概述,存储新草图以及在OTA过程中如何复制它们,请参阅[http://www.yfrobot.com/wiki/index.php?title=OTA_Updates#.E6.9B.B4.E6.96.B0.E8.BF.9B.E7.A8.8B_-_.E5.86.85.E5.AD.98.E8.A7.86.E5.9B.BE_Update_process_-_memory_view 更新进程 - 内存视图] 。 |
以下章节提供了更多的细节和具体的OTA做法。 | 以下章节提供了更多的细节和具体的OTA做法。 | ||
第 73 行: | 第 73 行: | ||
* ESP和计算机必须连接到同一个网络。 | * 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添加到路径”(见下文 - 默认情况下未选择此选项)。 | ||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch.png" alt="fetch" /> | ||
+ | 2.现在准备通过串行端口上传的草图和配置。 - 启动Arduino IDE并加载草图BasicOTA.ino可在File> Examples> ArduinoOTA下找到 | ||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(1).png" alt="fetch1" /> | ||
+ | - 在草图中更新SSID和密码,以便模块可以加入您的Wi-Fi网络 | ||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(2).png" alt="fetch2" /> | ||
+ | - 配置上传参数如下(如果使用不同的模块,可能需要调整配置): | ||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(3).png" alt="fetch3" /> | ||
+ | '''注意''':根据平台包和板的版本,您可能会 Upload Using: 在上面的菜单中看到。此选项不活动,您选择的内容并不重要。它已经与旧版OTA实现兼容,目标是在平台软件包版本2.2.0中进行删除。 | ||
+ | 3.上传草图(Ctrl + U)。完成后,打开串行监视器(Ctrl + Shift + M)并检查模块是否已加入Wi-Fi网络: | ||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(4).png" alt="fetch4" /> | ||
+ | 只有模块连接到网络,几秒钟后,esp8266- ota端口将显示在Arduino IDE中。选择串行监视器中显示的IP地址的端口,步骤如下: | ||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(5).png" alt="fetch5" /> | ||
+ | '''注意''':如果OTA端口没有出现,请退出Arduino IDE,再次打开并检查端口是否存在。如果没有帮助检查您的防火墙设置。 | ||
+ | 4.现在通过选择OTA端口为您的第一个OTA上传做好准备: | ||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(6).png" alt="fetch6" /> | ||
+ | '''注意''':菜单条目 Upload Speed: 在这一点上并不重要,因为它涉及串行端口。只是保持不变。 | ||
+ | 5.如果您已成功完成上述所有步骤,您可以通过OTA上传(Ctrl + U)相同(或任何其他)草图: | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(7).png" alt="fetch7" /> | ||
+ | |||
+ | '''注意''':为了能够一遍又一遍地使用OTA上传草图,您需要在其中嵌入OTA例程。请以BasicOTA.ino为例。 | ||
+ | |||
+ | |||
+ | ==== '''密码保护''' ==== | ||
+ | |||
+ | |||
+ | 使用密码 保护您的OTA上传是非常简单的。所有你需要做的,是在你的代码中包括以下语句: | ||
+ | <pre style="color:Navy"> | ||
+ | ArduinoOTA.setPassword((const char *)"123"); | ||
+ | </pre> | ||
+ | |||
+ | 其中''123''是您应该用自己替换的样本密码。 | ||
+ | |||
+ | 在草图中实现之前,最好使用 File > Examples > ArduinoOTA 下的BasicOTA.ino草图来检查它的工作原理。继续,打开BasicOTA.ino,取消注释已经存在的上述语句,并上传草图。为了使故障排除更容易,除了绝对需要的外,不要修改示例草图。这包括原始简单的OTA密码。然后尝试再次上传草图(使用OTA)。编译完成后,一旦上传即将开始,您将看到如下提示输入密码:''123'' | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(8).png" alt="fetch8" /> | ||
+ | |||
+ | 输入密码,上传应该像往常一样启动,唯一的区别是 Authenticating...OK 消息在上传日志中可见。 | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(9).png" alt="fetch9" /> | ||
+ | |||
+ | 下次不会提示您重新输入相同的密码。Arduino IDE会为您记住它。只有在重新打开IDE之后,才会看到提示输入密码,或者如果您在草图中更改密码,请上传草图,然后尝试重新上传。 | ||
+ | |||
+ | 请注意,如果IDE自上次上传以来尚未关闭,可以显示以前在Arduino IDE中输入的密码。这可以通过在“文件”>“首选项”中上传,并尝试上传模块来启用“ 显示详细”输出。 | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(10).png" alt="fetch10" /> | ||
+ | |||
+ | 上图显示了密码在日志中可见,因为它被传递给''espota.py''上传脚本。 | ||
+ | |||
+ | 下面的另一个例子显示了在上传之间更改密码时的情况。 | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(11).png" alt="fetch11" /> | ||
+ | |||
+ | 上传时,Arduino IDE使用以前输入的密码,因此上传失败,并已由IDE清楚报告。只有IDE才提示输入新密码。正确输入,第二次上传尝试已成功。 | ||
+ | |||
+ | |||
+ | ==== '''故障排除''' ==== | ||
+ | |||
+ | |||
+ | 如果OTA更新失败,首先要检查可能在Arduino IDE的上传窗口中显示的错误消息。如果没有提供任何有用的提示,请尝试在检查ESP在串行端口上显示的内容时再次上传。在这种情况下,IDE的串行监视器将不会有用。尝试打开它时,您可能会看到以下内容: | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(12).png" alt="fetch12" /> | ||
+ | |||
+ | 这个窗口是为ArduinoYún而尚未实现的esp8266 / Arduino。它出现,因为IDE尝试使用您为OTA上传选择的网络端口打开串行监视器。 | ||
+ | |||
+ | 相反,您需要一个外部串行监视器。如果您是Windows用户,请查看[https://www.compuphase.com/software_termite.htm Termite]。这是方便,光滑和简单的RS232端子,不强制RTS或DTR流量控制。如果使用各自的线路切换ESP上的GPIO0和RESET引脚进行上传,则此类流量控制可能会导致问题。 | ||
+ | |||
+ | 在外部终端程序中选择COM端口和波特率,就像使用Arduino串行监视器一样。请参阅以下[https://www.compuphase.com/software_termite.htm Termite]的典型设置: | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(13).png" alt="fetch13" /> | ||
+ | |||
+ | 然后从IDE 运行OTA,看看终端上显示的内容。使用BasicOTA.ino草图的成功ArduinoOTA过程如下所示(IP地址取决于您的网络配置): | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(14).png" alt="fetch14" /> | ||
+ | |||
+ | 如果上传失败,您可能会看到上传者捕获的错误,异常和堆栈转储,或两者兼而有之。 | ||
+ | |||
+ | OTA故障 的最常见原因如下:*芯片上没有足够的物理内存(例如,具有512K闪存的ESP01,对于OTA来说不够),*为SPIFFS指定了太多的内存,因此新的草图将不适合现有的草图和SPIFFS - 请参阅 [http://www.yfrobot.com/wiki/index.php?title=OTA_Updates#.E6.9B.B4.E6.96.B0.E8.BF.9B.E7.A8.8B_-_.E5.86.85.E5.AD.98.E8.A7.86.E5.9B.BE_Update_process_-_memory_view 更新过程 - 内存视图],*在Arduino IDE中为您选定的电路板声明的内存太少(即小于物理大小)。 | ||
+ | |||
+ | 有关闪存布局的更多详细信息,请检查文件系统。有关存储新草图的概述,如何复制以及如何为OTA目的组织内存,请参阅[http://www.yfrobot.com/wiki/index.php?title=OTA_Updates#.E6.9B.B4.E6.96.B0.E8.BF.9B.E7.A8.8B_-_.E5.86.85.E5.AD.98.E8.A7.86.E5.9B.BE_Update_process_-_memory_view 更新进程 - 内存视图]。 | ||
+ | |||
+ | |||
+ | == 网页浏览器 Web Browser == | ||
+ | |||
+ | 本章中描述的更新使用可在以下典型场景中使用的Web浏览器: | ||
+ | |||
+ | :* 应用程序部署后,直接从Arduino IDE加载是不方便或不可能的 | ||
+ | :* 部署后,如果用户无法从外部更新服务器公开OTA的模块 | ||
+ | :* 在设置更新服务器不可行时,将部署后的更新提供给少量模块 | ||
+ | |||
+ | === 要求 Requirements === | ||
+ | :* ESP和计算机必须连接到同一个网络。 | ||
+ | |||
+ | === 实施概况 Implementation Overview=== | ||
+ | 使用Web浏览器的更新是使用 ESP8266HTTPUpdateServer 类 ESP8266WebServer 和 ESP8266mDNS 类一起实现的。需要以下代码才能使其工作: | ||
+ | |||
+ | setup() | ||
+ | <pre style="color:Navy"> | ||
+ | MDNS.begin(host); | ||
+ | |||
+ | httpUpdater.setup(&httpServer); | ||
+ | httpServer.begin(); | ||
+ | |||
+ | MDNS.addService("http", "tcp", 80); | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | loop() | ||
+ | <pre style="color:Navy"> | ||
+ | httpServer.handleClient(); | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | ===应用例程 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”选项。 | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(15).png" alt="fetch15" /> | ||
+ | |||
+ | '''注意''':在下面的步骤5中将需要此设置。之后,您可以取消选中此设置。 | ||
+ | |||
+ | 3.上传草图(Ctrl + U)。完成打开串行监视器(Ctrl + Shift + M)并检查是否看到显示以下消息,其中包含OTA更新的URL 。 | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(16).png" alt="fetch16" /> | ||
+ | |||
+ | '''注意''':只有模块成功加入网络并准备进行OTA上传后,才会显示此类消息。 | ||
+ | |||
+ | 4.现在打开Web浏览器并输入Serial Monitor提供的URL,即 http://esp8266-webupdate.local/update。一旦输入,浏览器应该显示下面由您的模块提供的表单。表单邀请您选择要更新的文件。 | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(17).png" alt="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调试窗口中显示的编译日志中检查此文件的路径,如下所示。 | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(18).png" alt="fetch18" /> | ||
+ | |||
+ | 6.现在在网络浏览器中按“选择文件”,进入上述步骤5中找到的目录,找到文件“WebUpdater.cpp.bin”并上传。如果上传成功,您将在下面的Web浏览器中看到“OK”。 | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(19).png" alt="fetch19" /> | ||
+ | |||
+ | 模块将重新启动,应该在串行监视器上可见: | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(20).png" alt="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代码 === | ||
+ | |||
+ | '''简单的更新程序''' | ||
+ | |||
+ | 简单的更新程序每次调用函数时都会下载该文件。 | ||
+ | |||
+ | <pre style="color:Navy"> | ||
+ | ESPhttpUpdate.update("192.168.0.2", 80, "/arduino.bin"); | ||
+ | </pre> | ||
+ | |||
+ | '''高级更新器''' | ||
+ | |||
+ | 它可以将更新功能指向服务器上的脚本。如果给出版本字符串参数,它将被发送到服务器。服务器端脚本可以使用它来检查是否应该执行更新。 | ||
+ | |||
+ | 服务器端脚本可以如下响应: - 响应代码200,并发送固件映像,或响应代码304,通知ESP,不需要更新。 | ||
+ | |||
+ | <pre style="color:Navy"> | ||
+ | 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; | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | === 服务器请求处理 === | ||
+ | |||
+ | '''简单的更新程序''' | ||
+ | |||
+ | 对于简单的更新程序,服务器只需要提供二进制文件进行更新。 | ||
+ | |||
+ | '''高级更新器''' | ||
+ | |||
+ | 对于高级更新管理,脚本需要在服务器端运行,例如PHP脚本。在每次更新请求时,ESP将HTTP头中的一些信息发送到服务器。 | ||
+ | |||
+ | 标题数据示例: | ||
+ | |||
+ | <pre style="color:dark"> | ||
+ | [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 | ||
+ | </pre> | ||
+ | |||
+ | 有了这个信息,脚本现在可以检查是否需要更新。例如,也可以根据MAC地址传送不同的二进制文件。 | ||
+ | |||
+ | 脚本示例: | ||
+ | |||
+ | <pre style="color:Navy"> | ||
+ | |||
+ | <?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); | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | == 流接口 Stream Interface== | ||
+ | |||
+ | TODO描述流界面 | ||
+ | |||
+ | 流接口是所有其他更新模式(如OTA,http服务器/客户端)的基础。 | ||
+ | |||
+ | |||
+ | == 更新器类 Updater class== | ||
+ | |||
+ | 更新程序在Core中,处理将固件写入闪存,检查其完整性,并告知Bootloader在下次启动时加载新固件。 | ||
+ | |||
+ | === 更新进程 - 内存视图 Update process - memory view === | ||
+ | * 新草图将存储在旧素描和螺纹之间的空间中。 | ||
+ | * 在下次重新启动时,“eboot”引导程序检查命令。 | ||
+ | * 新的草图现在被复制“旧”。 | ||
+ | * 新草图开始了。 | ||
+ | |||
+ | <img src="http://wiki.yfrobot.com/image/esp8266/otaupdate/fetch(21).png" alt="fetch21" /> | ||
2017年5月24日 (三) 09:46的最新修訂版本
最新原文文檔地址: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添加到路徑」(見下文 - 默認情況下未選擇此選項)。
2.現在準備通過串行端口上傳的草圖和配置。 - 啟動Arduino IDE並加載草圖BasicOTA.ino可在File> Examples> ArduinoOTA下找到
- 在草圖中更新SSID和密碼,以便模塊可以加入您的Wi-Fi網絡
- 配置上傳參數如下(如果使用不同的模塊,可能需要調整配置):
注意:根據平台包和板的版本,您可能會 Upload Using: 在上面的菜單中看到。此選項不活動,您選擇的內容並不重要。它已經與舊版OTA實現兼容,目標是在平台軟件包版本2.2.0中進行刪除。
3.上傳草圖(Ctrl + U)。完成後,打開串行監視器(Ctrl + Shift + M)並檢查模塊是否已加入Wi-Fi網絡:
只有模塊連接到網絡,幾秒鐘後,esp8266- ota端口將顯示在Arduino IDE中。選擇串行監視器中顯示的IP地址的端口,步驟如下:
注意:如果OTA端口沒有出現,請退出Arduino IDE,再次打開並檢查端口是否存在。如果沒有幫助檢查您的防火牆設置。
4.現在通過選擇OTA端口為您的第一個OTA上傳做好準備:
注意:菜單條目 Upload Speed: 在這一點上並不重要,因為它涉及串行端口。只是保持不變。
5.如果您已成功完成上述所有步驟,您可以通過OTA上傳(Ctrl + U)相同(或任何其他)草圖:
注意:為了能夠一遍又一遍地使用OTA上傳草圖,您需要在其中嵌入OTA例程。請以BasicOTA.ino為例。
密碼保護
使用密碼 保護您的OTA上傳是非常簡單的。所有你需要做的,是在你的代碼中包括以下語句:
ArduinoOTA.setPassword((const char *)"123");
其中123是您應該用自己替換的樣本密碼。
在草圖中實現之前,最好使用 File > Examples > ArduinoOTA 下的BasicOTA.ino草圖來檢查它的工作原理。繼續,打開BasicOTA.ino,取消注釋已經存在的上述語句,並上傳草圖。為了使故障排除更容易,除了絕對需要的外,不要修改示例草圖。這包括原始簡單的OTA密碼。然後嘗試再次上傳草圖(使用OTA)。編譯完成後,一旦上傳即將開始,您將看到如下提示輸入密碼:123
輸入密碼,上傳應該像往常一樣啟動,唯一的區別是 Authenticating...OK 消息在上傳日誌中可見。
下次不會提示您重新輸入相同的密碼。Arduino IDE會為您記住它。只有在重新打開IDE之後,才會看到提示輸入密碼,或者如果您在草圖中更改密碼,請上傳草圖,然後嘗試重新上傳。
請注意,如果IDE自上次上傳以來尚未關閉,可以顯示以前在Arduino IDE中輸入的密碼。這可以通過在「文件」>「首選項」中上傳,並嘗試上傳模塊來啟用「 顯示詳細」輸出。
上圖顯示了密碼在日誌中可見,因為它被傳遞給espota.py上傳腳本。
下面的另一個例子顯示了在上傳之間更改密碼時的情況。
上傳時,Arduino IDE使用以前輸入的密碼,因此上傳失敗,並已由IDE清楚報告。只有IDE才提示輸入新密碼。正確輸入,第二次上傳嘗試已成功。
故障排除
如果OTA更新失敗,首先要檢查可能在Arduino IDE的上傳窗口中顯示的錯誤消息。如果沒有提供任何有用的提示,請嘗試在檢查ESP在串行端口上顯示的內容時再次上傳。在這種情況下,IDE的串行監視器將不會有用。嘗試打開它時,您可能會看到以下內容:
這個窗口是為ArduinoYún而尚未實現的esp8266 / Arduino。它出現,因為IDE嘗試使用您為OTA上傳選擇的網絡端口打開串行監視器。
相反,您需要一個外部串行監視器。如果您是Windows用戶,請查看Termite。這是方便,光滑和簡單的RS232端子,不強制RTS或DTR流量控制。如果使用各自的線路切換ESP上的GPIO0和RESET引腳進行上傳,則此類流量控制可能會導致問題。
在外部終端程序中選擇COM端口和波特率,就像使用Arduino串行監視器一樣。請參閱以下Termite的典型設置:
然後從IDE 運行OTA,看看終端上顯示的內容。使用BasicOTA.ino草圖的成功ArduinoOTA過程如下所示(IP地址取決於您的網絡配置):
如果上傳失敗,您可能會看到上傳者捕獲的錯誤,異常和堆棧轉儲,或兩者兼而有之。
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」選項。
注意:在下面的步驟5中將需要此設置。之後,您可以取消選中此設置。
3.上傳草圖(Ctrl + U)。完成打開串行監視器(Ctrl + Shift + M)並檢查是否看到顯示以下消息,其中包含OTA更新的URL 。
注意:只有模塊成功加入網絡並準備進行OTA上傳後,才會顯示此類消息。
4.現在打開Web瀏覽器並輸入Serial Monitor提供的URL,即 http://esp8266-webupdate.local/update。一旦输入,浏览器应该显示下面由您的模块提供的表单。表单邀请您选择要更新的文件。
注意:如果輸入 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調試窗口中顯示的編譯日誌中檢查此文件的路徑,如下所示。
6.現在在網絡瀏覽器中按「選擇文件」,進入上述步驟5中找到的目錄,找到文件「WebUpdater.cpp.bin」並上傳。如果上傳成功,您將在下面的Web瀏覽器中看到「OK」。
模塊將重新啟動,應該在串行監視器上可見:
- 重新啟動後,您應該看到完全相同的消息, 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」引導程序檢查命令。
- 新的草圖現在被複制「舊」。
- 新草圖開始了。
購買地址 arduino_ESP8266
更多建議和問題歡迎反饋至 YFRobot論壇