在上一篇《OneNet 里 SOTA升级体验 (基于 ESP8266)》中已经将核心步骤给大家一一讲解了一遍,这篇我们就说下实际操作中的细节。
首先我们看下升级步骤:
- 获取 Token
- 分片下载文件
- 校验下载文件是否正确
- 设置标志位调用系统函数来运行新的固件
第一步比较简单,参考上一篇就知道怎么操作了,还有一些初始化动作:
- 设置升级标志位:system_upgrade_flag_set(UPGRADE_FLAG_START);
- 初始化MD5:MD5Init(md5);
第二步比较麻烦,我的做法是先malloc一个4K动态缓存,然后每次请求 1KB 数据(ESP8266的最大一帧是有限制,好像是1460字节);
当请求到4KB后将它整体写入到flash中,还有一步计算 MD5 (调用 MD5_Update() 函数) 别忘记了;
如何判断最后一帧呢?有两种可能性:
- 最后一帧不是 1024 的整数倍
- 最后一帧是 1024 整数倍
请求到最后一个一帧后需要注意的是4kb缓存可能没有满,这个时候需要计算实际长度的校验和写入实际长度的数据,否则最后计算出来的 md5 会不一致;
在实际操作中,我们会发现从第一次连接上到每次请求到98K的时候会被服务器 Close 掉,遇到这种情况一定要重新连接并从断开地方继续下载(不需要重新获取Token,直接用之前的token去获取下一帧数据即可);
实际测试下载 360 KB 文件,最理想情况下耗时 90s,最坏可能要 300s,平均 100 多秒。
第三步就是调用 MD5_Final()