登录
首页 >  文章 >  php教程

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

来源:dev.to

时间:2024-10-19 12:04:03 253浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《如何实现ESPith SDK x(脚本可编程控制器)的OTA功能》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

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

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

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

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

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

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何实现ESPith SDK x(脚本可编程控制器)的OTA功能》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>