ESP使用巴法云远程OTA(VScode + Platform io)

ESP使用巴法云远程OTA(Platform)


什么是OTA:

  • OTA(Over-the-AirTechnology)即空中下载技术,是通过移动通信的空中接口实现对移动终端设备及SIM卡数据进行远程管理的技术。OTA升级是物联网(IOT)产品设计的一个非常重要的部分,能够实现智能设备系统漏洞修复、系统升级,通过固件和软件的升级,提供更好的服务。OTA固件升级功能不仅能够更新固件,而且还能重新配置芯片上硬件资源。同时,设备固件可通过OTA固件升级流程获得更新的补丁和更多安全算法防范病毒攻击。

  • ESP32集成了2.4GHzWi-Fi和蓝牙双模,以其超高的射频性能、稳定性、通用性和可靠性,以及超低的功耗,满足不同的功耗需求,适用于各种物联网应用场景,受到低成本系统和制造商的欢迎。

  • 此外,使用ESP32 OTA还可以实现远程控制,即通过网络来远程控制设备。例如,我们可以通过网络将新的固件发送到设备,实现设备的远程升级。

  • 总之,使用OTA可以提高设备的维护效率,方便我们进行远程控制和升级。因此,ESP32支持OTA升级是非常有用的功能。

实验环境:

硬件:ESP32
软件:VScode 下 Platform io
平台: 巴法云

步骤

  1. VScode 下 Platform io 创建工程
  2. 编译一个准备用作OTA之后的测试用例
  3. 编写支持OTA功能的代码,并使用数据线完成第一次下载
  4. 在巴法云平台上传测试固件bin文件
  5. 测试OTA功能

实操:

  1. 创建工程

alt text)

  1. 添加串口波特率:115200

alt text

  1. 编写代码测试用例
    实际上测试用例和基础OTA代码是一样的,只是用了不同的宏定义区分一下模块功能
//基础OTA就取消LED的宏定义,定义LED是用来测试OTA升级之后的程序,#include <Arduino.h>
#include <WiFi.h>
#include <httpUpdate.h>#define LED#ifdef LED
#define led_pin 2
#define LED_INIT                   \do                               \{                                \Serial.println("LED灯初始化"); \pinMode(led_pin, OUTPUT);      \} while (0)
#define LED_ON                   \do                             \{                              \Serial.println("LED on");    \digitalWrite(led_pin, HIGH); \} while (0)
#define LED_OFF                 \do                            \{                             \Serial.println("LED off");  \digitalWrite(led_pin, LOW); \} while (0)
#endif/******需要修改的地方****************/#define wifi_name "TP-LINK_FB01"  // WIFI名称,区分大小写,不要写错
#define wifi_password "zl&231231" // WIFI密码
// 固件链接,在巴法云控制台复制、粘贴到这里即可
String upUrl = "http://bin.bemfa.com/b/3BcZjQ1ZmM3M2EwNjYyY2VhNTIzZmM4YTVkZjUwMTkwYzY=light002.bin";
/**********************************/
void updateBin();
/*** 主函数*/
void setup()
{Serial.begin(115200);                 // 波特率115200WiFi.begin(wifi_name, wifi_password); // 连接wifiwhile (WiFi.status() != WL_CONNECTED){ // 等待连接wifidelay(500);Serial.print(".");}Serial.println("");Serial.print("IP address: ");Serial.println(WiFi.localIP());
#if defined(LED)Serial.println("LED灯测试");LED_INIT
#elseSerial.println("3s后开始升级");delay(3000);updateBin(); // 开始升级
#endif;Serial.println("setup end");
}/*** 循环函数*/
void loop()
{
#ifdef LEDSerial.println("Testing LED...");LED_ON;delay(1000);LED_OFF;delay(1000);#endif
}// 当升级开始时,打印日志
void update_started()
{Serial.println("CALLBACK:  HTTP update process started");
}// 当升级结束时,打印日志
void update_finished()
{Serial.println("CALLBACK:  HTTP update process finished");
}// 当升级中,打印日志
void update_progress(int cur, int total)
{Serial.printf("CALLBACK:  HTTP update process at %d of %d bytes...\n", cur, total);
}// 当升级失败时,打印日志
void update_error(int err)
{Serial.printf("CALLBACK:  HTTP update fatal error code %d\n", err);
}/*** 固件升级函数* 在需要升级的地方,加上这个函数即可,例如setup中加的updateBin();* 原理:通过http请求获取远程固件,实现升级*/
void updateBin()
{Serial.println("start update");WiFiClient UpdateClient;httpUpdate.onStart(update_started);     // 当升级开始时httpUpdate.onEnd(update_finished);      // 当升级结束时httpUpdate.onProgress(update_progress); // 当升级中httpUpdate.onError(update_error);       // 当升级失败时t_httpUpdate_return ret = httpUpdate.update(UpdateClient, upUrl);switch (ret){case HTTP_UPDATE_FAILED: // 当升级失败Serial.println("[update] Update failed.");break;case HTTP_UPDATE_NO_UPDATES: // 当无升级Serial.println("[update] Update no Update.");break;case HTTP_UPDATE_OK: // 当升级成功Serial.println("[update] Update ok.");break;}
}
  1. 先编译一次测试用例(又LED的宏定义部分),然后把编译后的.bin文件传到巴法云平台上

alt text

编译好的固件在工程目录\.pio\build\esp32dev下,名字是firmware.bin

  1. 将复制的链接贴回去测试代码中:

alt text

  1. 编辑基础OTA代码(无LED宏定义),并使用数据线下载到esp32上。观察串口数据信息,等待完成OTA后,看到测试用例的固件被加载到esp32中,说明OTA升级完成。

注意 :如果想要每次OTA完成之后,可以继续下一次的OTA,需要保证每次OTA的新程序里都保留着支持远程OTA的模块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/340136.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++初阶学习】第十二弹——stack和queue的介绍和使用

C语言栈&#xff1a;数据结构——栈(C语言版)-CSDN博客 C语言队列&#xff1a;数据结构——队列&#xff08;C语言版&#xff09;-CSDN博客 前言&#xff1a; 在之前学习C语言的时候&#xff0c;我们已经学习过栈与队列&#xff0c;并学习过如何使用C语言来实现栈与队列&…

企业软件产品和服务 之 设计保证安全 七项承诺

1. 引言 公司如何保护自己免受数据泄露的影响&#xff1f;标准答案就是&#xff1a; “启用多因素身份验证”——MTA&#xff08;Enable multifactor authentication&#xff09;。 但是&#xff0c;目前很多公司仍然盲目地只使用密码作为唯一的身份来源。 网络安全的核心是…

深入了解 C 语言 Bug

目录 一、引言二、Bug的定义三、Bug的由来四、Bug的影响五、应对 Bug 的方法六、结论 一、引言 1、在 C 语言的编程世界中&#xff0c;Bug 是一个我们无法回避的话题。 2、Bug&#xff0c;简单来说&#xff0c;就是程序中存在的错误或缺陷。它可以表现为程序运行结果的异常、崩…

步进电机双闭环细分控制(matlab仿真)内含课设等参考文件

1.1 步进电机工作原理 步进电机是一种用电脉冲进行控制&#xff0c;将电脉冲信号转换成相位移的电机&#xff0c;其机械位移和转速分别与输入电机绕组的脉冲个数和脉冲频率成正比,每一个脉冲信号可使步进电机旋转一个固定的角度。脉冲的数量决定了旋转的总角度&#xff0c;脉…

英伟达开源新利器NV-Embed向量模型,基于双向注意力的LLM嵌入模型,MTEB 56项任务排名第一

前言 文本嵌入模型能够将文本信息转化为稠密的向量表示&#xff0c;并在信息检索、语义相似度计算、文本分类等众多自然语言处理任务中发挥着关键作用。近年来&#xff0c;基于解码器的大型语言模型 (LLM) 开始在通用文本嵌入任务中超越传统的 BERT 或 T5 嵌入模型&#xff0c…

企业打款验证API在Java、Python、PHP中的使用教程

随着企业银行账号数量的增加和银行间的连接方式不断丰富&#xff0c;企业在进行资金交易时需要确保所填写的收款方账户信息的准确性和合法性&#xff0c;以避免资金损失和风险。然而&#xff0c;由于银行数量众多、地域分布广泛&#xff0c;不同银行间的账户验证机制和信息交互…

网络编程(八)

网络编程&#xff08;八&#xff09; 数据库数据库的分类基于嵌入式的数据库什么是SQLite?为什么使用SQLite?sqlite3数据库的安装 sqlite3中的点命令.open 数据库文件名字.tables [数据库文件名].schema 表名.database.quit.head on.mode column SQLite数据库中的数据类型SQL…

【Linux】Linux环境基础开发工具_4

文章目录 四、Linux环境基础开发工具gcc和g动静态库的理解 make和MakefileLinux小程序---进度条 未完待续 四、Linux环境基础开发工具 gcc和g 动静态库的理解 动态库的优点&#xff1a;比较节省资源&#xff0c;不会出现太多重复代码。 动态库的缺点&#xff1a;对库的依赖性…

C语言 数组——数组的其他应用之筛法求素数

目录 数组的其他应用 求100以内的所有素数 筛法求100以内的所有素数 自顶向下、逐步求精设计算法 数组的其他应用 求100以内的所有素数 筛法求100以内的所有素数 自顶向下、逐步求精设计算法 step 1&#xff1a;设计总体算法  初始化数组a&#xff0c;使a[2]2, a[3]3,..…

算法 java 排序和查找

排序和查找 冒泡排序&#xff08;稳定&#xff09;选择排序&#xff08;不稳定&#xff09;插入排序&#xff08;稳定&#xff09;希尔排序&#xff08;不稳定&#xff09;归并排序&#xff08;稳定&#xff09;快速排序&#xff08;不稳定&#xff09;堆排序计数排序桶排序基数…

C++设计模式——Adapter适配器模式

一&#xff0c;适配器模式简介 适配器模式是一种结构型设计模式&#xff0c;用于将已有接口转换为调用者所期望的另一种接口。 适配器模式让特定的API接口可以适配多种场景。例如&#xff0c;现有一个名为"Reader()"的API接口只能解析txt格式的文件&#xff0c;给这…

【AR开发-开源框架】使用Sceneform-EQR快速开发AR应用,当前接入了AREngine、ORB-SLAM,可快速地适配不同的安卓设备

Sceneform-EQR Sceneform 概览 Sceneform是一个3D框架&#xff0c;具有基于物理的渲染器&#xff0c;针对移动设备进行了优化&#xff0c;使您可以轻松构建增强现实应用程序&#xff0c;而无需OpenGL。 借助 Sceneform&#xff0c;您可以轻松地在 AR 应用和非 AR 应用中渲染…

Caused by: java.rmi.server.ExportException: Port already in use: 1100;解决方案

Caused by: java.rmi.server.ExportException: Port already in use: 1100; 根据端口号找占用程序的进程号 netstat -ano|findstr 1100 最右边那个数字就是进程号 在任务管理器中 详细信息&#xff0c;点击pid即可按照进程号排序&#xff0c;找到相应的进程&#xff0c;判断…

盲盒小程序预售机制的设计与实施

随着盲盒市场的不断发展&#xff0c;预售机制逐渐成为商家吸引用户、提升销售额的重要手段。本文将探讨盲盒小程序预售机制的设计与实施&#xff0c;以帮助商家更好地满足用户需求并优化库存周转率。 一、预售机制设计原则 在设计预售机制时&#xff0c;商家需要遵循以下几个…

基于 vue-element-template 框架添加 tagsview

1. 需求 vue-element-template 是一个基础模板&#xff0c;默认没有 tagsview。所以要手动添加。 参考最全面的集成方案框架 vue-element-admin &#xff0c;拷贝和修改相关文件到你的项目中。 2. 修改 复制如下文件或文件夹 \src\layout\components\TagsView\src\store\mo…

Docker基础篇之本地镜像发布到阿里云

文章目录 1. 本地镜像发布到阿里云的流程2. 阿里云开发平台3. 将自己的本地镜像推送到阿里云 1. 本地镜像发布到阿里云的流程 阿里云ECS Docker生态如下图所示&#xff1a; 2. 阿里云开发平台 在控制台找到容器和镜像服务&#xff1a; 然后创建一个个人实例&#xff1a; 下面…

号称超级增程电动,领克07EM-P带来技术变革?

近年来&#xff0c;自主品牌在新能源汽车领域百花齐放&#xff0c;尤其是在混合动力市场上&#xff0c;比亚迪的DM-i技术引领了风潮&#xff0c;秦L的一经亮相&#xff0c;整个车圈都沸腾了&#xff0c;“超级混动”的概念深入人心。 各大自主品牌都有了自己的混动平台和技术。…

实战

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 实战一&#xff1a;大乐透号码生成器 使用Random模块模拟大乐透号码生成器。选号规则为&#xff1a;前区在1&#xff5e;35的范围内随机产生不重复的…

大数据—元数据管理

在大数据环境中&#xff0c;元数据管理是确保数据资产有效利用和治理的关键组成部分。元数据是描述数据的数据&#xff0c;它提供了关于数据集的上下文信息&#xff0c;包括数据的来源、格式、结构、关系、质量、处理历史和使用方式等。有效的元数据管理有助于提高数据的可发现…

【Qt】win10,QTableWidget表头下无分隔线的问题

1. 现象 2. 原因 win10系统的UI样式默认是这样的。 3. 解决 - 方法1 //横向表头ui->table->horizontalHeader()->setStyleSheet("QHeaderView::section{""border-top:0px solid #E5E5E5;""border-left:0px solid #E5E5E5;""bord…