1、实现方案
2、制作差分包
1)差分包制作工具获取
百度网盘链接:https://pan.baidu.com/s/1pxNF7HJLKV43s1ZkpTpfow
提取码:owdj
2)生成差分包
- 解压文件
- 打开【开始】——》进入【命令提示符】——》进入到解压后的文件目录下——》txt文件中的指令
- 最后得到的bin文件就是生成的差分包文件
3、升级流程
1)将生成的bin文件上传到http服务器上,获取http的url
void cm_test_http2(char *fota_url)
{
//HTTP client结构体
httpclient_t client = {0};
//HTTP client数据
httpclient_data_t client_data = {0};
//错误返回值
HTTPCLIENT_RESULT ret = HTTPCLIENT_ERROR_CONN;
//HTTP 响应数据缓冲区指针
char *buf = NULL;
//分配响应数据内存
buf = malloc(CM_HTTP_RECV_SIZE);
//如果分配失败,则退出
if (buf == NULL)
{
cm_printf("Malloc failed.\r\n");
free(buf);
return;
}
//清空缓冲区
memset(buf, 0, sizeof(buf));
//将缓冲区指针注册到数据结构体中
client_data.response_buf = buf; //Sets a buffer to store the result.
cm_printf("start http test\n");
//响应数据缓冲区长度
client_data.response_buf_len = CM_HTTP_RECV_SIZE; //Sets the buffer size.
cm_printf("start connect\n");
//启动连接
ret = httpclient_connect(&client, fota_url);
//如果连接成功
if (ret == HTTPCLIENT_OK) {
//发送GET请求
cm_printf("start send request\n");
ret = httpclient_send_request(&client, fota_url, HTTPCLIENT_GET, &client_data);
//如果请求成功
if (ret == HTTPCLIENT_OK) {
cm_printf("start recv\n");
//开始接收数据
ret = httpclient_recv_response(&client, &client_data);
// 删除之前保存的文件
delete_file("/fota/fota.pack");
// 将获取到的bin文件进行保存
write_fota_file(client_data.response_buf, client_data.content_block_len);
osDelay(50);
// 触发升级,若返回0,则表示升级失败
cm_fota_update();
}
else
{
cm_printf("send request fail,ret=%d\n",ret);
}
}
else
{
cm_printf("connect fail,ret=%d\n",ret);
}
cm_printf("close\n");
//关闭连接
httpclient_close(&client);
//释放缓冲区
free(buf);
}
2)操作文件系统,将bin文件保存
// 将bin文件进行保存
void write_fota_file(unsigned char *message, unsigned int len)
{
//先创建文件夹,否则创建文件可能会失败
cm_fs_mkdir("/fota/");
//创建文件并写入内容
create_fota_file("/fota/fota.pack", message, len);
}
//创建文件并写入内容
void create_fota_file(char *file, unsigned char *message, unsigned int fota_data_len)
{
int fd;
int ret;
//打开或创建测试文件
// fd = cm_fs_fopen("/param_config/param_config.txt",O_CREAT|O_RDWR);
fd = cm_fs_fopen(file, O_CREAT | O_RDWR);
//如果出错则退出
if(fd < 0)
{
cm_printf("[FWRITE]file open failed\n");
return;
}
//写入指定内容到文件内
ret = cm_fs_fwrite(fd, message, fota_data_len);
//如果出错,关闭文件后退出
if(ret <0)
{
cm_printf("[FWRITE]file write failed\n");
cm_fs_fclose(fd);
return;
}
cm_printf("[FWRITE]file write ok\n");
//将缓冲写入到Flash
cm_fs_fflush(fd);
//关闭文件
cm_fs_fclose(fd);
}
// 删除文件
void delete_file(char *file)
{
// 返回0表示删除成功
cm_printf("delete:%d\n",cm_fs_fdelete(file));
}
4、注意事项
- 做 OTA 功能前,需要明确 SDK 的版本,每个版本的实现方式存在差异
- 具体的版本还需要跟中移物联的技术支持获取