代码地址如下:
http://www.demodashi.com/demo/12994.html


一、前言;


写了这么多的8266博文,一直以满意100%的心态去敲写代码固件烧录,以致很少出现 bug , 目前呢?浏览了网上很多8266的OTA的demo,还特意在某宝上搜了一把,竟然卖的价格为“399”元一个8266的OTA升级方案!天呐!代码这么值钱么?那我之前开源了那么多的工程源码带博文,岂不是无价之宝~~

其实开心就好,那么本文的话,就带大家共睹8266的OTA的远程升级的整个流程!


二、OTA的认识;


在Android开发领域里,有一种叫“热修复”的功能,能够不通过下载APK重新安装它,即可实现修复了Bug。8266的OTA升级也是如此,官网称之为FOTA ,对这个理念的东西,我也是不太懂!反正可以实现无线烧固件就可以啦!


  • ①、8266的在线远程升级的总体流程怎么样的?


  • ②、升级时候,内部运行是怎么样的?

1.从官网提供的图片可以看到,内存大小分为四块,分别是 user1.bin、user2.bin、boot.bin 启动、master_device.key 用户数据 ,初始化系统参数的2个 blanck.bin和esp_init_data_default.bin和预留空间;

2.由下面的理解可知,8266要运行哪个固件,取决于 boot.bin文件的信息,每次升级前,都会查询一次当前运行的是 user1.bin 还是 user2.bin ,进而从云端拉取对应相反的那一个bin;


  • ③、市面上那么对的8266模块,应该怎么配置烧录地址?

很简单问题,只需要修改工程目录下的makefile文件即可,翻开它在 25行左右,可以看到下面信息,这个是乐鑫没有OTA在线升级的配置,可以看到 BOOT?=none,好!那么从这里开始修改!

BOOT?=none
APP?=0
SPI_SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP?=0

我这里详细地说下这里包含了啥信息!

由下面可得,不同的8266模块,其外部falsh大小决定了编译时候的user.bin路径,所以大家在此OTA升级,必须要摸清楚你买的模块是哪个falsh大小的,注意1M = 8Mbit!!!安信可的 32Mbit 其实就是 4M的falsh,类似 25Q32这样的存储芯片。


|字段|数值|含义|备注|

|-------|-----|------|-----------|

|BOOT|none|表示不执行 boot.bin文件,即没有boot.bin文件||

||new|表示执行 boot.bin文件,每次执行将要执行boot.bin文件||

|APP|1|表示生成 user1.bin文件|注意这个仅当上面的BOOT=new 才有效|

||2|表示生成 user2.bin文件|注意这个仅当上面的BOOT=new 才有效|

|SPI_SPEED|40|表示烧录时候的频率选择,这里一般为40,对应烧录工具默认值即可||

|SPI_MODE|QIO|这个主要看8266模块制作商,比如现在常见的是安信可的8266-12F,就是QIO。||

|SPI_SIZE_MAP|1|flash=256,user1地址0x1000,user2地址0x41000|制作对应不同的falsh大小固件|

||2|flash=1024,user1地址0x1000,user2地址0x81000|制作对应不同的falsh大小固件|

||3|flash=2048,user1地址0x1000,user2地址0x81000|制作对应不同的falsh大小固件|

||4|flash=4096,user1地址0x1000,user2地址0x81000|制作对应不同的falsh大小固件|

||5|flash=2048,user1地址0x1000,user2地址0x101000|制作对应不同的falsh大小固件|

||6|flash=4096,user1地址0x1000,user2地址0x101000|制作对应不同的falsh大小固件|

||8|flash=8192,user1地址0x1000,user2地址0x101000|制作对应不同的falsh大小固件|

||9|flash=16384,user1地址0x1000,user2地址0x101000|制作对应不同的falsh大小固件|

||其它数值|flash=256,user1地址0x1000,user2地址0x41000 |制作对应不同的falsh大小固件|


综合上面的表格,我们才有了官网给的下面的图片说明!(注意看blank.binesp_init_data_default.bin地址)



三、固件生成注意事项;


  • ①:生成user1.bin文件:需要注意您的8266模块大小(后面我会列出安信可的所有8266模块的falsh大小),配置 SPI_SIZE_MAP?=6,然后配置我们上述所说的makefile文件配置!下面是我用安信可的8266-12F的配置:
              BOOT?=new
APP?=1 //此刻生成的是 user1.bin文件
SPI_SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP?=6

于是乎,上面的配置就生成如下(boot.bin文件版本支持1.4或以上):


  • 生成user2.bin文件:修改您的bug之后,就修改APP?=2即可!
              BOOT?=new
APP?=2 //此刻生成的是 user2.bin文件
SPI_SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP?=6

于是乎,上面的配置就生成如下,注意此刻的地址是与上面不同的:


四、本地局域网的服务器搭建;


  • 我们必须要把user1.bin文件和user2.bin文件放在服务器,让8266自己判断当前运行的是哪个文件,然后自己去拉取! 这里我就用 tomcat 来搭建本地服务器,怎么搭建的看我之前写的文章点我查看

确保以上步骤完毕之后,我在解压后的目录的webapps下新建一个xuhong文件夹,再新建一个8266NewBin文件夹,把2个bin文件(注意他们都在我们的工程目录的 bin/upgrade下面,后缀名是 bin ,)放在这里!路径注意不要带中文字符!



  • 我们放置好的文件在服务器了:

放好之后,我们在电脑测试下路径是否有误?打开 http://localhost:8080/xuhong/8266NewBin/user1.4096.new.6.bin ,发现浏览器会弹窗出现是否下载此文件!

同时,用同一个路由器连接的手机打开电脑的网关分配的局域网IP地址!这个见下图了,同时确认电脑已经开启了8080对外端口,否则无法访问!),注意不要混乱!我这获取的电脑IP是192.168.1.105,我们在手机打开http://192.168.1.105:8080/xuhong/8266NewBin/user1.4096.new.6.bin ,发现也提示下载文件了!

恭喜!本地部署成功!




四、硬件代码;


  • 注意要修改 结构体的upgrade_server_info的URL申请的内存大小,下面是 4M * 1024 =4096 !

/**
* server_ip: 服务器地址
* port:服务器端口
* path:文件路径
*/
void ICACHE_FLASH_ATTR ota_start_Upgrade(const char *server_ip, uint16_t port,const char *path) {
const char* file;
//获取系统的目前加载的是哪个bin文件
uint8_t userBin = system_upgrade_userbin_check(); switch (userBin) { //如果检查当前的是处于user1的加载文件,那么拉取的就是user2.bin
case UPGRADE_FW_BIN1:
file = "user2.4096.new.6.bin";
break; //如果检查当前的是处于user2的加载文件,那么拉取的就是user1.bin
case UPGRADE_FW_BIN2:
file = "user1.4096.new.6.bin";
break; //如果检查都不是,可能此刻不是OTA的bin固件
default:
os_printf("Fail read system_upgrade_userbin_check! \n\n");
return;
} struct upgrade_server_info* update =
(struct upgrade_server_info *) os_zalloc(
sizeof(struct upgrade_server_info));
update->pespconn = (struct espconn *) os_zalloc(sizeof(struct espconn));
//设置服务器地址
os_memcpy(update->ip, server_ip, 4);
//设置服务器端口
update->port = port;
//设置OTA回调函数
update->check_cb = ota_finished_callback;
//设置定时回调时间
update->check_times = 10000;
//从 4M *1024 =4096申请内存
update->url = (uint8 *)os_zalloc(4096); //打印下請求地址
os_printf("Http Server Address:%d.%d.%d.%d ,port: %d,filePath: %s,fileName: %s \n",
IP2STR(update->ip), update->port, path, file); //拼接完整的 URL去请求服务器
os_sprintf((char*) update->url, "GET /%s%s HTTP/1.1\r\n"
"Host: "IPSTR":%d\r\n"
"Connection: keep-alive\r\n"
"\r\n", path, file, IP2STR(update->ip), update->port); if (system_upgrade_start(update) == false) {
os_printf(" Could not start upgrade\n");
//释放资源
os_free(update->pespconn);
os_free(update->url);
os_free(update);
} else {
os_printf(" Upgrading...\n");
}
}

②、在回调函数我们写如下,表示检测是否已经升级完成,如果返回true,则重启复位模块!

    struct upgrade_server_info *update = arg;
if (update->upgrade_flag == true){
os_printf("OTA Success ! rebooting!\n");
system_upgrade_reboot();
}else{
os_printf("OTA failed!\n");
}

  • 部分截图分享:


  • 升级完成:



⑤、后记;


此代码参考了网上的许多文章,感谢各位的支持!特别是 gitHub上阿秀的开源!

代码亲测可用,我花了2小时特此写了此博文,免得以后的小伙伴入坑,所以源码下载的话给点赏金支持下!谢谢那个热爱技术、知道敲代码入坑的你!


  • 工程截图:

实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件。

代码地址如下:
http://www.demodashi.com/demo/12994.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件的更多相关文章

  1. 乐鑫esp8266基于freeRtos实现私有服务器本地远程OTA升级

    目录 一.前言: 二.回顾下OTA的流程: 三.lwip网络框架的知识的使用: 四.如何处理服务器返回的数据? 五.扇区的擦除和烧写? 六.如何调用? 七.好好享用吧! 八.下载: 九.工程截图: 代 ...

  2. 乐鑫esp8266的 基于Nonos移植红外线1883,实现遥控器控制

    代码地址如下:http://www.demodashi.com/demo/12613.html 一.前言. 距离上篇的8266进阶博文有那么一段时间了,那么本文带来的是基于Nonos的红外线H1838 ...

  3. IAP远程在线升级

    IAP远程在线升级 在上一篇中实现了LWIP网口通讯,那么肯定要加个在线升级功能,这个功能所占用的资源很少,但在物联网中很重要也很实用.在线升级就是像手机一样,先下载好系统,然后点击升级~然后就没然后 ...

  4. 乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本

    目录 一.前言: 二.esp8266的串口分布情况: 三.esp8266的串口通讯时候,应该怎么接线: 四.esp8266的NONOS非系统,串口编程: 五.esp8266的RTOS实时系统,串口编程 ...

  5. centos7 离线升级/在线升级操作系统内核

    目录 一.前言 二.系统环境 三.系统内核下载网址 四.centos7离线升级系统内核 1.先查看系统环境 2.离线升级系统内核 五.在线升级系统内核 一.前言 CentOS(Community EN ...

  6. ESP8266乐鑫版本的(支持云端升级 (Boot 模式)烧写方法,(V1.5.4官方介绍如下)(BOOT模式)

    硬件平台: nodeMCU devkit核心板,带ch340g,应该是仿造的,官方是cp2102驱动,安信可科技有连接https://wiki.ai-thinker.com/esp8266/board ...

  7. modbus转乐鑫物联网平台上传工具

    乐鑫平台推荐个人用户使用 界面比较简洁

  8. RT-Thread—STM32—在线升级(Ymodem_OTA、HTTP_OTA)

    概述 本教程主要根据官方推荐的教程进行改编,详细信息请参考OTA Downloader软件包STM32 通用 Bootloader 本例程通过自己实际搭建环境,测试总结. bootloader的制作 ...

  9. 【WCF】基于WCF的在线升级

    一.前言       前不久因公司产品需要完成了在线升级功能,因为编程技术不精,不敢冒然采用Socket方法实现在线升级,所以使用比较方便稳妥的WCF方式 如果考虑并发能力的话还是Socket> ...

随机推荐

  1. mysql 文本搜索

    全文本搜索 MySQL支持几种基本的数据库引擎,但并非所有的引擎都支持全文本搜索.两个最常使用的引擎为MyISAM和InnoDB,前者支持全文本搜索,后者就不支持. 理解全文本搜索 在前面的学习中,我 ...

  2. Milk Pails(BFS)

    Milk Pails 时间限制: 1 Sec  内存限制: 64 MB提交: 16  解决: 4[提交][状态][讨论版] 题目描述 Farmer John has received an order ...

  3. 【动态规划】bzoj1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典

    f[i]=min{f[i+1]+1,f[i+len[j]+cant]+cant}(for i=L-1 downto 0)(1<=j<=w) #include<cstdio> # ...

  4. 【线性基】【贪心】【独立环】bzoj2115 [Wc2011] Xor

    网上到处都是题解,自己画个图也很好理解.虽然环的个数很多,但是都可以通过独立环之间异或出来,不用管. 独立环求法:生成树之后,每次向图里添加非树边(u,v),则这个独立环的异或和为sum[u]^sum ...

  5. 【莫比乌斯反演+分块】BZOJ1101-[POI2007]Zap

    [题目大意] 对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. [思路] 前面的思路同HDU1695 不过不同的是这道题中(a,b)和(b ...

  6. Problem P: 素数求和

    #include<stdio.h> int main() { ; scanf("%d",&n); n>=&&n<=; ;i<= ...

  7. 调用上一个页面的js方法

    点击商品分类,弹出下框 点击确定,将选中的类别的name和唯一的code返回到上个页面 function save(){ var ids = getIdSelections(); jp.get(&qu ...

  8. AppCompatActivity与toolbar的结合

    原文:http://www.51itong.net/android-activity-appcompatactivity-toolbar-15750.html 另外一个博客:Android 5.x T ...

  9. SSH 登录缓慢解决方案

    SSH 登录太慢可能是 DNS 解析的问题,默认配置下 sshd 初次接受 ssh 客户端连接的时候会自动反向解析客户端 IP 以得到 ssh 客户端的域名或主机名. 如果这个时候 DNS 的反向解析 ...

  10. 解决小米手机Android Studio安装app 报错的问题It is possible that this issue is resolved by uninstalling an existi

    问题描述 Android Studio升级到2.3版本之后,小米手机MIUI8不能运行Android Studio程序,报如下错误: Installation failed with message  ...