其实WiFi模块自主升级和插件升级,都是用 OTA(Over The Air)技术,基本上是相通的。
Esp8266 的SDK给出了bool system_upgrade_start (struct upgrade_server_info *server)
这个接口来实现OTA升级。基本上就是设置该函数的参数server。
这个参数的基本结构从源码可知:
struct upgrade_server_info {
uint8 ip[4];
uint16 port;
uint8 upgrade_flag;
uint8 pre_version[16];
uint8 upgrade_version[16];
uint32 check_times;
uint8 *url;
upgrade_states_check_callback check_cb;
struct espconn *pespconn;
};
必须要填的有:
1、一个服务器的端口和IP地址 ip port
2、固件下载完成的回调函数check_cb
3、url http请求报文,包含起始行和首部
4、pespconn 结构体。
返回值: true:开始升级 false:已经在升级中,无法再开始升级
笔者用的是1.5.4SDK ESP8266已搞成库了。只能从串口输出抓到一些信息。
参见更老的SDK,弄清升级的流程。
第一步:建立TCP连接--->发出HEAD请求--->获得bin文件的头信息
--->断开TCP连接--->建立TCP新连接--->发出GET 分段获取--->存储-->检查信息(即检索下载的bin文件是否是所要求的)---->设置启动标志位--->重新启动。
分段获取----->好奇的很??
在老的SDK中的处理接收到的TCP报文,调用
user_esp_platform_data_process(&client_param,pusrdata,ret);
user_esp_platform_data_process(struct client_conn_param *pclient_param, char *pusrdata, unsigned shortlength)
中pclient_param 指向socketID相关的结构体
pusrdata 是接收到的数据,如果是NULL,则连接将断开
length 是接收到数据的长度
解析JSON数据包,其中对于系统升级指令 调用
user_esp_platform_upgrade_begin(pclient_param, server); 且包括server结构体参数的设置。
LOCAL void
user_esp_platform_upgrade_begin(struct client_conn_param *pclient_param, struct upgrade_server_info *server)
处理从服务器收到的数据----升级参数设置
参数设置很关键。