一、准备
1)服务器准备可以项目载文件的站点(iis或apache建的项目或网站)
站点根目录建立一个子目录(文件夹)存放文件 user1.xxxx.bin user2.xxxx.bin
2)生成这2个文件,并将user1.xxx.bin烧录进去(当然测试没问题了再烧)
二、生成 user1.xxxx.bin user2.xxxx.bin
1)user1.xxx.bin 第一个文件,输出或某个宏定义 做个打印输出,便于在串口调试时观察是哪个版本。
比如在 user_init(void)函数中打印
os_printf("\t Project:\t%s\r\n", ProjectName);//项目名称可带版本号测试观察
os_printf("\t SDK version:\t%s", system_get_sdk_version());//SDK版本
os_printf("\n\n\tcJson version:\t%s\n\n",cJSON_Version());//cJson版本
os_printf("\r\n\tuser bin:%d\r\n", system_upgrade_userbin_check());
INFO("[IMALIUBO] system_get_free_heap_size=%d\r\n",system_get_free_heap_size());
2)修改项目根目录下找到Makefile这个文件(提醒:项目根目录不是app根目录)
未修改之前大概25行左右 BOOT?=none 修改如下
############################################
# 参数默认配置
# =none -不使用boot
# =old - 使用老版本的boot_v1.1+
# =new - 使用新版本的boot_v1.2+ 每次执行将要执行boot.bin文件
BOOT?=new
# =0 - 不使用远程升级FOTA
# =1 - 使用FOTA,生成user1...bin 注意这个仅当上面的BOOT=new 才有效(升级时1)
# =2 - 使用FOTA,生成user2...bin 注意这个仅当上面的BOOT=new 才有效(待升级版本2)
APP?=1
# SPI速率和模式,一般不用改动
# SPI_SPEED表示烧录时候的频率选择
# SPI_MODE 不同制造商不一样,安信可12F, QIO
SPI_SPEED?=40
SPI_MODE?=QIO
# SPI_SIZE_MAP flash映射方式;区别参考1:https://blog.csdn.net/toopoo/article/details/86415497
# 4,flash=4096,user1地址0x1000,user2地址0x81000
# 6,flash=4096,user1地址0x1000,user2地址0x101000(安信可12F选这个)具体见官方文档说明!!!
SPI_SIZE_MAP?=6
############################################
根据需要修改,生成user1.xxx.bin时APP?=1 生成user2.xxx.bin时改为2
具体SPI_SIZE_MAP?=6还是其他数字要视您的模块而定。
3)调用升级的触发条件,我是在MQTT的接收回调函数中调用 mqttDataCb
a.通过主题来判断,当然加一些判断条件,不能谁都能升级,身份验证。需要考虑方法。比如提交的token和ESP8266内部的token对比(当然通过某种方式加密后写入flash的....此处省略约1000字)
b.上通过后,将接收的数据(json格式)通过类型转化成需要的参数传递给,升级入口函数。我在这地方折腾了很久。
三、上传到服务器指定目录(并测试根据设定的地址是否可以正常下载文件哦)
四、烧录user1.xxx.bin
1)先了解规则
2)看编译生成的提示,烧录位置进行烧录。
五、测试
我通过MQTT的特定主题给设备发送指令,告诉设备升级地址和文件名和路径。打开串口调试看打印输出信息进行判断执行到位置。
需要不断反复调试测试。其他的可以搜一些参考信息参考一下。