”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何实现ESPith SDK x(脚本可编程控制器)的OTA功能

如何实现ESPith SDK x(脚本可编程控制器)的OTA功能

发布于2024-11-01
浏览:695

作为支持远程连接互联网的物联网设备,本地或远程OTA升级也是脚本编程控制器的一个重要功能,因为不能保证继电器完全没有Bug,在利用bug,如果没有OTA升级接口,很难让客户通过串口升级固件,控制器只能回厂升级,成本高,影响大。

另外,客户可能有一些个性化功能无法通过中文编程实现,需要升级控制器固件才能实现。

这两种情况需要通过本地或远程OTA功能来解决。

这几天花了一点时间完成这个功能,现总结如下:
(1)ESP8266的FLASH可以存储两个固件,名称分别为user1.bin到user2.bin,两个固件的地址由地址0x0000处存储的引导程序boot.bin决定,且存储地址不同不同的闪光灯容量。
例如,ESP8266-01S Flash 容量为 1Mbyte,存储地址分别为 0x01000 和 0x81000,ESP8266-07S FLASH 容量为 4Mbyte,存储地址分别为 0x01000 和 0x101000。

(2)通过函数system_upgrade_userbin_check的返回值获取当前程序运行的user1.bin或user2.bin,进行固件升级,到另一个固件存储区写入完整的固件,例如如果当前运行的是存储在 user1.bin 的 0x1000 中,然后到地址 0x81000(ESP8266-01S) 或0x101000(EPS8266-07S)写入固件user2.bin,写入后,然后通过函数system_upgrade_flag_set(0x02)通知SDK写入完成,SDK设置系统参数,以便ESP8266启动时启动到另一个固件。

3)官方推荐的做法是通过http协议将固件下载到云服务器到内存中,我没有使用这个方案,主要是出于两个考虑,一是这个方案是否经过严格验证,以及是否有充分考虑数据验证以避免升级到砖块,我对此表示怀疑。其次,这个程序要求控制器能够连接到外部网络,从服务器下载固件,这并不容易做到。

我目前正在使用delphi开发一套固件升级软件,该软件作为TCP客户端直接连接到控制器,或者连接到云服务器的TCP网关然后传输到控制器,然后根据512 字节用于将固件推送到控制器的数据帧。

接下来可以将这套逻辑移植到服务器上,客户可以通过浏览器打开网页将固件推送到控制器。

4)数据的完整性得到充分验证,第一帧数据做crc32校验,固件写入flash然后读出与写入的值进行比较,同时计算出该值crc32,与上位机发送的crc32值相比,读写数据相同,crc值也相同,则认为该帧数据写入成功;
同时对每一帧数据的crc32值再进一步做crc32值,得到总的crc32值,与上位机发送的总crc32值进行比较,该值与调用函数system_upgrade_flag_set之前相同( 0x02) 以允许 SDK 切换到启动固件。

(5)写入两个不同固件区的固件user1.bin、user2.bin不一样,对于RTOS sdk开发,需要修改Makefile变量APP的值生成user1.bin、user2 .bin,分别是上位机根据控制器返回当前运行的该存储区域的固件,选择另一个存储区域的固件发送给控制器。上位机根据控制器返回的当前运行固件的存储区域选择另一个存储区域的固件。

如果两个存储区域使用相同的固件,ESP8266将无法正常启动。

How to implement OTA function for ESPith SDK x(script programmable controller)

How to implement OTA function for ESPith SDK x(script programmable controller)

版本声明 本文转载于:https://dev.to/zhangzhuyue/how-to-implement-ota-function-for-esp8266-with-sdk-2xxscript-programmable-controller-a60如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3