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.mzph.cn/news/847087.shtml

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

相关文章

如何使用前端表格控件实现多数据源整合?

前言 作为表格产品的典型应用场景之一&#xff0c;几乎所有的行业都会存在类 Excel 报表开发这样的应用场景&#xff0c;而在这些应用场景中&#xff0c;经常会遇见下面的这些痛点&#xff1a; 报表数据往往来自多个不同的数据源&#xff0c;需要报表系统能够同时连接多个数据源…

AI的制作思维导图

AI&#xff08;人工智能&#xff09;的实现通常涉及以下几个步骤&#xff1a; 1.问题定义&#xff1a;首先确定你想要解决的问题是什么&#xff0c;这将决定你需要设计什么样的系统。 2.数据收集&#xff1a;根据你的需求&#xff0c;收集相关的数据集来训练你的AI模型。数据的…

x264 编码器中 PTS 与 DTS 原理分析

DTS和PTS 解释 DTS:Decoding Time Stamp,这通常指的是解码时间戳,是视频帧或音频样本在解码器中解码的时间点。DTS用于确保视频帧或音频样本在正确的时间被解码,以保持视频和音频的同步。PTS:Presentation Time Stamp,是指显示时间戳,是视频帧或音频样本应该被显示给观众…

Unity有限状态机实现怪物AI(代码框架思路)

目录 状态的枚举 状态基类 接口(规范不同对象的同一行为) 状态机类(作为媒介用于管理各个状态之间的转换) 附带一个攻击状态的子类脚本作为示例: 状态的枚举 首先最容易想到的是状态的枚举,比如说攻击状态、巡逻状态、追击状态等等,用枚举进行表示 public enum E_AI_State…

前端工程化工具系列

所有和前端工程化工具的系列合集&#xff0c;快速提升开发效率。文档持续更新中&#xff0c;敬请期待&#xff5e;感兴趣的可收藏 前端工程化 这个专栏 已完成 前端工程化工具系列&#xff08;一&#xff09;—— ESLint(v9.4.0)&#xff1a;代码质量守护者 基础篇 前端工程化…

AI技术从起源到革命性的未来

在科技日新月异的今天&#xff0c;huizerc.com人工智能&#xff08;AI&#xff09;技术已成为推动社会进步的重要力量。从最初的概念提出&#xff0c;到如今的广泛应用&#xff0c;AI技术经历了漫长而曲折的发展历程。本文将深入探讨AI技术的起源、发展历程、当前应用以及未来展…

Vue——模板引用(不建议使用,了解)

文章目录 前言测试案例 前言 模板引用&#xff0c;在官方文档中也有很详细的描述。 虽然 Vue 的声明性渲染模型为你抽象了大部分对 DOM 的直接操作&#xff0c;但在某些情况下&#xff0c;我们仍然需要直接访问底层 DOM 元素。 个人理解为&#xff1a; 在vue中&#xff0c;依据…

【数据库系统概论】程序题

“学生管理数据库”包含以下三个表,即学生表Student、课程表Course和选课表SC,结构如下: Student(Sno,Sname,Ssex,Sage,Sdept)Course (Cno,Cname,Cpno,Ccredit)SC(Sno,Cno,Grade)其中,Sno为学号,Sname为学生姓名,Ssex为性别,Sage为年龄 系别:Cno为课程号…

Milvus 基本操作

1、maven 依赖 <dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.3.3</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>sl…

STL容器--list

1. list的介绍及使用 1.1 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指其前…

面试官:对于MQ中的消息丢失你是如何理解的?

相信很多的小伙伴在面试的时候&#xff0c;涉及到MQ的面试题&#xff0c;消息丢失是必问面试题之一。那么对于消息丢失你又是如何理解的呢&#xff1f; 下面我们一起来看一下。 本文以 Kafka 举例说明 一、什么是消息丢失&#xff1f; 消息丢失的定义是&#xff1a;在消息传递…

ActivityRecord、TaskRecord、ActivityStack以及Activity详解

adb shell dumpsys activity activities 输出涉及到了解 Android 活动管理器&#xff08;Activity Manager&#xff09;的当前状态&#xff0c;以及系统中运行的活动和任务的详细信息。这是系统中活动&#xff08;Activities&#xff09;、任务&#xff08;Tasks&#xff09;、…

【动手学深度学习】softmax回归从零开始实现的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 softmax回归的从零开始实现 &#x1f30d;3.2 基础练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 理解softmax回归的原理和基本实现方式&#xff1b;学习…

Python打印当前目录下,所有文件名的首字母

代码如下&#xff1a; #!/usr/bin/env python3 """ 按顺序打印当前目录下&#xff0c;所有文件名的首字母&#xff08;忽略大小写&#xff09; """ import sys from pathlib import Pathdef main() -> None:ps Path(__file__).parent.glob(…

代码随想录算法训练营第26天(py)| 回溯 | 39. 组合总和、40.组合总和II、131.分割回文串

39. 组合总和 力扣链接 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&#xff08;包括 target&#xff09;都是正整数…

上传RKP 证书签名请求息上传到 Google 的后端服务器

上传证书签名请求 1.准备环境&#xff1a;OK pip3 install google-auth2.13.0 requests2.28下载 device_info_uploader.py 。 没找到先跳过 选项 1&#xff1a;通过 GCP 帐户使用 device_info_uploader.py 运行脚本。 ./device_info_uploader.py --credentials /secure/s…

深入理解Python的包管理器:pip

深入理解Python的包管理器&#xff1a;pip 引言 Python作为一门流行的编程语言&#xff0c;拥有强大的生态系统&#xff0c;其中pip扮演着至关重要的角色。pip是Python的包管理工具&#xff0c;它允许用户安装、升级和管理Python包。本专栏旨在帮助读者深入了解pip的各个方面…

NFS服务p.2 用户的上传与下载,以及用户映射

如何进行上传和下载呢&#xff1f; 目录 如何进行上传和下载呢&#xff1f; 上传 访问时的账户映射对于上传文件和下载文件的影响&#xff1f; 在服务器里进行修改用户的权限 如和修改使用用户上传时的名字&#xff1f; 上传 上传的话&#xff0c;因为我们现在所在的nfs1…

端午佳节到,礼轻情意重,闪侠惠递帮你高效便宜寄快递

马上就是端午佳节了&#xff0c;我们通常会吃粽子&#xff0c;赛龙舟&#xff0c;但是这些礼物我们该怎么快速的送到我们亲朋好友的手中呢&#xff1f;小编这里非常推荐大家使用闪侠惠递来寄快递。不仅能高效便捷的把礼物送到你的手中&#xff0c;而且还能以非常便宜的价格呢&a…

03_初识Spring Cloud Gateway

文章目录 一、网关简介1.1 网关提出的背景1.2 网关在微服务中的位置1.3 网关的技术选型1.4 补充 二、Spring Cloud Gateway的简介2.1 核心概念&#xff1a;路由&#xff08;Route&#xff09;2.2 核心概念&#xff1a;断言&#xff08;Predicate&#xff09;2.3 核心概念&#…