WiFi开发|ESP8266模组SDK开发之FOTA
ESP8266模组SDK开发之远程固件升级
1. FOTA
FOTA(Firmware Over-The-Air)移动终端的空中下载软件升级,指通过云端升级技术,为具有连网功能的设备:例如手机、平板电脑、便携式媒体播放器、移动互联网设备等提供固件升级服务,用户使用网络以按需、易扩展的方式获取智能终端系统升级包,并通过FOTA进行云端升级,完成系统修复和优化
ESP8266远程升级:ESP8266能通过网络远程更新固件,需要将编译生成的user1.bin和user2.bin放到服务器上。可以使用用户自己的服务器,也可以使用乐鑫官方提供的免费服务器
- 使用用户自己的服务器,比较简单,将新的固件放到服务器的路径下,ESP8266使用http get的方式下载新的固件写到FLASH里面,然后重启运行新的固件
- 使用乐鑫官方提供的免费服务器,较复杂一些,需要遵循一定的规则,首先要从乐鑫官网申请一个key(密匙),将这个密匙写到程序中,再将新的固件放到乐鑫的服务器上,然后填写一些和固件相关的信息,程序中也要有相关的部分。程序可参照官方实例ESP8266 IOT PLATFORM,文档可参考99CESP8266_FOTA_UPGRADE_CN.PDF
2. 升级代码功能开发
填充参数,调用如下函数即可实现固件升级,该函数定义在upgrade.c中
BOOL system_upgrade_start(struct upgrade_server_info *server)
参数upgrade_server_info的结构体定义如下:
struct Upgrade_server_info {struct sockaddr_in sockaddrin; /* 存放固件的服务器地址 */upgrade_states_check_callback check_cb; /* 固件下载完成后的回调函数 */uint32 check_times; /* 升级超时时间,单位:ms */uint8 pre_version[16]; /* 固件升级之前的版本 */uint8 upgrade_version[16]; /* 要升级的固件版本 */uint8 *url; /* http请求报文,包含起始行和首部 */void *pclient_param;uint8 upgrade_flag; /* 升级成功标志 */
};
除此之外,还需要编写执行升级函数和升级成功回调函数
//执行升级的函数,参数为固件存放路径
bool ExcuteUpgrade( char * FirmWareDownLoadPath );
//固件下载完成后的回调函数,检测upgrade_flag标志,判断升级是否成功
LOCAL void DeviceUpgradeRsp(void *arg);
3. FOTA功能实现
FOTA功能开发:在局域网内运行WebServer,将固件放到WebServer的目录下,使用网络调试助手建立TCP连接,触发ESP8266从WebServer上下载新固件,重启ESP8266后,运行新固件
实验步骤如下:
–> 在ESP8266_RTOS_SDK目录下新建upgrade文件夹,把httpserver实验中的httpserver目录下所有文件拷贝到该文件夹中
–> 将upgrade源码中的upgradefirmware.c文件拷贝到user目录下;该文件中主要实现了ExcuteUpgrade()和DeviceUpgradeRsp()函数
–> 将upgrade源码中的upgradefirmware.h文件拷贝到include目录下
–> 将upgrade文件夹拷贝到upgrade主目录下
–> 修改upgrade主目录下的Makefile,添加工程编译子目录upgrade,生成libupgrade.a静态库
–> 修改httpserver.c文件中的http任务代码
void ATaskHttpServer( void *pvParameters ){int iVariableExample = 0;int fd = -1;int cfd = -1;int NetTimeOnt = 2000;int ret;struct sockaddr_in ServerAddr;struct sockaddr ClientAddr;socklen_t ClientAddrlen = sizeof(struct sockaddr);char *Httpmsg;char *Sendmsg;STATION_STATUS StaStatus;do{StaStatus = wifi_station_get_connect_status();vTaskDelay(100);}while(StaStatus != STATION_GOT_IP);fd = socket(PF_INET,SOCK_STREAM,0);if(fd == -1){printf("get socket fail!\n");vTaskDelete(NULL);return;}setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&NetTimeOnt,sizeof(int));memset(&ServerAddr,0,sizeof(ServerAddr));ServerAddr.sin_family = AF_INET;ServerAddr.sin_addr.s_addr = INADDR_ANY;ServerAddr.sin_port = htons(SERVERPORT);ServerAddr.sin_len = sizeof(ServerAddr);if(bind(fd,(struct sockaddr*)&ServerAddr,ServerAddr.sin_len) != 0){ printf("bind socket fail!\n");vTaskDelete(NULL);return;}if(listen(fd,5) != 0){printf("listen socket fail!\n");vTaskDelete(NULL);return;}Httpmsg = (char*)zalloc(sizeof(char)*1000);for(;;){ cfd = accept(fd,&ClientAddr,&ClientAddrlen);if(cfd != -1){ printf("HttpClient accept\n");ret = recv(cfd,Httpmsg,1000,0);if(ret > 0){if( strncmp( Httpmsg , "UpgradeFirmware:" , 16 ) == 0 ) {if( ExcuteUpgrade( (char *)&Httpmsg[16] ) == true ){send( cfd , "Upgrade is Excuted!\r\n" , strlen( "Upgrade is Excuted!\r\n" ) , 0 );}else{send( cfd , "Upgrade fail!\r\n" , strlen( "Upgrade fail!\r\n" ) , 0 );}}}else{printf("HttpClient data is no!\n");}}close(cfd);}free(Httpmsg);vTaskDelete( NULL );
}
–> 在user_main.c文件中的user_init()函数下添加如下代码
user_init(void){printf("SDK version:%s\n", system_get_sdk_version());if(system_upgrade_userbin_check() == UPGRADE_FW_BIN1)printf("user1 is runing!\n");elseprintf("user2 is runing!\n");wifi_set_opmode(STATION_MODE);struct station_config *config = (struct station_config *)\zalloc(sizeof(struct station_config));sprintf(config->ssid,SSID);sprintf(config->password,PASSWORD);wifi_station_set_config(config);free(config);wifi_station_set_auto_connect(TRUE);HttpServer_init();xTaskCreate(ATaskLed, "LED", 256, NULL, 2, NULL);
}
–> 在ESP8266编译器中完成两次编译,生成use1.4096.new.4.bin和use2.4096.new.4.bin两个bin文件
将上面生成的两个bin文件拷贝到webserver文件夹中,并改名为user1.bin和user2.bin
使用webserver软件将webserver文件夹设置为服务器根目录
将use1.4096.new.4.bin文件烧写到ESP8266中,打开串口助手,打印出user1正在运行
PC端建立tcp客户端,并连接到ESP8266的IP地址;发送 “UpgradeFirmware:http://PC端IP地址” 即可开启远程升级;注意要取消发送新行
升级完成后,从打印信息可以看出,user2正在运行,表示固件升级成功
WiFi开发|ESP8266模组SDK开发之FOTA相关推荐
- WiFi开发|ESP8266模组SDK开发之Station和AP连接
ESP8266模组SDK开发之Station和AP连接 WiFi是由无线接入点AP(Access Point) .站点(Station)等组成的无线网络. STA:Station(站点),每个连接到无 ...
- WiFi开发|ESP8266模组SDK开发之SNTP协议
ESP8266模组SDK开发之SNTP协议 1. NTP和SNTP NTP 是网络时间协议(Network Time Protocol),是用来同步网络设备(如计算机.手机)的时间的协议 SNTP由N ...
- WiFi开发|ESP8266模组SDK开发项目之智能开关
智能开关项目 1. 智能开关 智能开关由WiFi模组和继电器组成:本实例中利用ESP8266模组作为一个TCP Server,通过STA模式将ESP8266连接到路由器中:PC或者手机连接到相同的路由 ...
- WiFi开发|ESP8266模组AT指令开发二
ESP8266模组AT指令开发二 1. 基于STM32的AT指令开发 ESP8266可以使用官方提供的SDK来进行开发,也可以直接利用官方提供的固件直接使用AT指令配置模块使用.在ESP8266模组A ...
- 制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)
实现的功能: l APP控制月球灯 l 本地月球灯控制 l APP控制"大白"颜色,实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯,连接服务器长亮, ...
- 涂鸦WIFI模组方案(模组 SDK)
摘自:涂鸦智能模组 SDK 开发系列课程 地址:https://www.bilibili.com/video/BV1Kq4y1o728?p=1 摘自:涂鸦智能模组SDK开发系列课程--Wi-Fi接入 ...
- 涂鸦智能模组SDK开发系列课程——涂鸦IoT平台介绍(二)
使用涂鸦Wi-Fi模组和涂鸦Wi-Fi&Bluetooth LE双模模组进行产品开发主要有三种不同的方式进行开发: 零代码开发:涂鸦提供可视化功能配置界面,无需任何编程经验,只需在线配置好产品 ...
- 智能温湿度计原型设计-BLE 模组 SDK 开发
智能温湿度计原型设计-BLE 模组 SDK 开发 概况 温湿度传感器是一款常见的智能家居设备,通过温湿度传感器采集温度和湿度,用户可以通过 App 以温湿度为触发条件设置智能场景控制家电. 设想一下, ...
- ESP32串口转WiFi双天线ESP32-S模组
▌ESP32小模块 1.外置管脚功能图 安信可原厂直销 WiFi+蓝牙模块ESP32串口转WiFi双天线ESP32-S模组 2.自动下载电路 参考下载电路分析 ESP8266专题-ESP8266自动下 ...
最新文章
- Linux块设备概念和列出块设备命令学习
- 【公开课】“有三说深度学习”上线
- git rebase(变基)—— Git 学习笔记 19
- android中的websocket 应用
- 使用jfreechart来创建一个简单的饼图
- kettle连接数据mysql查_Kettle连接MySQL报错的解决方法
- ASP.NET MVC 5– 使用Wijmo MVC 5模板1分钟创建应用
- MySQL基础知识系统学习
- 微信小程序template模板使用
- 老罗锤子手机公布会,我感到深深地愧疚
- ug打开服务器文件保存不了,UG编程时突然提示保存不了,你该怎么办,看这里...
- 快速移除PDF复制到WORD中的换行符
- hublider配置php环境(wamp、phpstudy,php工具箱...)
- 阿里Java技术架构师教你如何写好你的技术简历,附简历模板、学习资料
- 20182319彭淼迪 2019-2020-1 《数据结构与面向对象程序设计》实验一报告
- 【Nodejs】使用http.request批量下载MP3,发现网络文件大于1000K时下载文件为0K
- 燕十八-PHP公益培训-学习
- macbook电脑如何通过ssh连接群晖nas?
- FastQC使用与结果详细解读
- 从0到一开发微信小程序(6)—小程序常用API