MQTT之ESP8266 OTA固件升级

一、准备

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.<flash_map>.<BOOT>.bin  注意这个仅当上面的BOOT=new 才有效(升级时1)
# =2 - 使用FOTA,生成user2.<flash_map>.<BOOT>.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的特定主题给设备发送指令,告诉设备升级地址和文件名和路径。打开串口调试看打印输出信息进行判断执行到位置。

需要不断反复调试测试。其他的可以搜一些参考信息参考一下。

猜你喜欢

转载自blog.csdn.net/uaime/article/details/100007393