乐鑫esp8266学习rtos3.0笔记第6篇:esp8266-12模块基于rtos3.1版本ota功能远程空中升级固件,官网之上增加dns域名解析!(附带demo)_rtos ota-程序员宅基地

技术标签: 8266  8266 空中升级  esp8266 ota  esp8266 3.0 ota  


  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

1、 Esp8266之 搭建开发环境,开始一个“hellow world”串口打印。
2、 Esp8266之 利用GPIO开始使用按钮点亮你的“第一盏灯”。
3、 Esp8266之 利用 "软件定时器 " 定时0.5秒闪烁点亮一盏LED。
4 、Esp8266之 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。
5 、Esp8266之 原生乐鑫SDK高级使用之封装Post与Get请求云端,拿到“天气预报信息”。
6 、Esp8266之 了解 SmartConfig与Airkiss一键配网,给8266配网上云端。无需把wifi名字密码写在固件里。
7 、Esp8266之 了解 softAP热点配网模式原理,仿“机智云”定义自己的热点配网模式协议。
8、 Esp8266之 你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。
9、 Esp8266进阶之路第1篇: [小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
10、 Esp8266进阶之路第2篇: [小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
11、 Esp8266进阶之路第3篇: 8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!
12、 Esp8266进阶之路第4篇: 图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制一盏LED。
13、 Esp8266进阶之路第5篇: 动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。
14、 Esp8266进阶之路第6篇: esp8266的 FreeRtos系统学习的正确姿势 ------ 环境搭建、烧录。
15、 Esp8266进阶之路第7篇: esp8266的 物联网又一股清流,8266接入阿里云平台非阿里智能的SDS服务,点亮一盏LED灯。
16、 Esp8266进阶之路第8篇: esp8266的 基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。
17、 Esp8266进阶之路第9篇: esp8266自研的快速上电开关五次 (开-关为一次) ,无需按键触发则8266进去一键配网模式。
18、 Esp8266进阶之路第10篇: esp8266 基于NONOS 实现 OTA 远程升级,实现无线“ 热修复 ”升级固件程序。
19、 Esp8266进阶之路第11篇esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。
20、 Esp8266进阶之路第12篇深入学习esp8266的esp now模式,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。
21、 Esp8266进阶之路第13篇浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。
22、 Esp8266进阶之路第14篇esp8266的工程如何添加第三方静态库文件以及如何自定义文件夹,聊聊那些makeFile的事。。
23、 Esp8266进阶之路第15篇再来一波 esp8266 基于 freeRtos系统连接自己私有的服务器实现OTA远程升级,接触下 lwip的基本知识。。
24、 Esp8266进阶之路第16篇渗透学习回顾下esp8266的外置spi芯片25q系列,熟悉8266代码块在其的分布,得心应手放置图片或其他资料。
25、 Esp8266进阶之路第17篇深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。
26、 Esp8266进阶之路第18篇RTOS分析 MQTT 实现过程,实现移植 MQTT协议在 esp8266 rtos实时系统,可断线重连。
27、 Esp8266进阶之路第19篇跟紧脚步,用VisualStudio Code开发 esp8266 rtos SDK v3.0版本,全新的 idf 框架,节省内存模块化开发。
28、 Esp8266进阶之路第20篇教你轻松自如使用cJson在乐鑫 esp8266 如何解析一段json数据以及如何生成一段json数据。
29、 Esp8266进阶之路第21篇百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接支持阿里云规则引擎。
30、 Esp8266进阶之路第22篇乐鑫esp8266 SDK编程使用 IIC总线驱动 0.96寸的OLED显示屏,显示天气预报信息。
31、 Esp8266进阶之路第23篇当esp8266遇到 Html,该怎么内置网页控制设备,理清内置网页的实现过程,实现无需路由器手机也可以控制esp8266。
32、 Esp8266进阶之路第24篇细聊HmacMD5的加密方法带来的安全性,并实践在esp8266上,最大保障传输的过程的信息的安全性。
33、 Esp8266进阶之路第25篇如何优雅地像乐鑫原厂封装esp8266底层寄存器的逻辑思维,做成自己的静态库库文件,让第三方人使用?
34、 Esp8266进阶之路第26篇乐鑫esp8266 NONOS SDK 3.0编程使用 SPI 驱动基于Max7219芯片的八位数码管,显示日期信息。
35、 Esp8266进阶之路第27篇乐鑫esp8266芯片借助机智云平台做一个商业化的七彩RGB灯泡可调整体方案项目,炫彩夺目高大尚。
36、 Esp8266学习rtos3.0笔记第1篇认识esp8266 Rtos 3.0 sdk 工程结构,esp8266如何向esp-idf工程靠近的,如何自定义头文件编译?
37、 Esp8266学习rtos3.0笔记第2篇你要找的基本外设功能都在这里了,包括Gpio、Pwm 和 Uart 接口使用。
38、 Esp8266学习rtos3.0笔记第3篇 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。
39、 Esp8266学习rtos3.0笔记第4篇 带你捋一捋市面上的微信公众号配网智能设备 esp8266 并绑定设备的过程,移植并成功实现在 esp8266 rtos3.1 sdk。
40、 Esp8266学习rtos3.0笔记第5篇 基于乐鑫idf框架,研究出超稳定、掉线重连、解决内存泄露问题的Mqtt框架!支持esp8266和esp32!
41、 Esp8266学习rtos3.0笔记第6篇 esp8266-12模块基于rtos3.1版本ota功能远程空中升级固件,官网基础之上增加dns域名解析!


  • 很多人怎么联系我一起学习进步,下面打个小小公告和干货无偿分享:

玩转esp8266带你飞、加群付费QQ群,提高门槛,不喜的朋友勿喷勿加:434878850
esp8266源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
esp32源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32


一、前言;


     在人生的道路上,有很多十字路口,而最重要的,可能就那么一两条 。 这个是我最近看的《老师,好》电影里面一个经典台词。当第二次被邀请到乐鑫工作,我内心是热血狂澜的。但由于所处环境的和个人的本身原因,不得不放弃这个邀请。既然放弃了这个念头,那么就要好好地做好当前的工作,到人生后某一天想起,我也有信心勇气说起不负当年的决定。


     当身边都是优秀的人,你也不得不被感染!他们接受新事物快,动手能力强,基础扎实,善于思考!大公司小公司都是需要这样的人才,所以为什么招聘高学历的人!qq群的大多数人的提问,让我不得不反思当前一个问题:不善于思考,这是个从小灌输的学习思想!如何去解决技术问题? 就拿我的qq群里面的群友来说,喜欢一上来就拿着工程去跑,比较多的问题是:编译失败,跑不通,连接服务器不成功!这类问题一般是对基础不扎实!


     “前人种树后人乘凉”,我在 GitHub 或者这博客里面,放了很多的代码,里面的案列都是我亲手跑通才放上去的,这就是前人种树!但是 后人乘凉 ,需要你一个健全的人,一个可以把基本环境搭建好,把每个SDK版本的区别总体认识,最基础的是要有单片机入门基础!


     总的来说,劝告那些在校大学生或者已就业的朋友,在开发单片机不管遇到什么问题,第一时间,看芯片log打印信息分析,此log绝大部分可以分析出处于什么问题才会这样的现象!包括我接触的 JavaScript 小程序、Android开发app,php服务器对接天猫精灵,都是喜欢打 log ,不断调试思考哪里问题!这都是作为一个标准程序员的技能!


     最后说一句,以后大家提问题,一定要说明当前的硬件环境,sdk版本,代码截图,现象说明,日志打印信息!提问语气友好!不管在哪里,这样的提问方式,绝对让对方感到你虚心好学的态度。

在这里插入图片描述


二、认识 flash 分布;


     以下的讨论都是基于 支持 ota 分区来说的,并非single factory app


     在 3.0的版本,esp32esp8266的内存分布都是一样的,就拿我们的esp8266-12f模块来说,如下图片,我们一层层说下(全部手写,非翻译而来):


  1. 前面已经说到了 NVS是乐鑫自研的类似数据库的存储机制的 flash 操作技术,其位置大家在下面都可以看到了!
  2. PartitionTable 是分区表,字面意思是 每个用户编写的应用程序的位置定义。
  3. pyh_init就是 rf射频相关的了!
  4. coredump 是程序跑飞异常时候保存log信息的位置,这个在esp32有提到怎么使用,目前在 esp8266 是没提到的;
  5. ota-0ota-1 大家都应该看的懂了就是升级后的2个程序存储位置。
  6. factory app 就是初次烧录的用户程序的位置了!
  7. not use就是并没使用的部分,大家可以在这里存储自己的东西,比如字库!

在这里插入图片描述


     还有另外几点我需要补充的是:

  • 这个分区并不是一味不变的,大家可以自定义的。换句话说,我可以自定义存储位置以及其存储大小,一般对于初学者来说别修改,否则会让你的程序跑不起来的!默认的采用分区文件是在:ESP8266_RTOS_SDK/components/partition_table/partitions_two_ota.csv

  • 这个存储的地方在哪里的呢?当有人问你的时候,别说存储在 esp8266芯片里面的,其实是在 它接的一个 flash 芯片上的,比如下面的 25q32 ;

  • not use部分的存储可以在代码读取出来,同样地,我们也可以通过 espTools 提供的工具把 数据转存为 NVS 数据格式存储在 NVS 位置,这个我以后会提到!

在这里插入图片描述


三、配置好远程固件下载的信息;


第一步:拷贝一份官方示范到自己的文件夹;


     为什么要拷贝一份官方示范?因为我不喜欢动官方的源码,一方面为了对比自己后面修改的代码,二是可以直接pull官方最新的代码不发生冲突!这是我个人习惯!或者你直接进去其文件夹配置就好了,我的是基于 rtos3.1版本的,其路径是:

..\ESP8266_RTOS_SDK\examples\system\ota

第二步:切进去修改远程的文件配置等;


     切进去后 make menuconfig , 找到 Example Configuration,其每项如下所示,具体输入看实际而定!

     注意:如果你是直接使用官网的代码,下面的服务器地址只能是ip地址,如果你是用我下面提供的,必须是域名哈!

在这里插入图片描述


四、配置好芯片信息;


     esp8266 的ota 不管在 哪个 SDK 版本,都是需要配置芯片信息的,3.0版本之前是在Makefile文件配置,但是 3.0 之后是在 shell 窗口打开make menuconfig 配置的!操作如下动态图所示:

 -->Partition Table
    --> Partition Table (选择第二个表示支持ota,采用默认的分区) 
      --> Partition Table Offset set (输入0x8000就是上面说的分区表位置)

在这里插入图片描述


  • 注意看我的 烧录配置,尤其注意flash设置为 2MB !

在这里插入图片描述


五、升级过程概述;


     这部分没啥好讲的,和 2.0 那些代码过程都是一样的!下面贴出我之前写的 一个博文链接,可以加深理解其过程:https://blog.csdn.net/xh870189248/article/details/80095139

在这里插入图片描述


六、部分代码概述;


  • 为了区分其固件版本,我加了一个宏表示当前版本定义,下面表示是 1.0 版本 :
#define  FW   "V1.0"

  • 在官网的基础上,我并没修改什么代码,仅仅加了下面的dns解析我们的域名:

static int connect_to_http_server()
{
    ESP_LOGI(TAG, "Server IP: %s Server Port:%d", EXAMPLE_SERVER_IP, EXAMPLE_SERVER_PORT);
    int ret;
    struct addrinfo hints, *addr_list, *cur;
    struct sockaddr_in serverAddr;

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC; // Allow IPv4 or IPv6
    hints.ai_flags = 0;
    hints.ai_protocol = 0;
    hints.ai_socktype = SOCK_STREAM;
    
    //域名解析得到ip地址
    ret = getaddrinfo(EXAMPLE_SERVER_IP, NULL, &hints, &addr_list);
    
    if (ret != 0)
    {
        printf("DNS parsing failed!\r\n");
        return -1;
    }

    for (cur = addr_list; cur != NULL; cur = cur->ai_next)
    {
        char ip[128];
        inet_ntop(AF_INET, &(((struct sockaddr_in *)cur->ai_addr)->sin_addr), ip, 128);
        printf("DNS IP: %s  \r\n", ip);
        socket_id = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字描述符
        if (socket_id < 0)
        {
            ret = -1;
            printf("socket created failed!\r\n");
            continue;
        }
        bzero(&serverAddr, sizeof(struct sockaddr_in)); // 清零
        serverAddr.sin_family = AF_INET;
        //这个是设置ip地址
        serverAddr.sin_addr.s_addr = inet_addr((const char *)ip);
        //serverAddr.sin_addr.s_addr = inet_addr((const char*)("192.168.1.124"));
        serverAddr.sin_port = htons(EXAMPLE_SERVER_PORT); 

        if (connect(socket_id, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == 0)
        {
            printf("connect server success!\r\n");
            ret = 0;
            break;
        }else  {
            printf("error = %d\r\n", errno); // #define EHOSTUNREACH 113 // No route to host 无法路由到主机
        }
        close(socket_id);
        ret = -1;
    }
    if (cur == NULL)
        ret = -1;
    freeaddrinfo(addr_list);
    return ret;
}


  • 我们在程序入口加如打印当前的版本:
    //打印版本
    ESP_LOGI(TAG, "Version : %s", FW);

七、其他;


7.1 注意事项;


  1. 每次手动烧录固件,请先make erase_flash,因为这样可以清除所有的信息,保证程序读取是在 factory app 区域!再烧录make flash
  2. 确保你的服务器上的固件地址正常访问,是http 请求访问,不是 https 哈!!!
  3. 为了区分是否正确ota升级,先修改下固件版本,比如v1.1,放去服务器,再修改低版本的通过本地烧录到硬件去。
  4. 放到服务器的固件本地位置是在编译后的 build文件夹下的ota.bin文件哈!
  • 很多人怎么联系我一起学习进步,下面打个小小公告和干货无偿分享:

玩转esp8266带你飞、加群付费QQ群,提高门槛,干货多多,不喜的朋友勿喷勿加:434878850
esp8266源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
esp32源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32


在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xh870189248/article/details/90079984

智能推荐

mysql主备配置文件 my.cnf_my.cnf配置的server_id-程序员宅基地

文章浏览阅读5.5k次。主:[mysqld]lower_case_table_names=1datadir=/mnt/mysql/datasocket=/mnt/mysql/mysql.socklog-error=/mnt/mysql/log/mysqld.logpid-file=/mnt/mysql/mysqld.pidwait_timeout=2147483interactive_timeout=2147483character_set_server=utf8init_connect='SET._my.cnf配置的server_id

堆排序(c语言)_堆排序加入一个节点-程序员宅基地

文章浏览阅读278次,点赞10次,收藏7次。堆排序的效率在各种排序中有比较高的效率,时间复杂度为O(nlog2n)_堆排序加入一个节点

sqoop import hbase by kerberos安全认证下_sqoop 脚本添加kerbores认证-程序员宅基地

文章浏览阅读515次。2020-07-15 16:30:47,365 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Can't get Master Kerberos principal for use as renewer at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesIntern_sqoop 脚本添加kerbores认证

ubuntu sublime支持中文_ubuntu sublim 中文字体-程序员宅基地

文章浏览阅读779次。1. 安装fcitx中文输入法或sougou拼音输入法 * `sudo apt-get install fcitx-pinyin` * sougou + `sudo add-apt-repository ppa:fcitx-team/nightly` + `sudo apt-get update` 添加软件源,在使用之前要先更新_ubuntu sublim 中文字体

mysql物理分页逻辑分页_物理分页与逻辑分页的区别-程序员宅基地

文章浏览阅读385次。物理分页与逻辑分页的区别物理分页:物理分页就是护具看本身提供了分页方式,如MYSQL的limit、ORACLE的rownum,好处是效率高,不好的地方九江市不同的数据库有不同的搞法逻辑分页:利用游标分页,好处就是素有数据库都统一,好处就是效率低常用ORM框架采用的分页就是hibernate:采用的就是物理分页MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据库记录全部查询出来..._mysql yspage是逻辑分页还是物理分页

AdaGrad(自适应梯度算法),Adaptive-程序员宅基地

文章浏览阅读1.4w次,点赞12次,收藏35次。学习衰减率:随着学习的进行,使得学习率逐渐减小。AdaGrad会为参数的每个元素适当的体哦阿正学习率_自适应梯度

随便推点

java调用内部action_Struts内部流程(总控ActionServlet读取Struts-config.xml后,将请求转发到诸负责业务处理的Action流程)模拟实现...-程序员宅基地

文章浏览阅读238次。我们知道,在Struts1.x中,大致的内部处理流程是这样的:ActionServlet作为中央处理器,它配置在Web.xml中,接受所有*.do的请求,然后解析URI,得到*.do中的*部分,即path,然后根据path在struts-config.xml中找到具体处理业务的Action以及与之配套的ActionForm和ActionForward,再根据Action的type用Java反射机制..._javal路径带有action=

HTML5引擎Construct2技术剖析(四)_construct2 随机数组-程序员宅基地

文章浏览阅读2.8k次。Construct2是一款跨平台的基于HTML5的游戏开发引擎,不需要编程(如果需要扩展插件,还是要会javascript),通过鼠标拖放组件和编辑事件表单(EventSheet)来完成的游戏开发。该引擎可以将开发的封装成多种形式,如phonegap、cocoonjs,导出浏览器、ios和android等平台应用。目前相关的中文资料还是比较少._construct2 随机数组

pycharm连接数据库mysql_MySQL数据库 -- Navicat、pycharm连接数据库-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏23次。内容目录1.Navicat使用2.pycharm使用数据库一、Navicat使用#1. 测试+链接数据库#2. 新建库#3. 新建表,新增字段+类型+约束#4. 设计表:外键#5. 新建查询#6. 建立表模型#注意:批量加注释:ctrl+?键批量去注释:ctrl+shift+?键1.1 导出的sql语句代码代码附在最后1.2 导入数据库"""使用说明:拷贝上述代码,新建一个.sql文件,保存到桌面..._pycharm sql网页显示数据库

Jenkins ——pipeline入门教程_pipline 执行脚本-程序员宅基地

文章浏览阅读2.4k次,点赞3次,收藏3次。什么是Pipeline?简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程(实用场景:将多个Jenkins构建任务轻松集成)。2、Pipeline支持两种语法:Declarative Pipeline(在Pipeline 2.5中引入,结构化方式)和Scripted Pipeline,两者都支持建立连续输送的Pipeline。还有其他的agent后面可跟的参数,例如:none,label,node,docker。_pipline 执行脚本

MCS-51的中断系统_mcs51单片机中断优先级寄存器-程序员宅基地

文章浏览阅读1w次,点赞7次,收藏48次。MCS-51单片机内的中断系统主要用于实时测控,即要求单片机能及时地响应和处理单片机外部或内部事件所提出的中断请求。由于这些中断请求都时随机发出的,如果采用定时查询方式来处理这些中断请求,则单片机的工作效率低,且得不到实时处理。因此,MCS-51单片机要实时处理这些中断请求,就必须采用具有中断处理功能的部件——中断系统来完成。* 为什么用中断,因为定时查询的效率低。(注意这里讲的定时查询不是定时器查询)1 中断的概念 当MCS-51单片机的CPU正在处理某件事情(..._mcs51单片机中断优先级寄存器

Python爬取天气数据,并且进行天气预报(已实现)_利用python爬取网站上面的历史天气,并且使用正则表达式针对于网站上面的数据进行-程序员宅基地

文章浏览阅读1.3w次,点赞50次,收藏318次。利用爬虫爬取天气数据,并且进行数据清理,之后进行模型预测,预测明天气温还进行了数据图的绘制。_利用python爬取网站上面的历史天气,并且使用正则表达式针对于网站上面的数据进行