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);                 // 波特率115200
  WiFi.begin(wifi_name, wifi_password); // 连接wifi
  while (WiFi.status() != WL_CONNECTED)
  { // 等待连接wifi
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
#if defined(LED)
  Serial.println("LED灯测试");
  LED_INIT
#else
  Serial.println("3s后开始升级");
  delay(3000);

  updateBin(); // 开始升级
#endif
      ;
  Serial.println("setup end");
}

/**
 * 循环函数
 */
void loop()
{
#ifdef LED
  Serial.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的模块。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[深度学习]yolov10+deepsort+pyqt5实现目标追踪

YOLOv10DeepSORTPyQt5实现目标追踪系统 在现代智能监控系统中&#xff0c;目标追踪技术扮演着至关重要的角色。结合YOLOv10&#xff08;一种先进的实时目标检测算法&#xff09;与DeepSORT&#xff08;一种多目标追踪算法&#xff09;&#xff0c;并通过PyQt5构建用户界面&…

想要做好海外广告投放?建议这几点先了解清楚

在全球市场竞争日益激烈的今天&#xff0c;跨境电商和出海营销早已经成为了热门选择&#xff0c;随之而来海外广告的投放也受到众多人的青睐。无论是想要提升品牌知名度&#xff0c;还是实现销售增长&#xff0c;正确的广告投放都能事半功倍。错误的选择不仅浪费资源&#xff0…

【Qt秘籍】[006]-Label实现Hello World程序-编程第一步

"Hello,World!" 中文意思是“你好&#xff0c;世界”。 因为 The C Programming Language 中使用它做为第一个演示程序&#xff0c;后来很多程序员在学习编程或进行设备调试时延续了这一习惯。 下面&#xff0c;我们也将演示利用Label显示Qt中的"Hello World!&q…

深度学习笔记:0.cuda安装,成功

B站上说&#xff1a;cs上骗子太多。文章太久&#xff0c;我深以为然。用了一天。才装好。其实很简单。 CUDA安装教程&#xff08;超详细&#xff09;-CSDN博客文章浏览阅读1w次&#xff0c;点赞5次&#xff0c;收藏56次。windows10 版本安装 CUDA &#xff0c;首先需要下载两个…

秋招突击——第四弹——Java的SSN框架快速入门——Spring(2)

文章目录 前言其他Spring加载properties 容器创建容器获取beanBeanFactory容器总结 注解注解开发对定义bean纯注解开发Bean管理Bean作用范围Bean生命周期 注解开发依赖注入第三方bean管理第三方bean管理第三方bean注入 注解开发总结 Spring整合整合mybatis整合Junit AOPAOP核心…

Mybatis实现树形结构方式

1&#xff0c;三级分类树形结构查询 /*** DDD(Domain-Driven Design): 领域驱动设计** 三级分类树形结构&#xff1b;* 支持无限层级&#xff1b;* 当前项目只有三级*/ Data public class CategoryTreeTo {private Long categoryId; //1private String categoryName;private …

外观数列 ---- 模拟

题目链接 题目: 分析: 题目的意思如下:所以我们需要引用双指针来找到连续的字符有几个, 并添加到答案中, 接着将此字符添加到答案中, 让left right , 继续向后遍历整个字符串, 重复上面的操作将答案重新赋给字符串, 继续重复上述操作, 应该重复n - 1 次, 因为n为1的时候, 直…

上网是不是必须路由器和光猫之一负责拨号?

链接&#xff1a;https://www.zhihu.com/question/624856022/answer/3245182557 上网并非一定要“拨号”&#xff0c;使用固定IP地址可以直接上网&#xff0c;不需要拨号。你们公司的宽带属于商用宽带&#xff0c;运营商&#xff08;电信&#xff09;给配置了固定的IP&#…

如何监控企业微信聊天记录内容,第二个方法太赞了!

监控企业微信聊天记录内容是企业为了确保沟通合规、提升工作效率、防止信息泄露以及保护公司利益而采取的一种管理措施。在当前的中国&#xff0c;是法律允许的合法行为。 怎么监控&#xff1f;请看下面详情。 1. 利用企业微信自带功能 企业会话存档&#xff1a; 企业微信提…

43页 | 2024年企业级BI平台白皮书(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 2024年企业级BI平台白皮书 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 诚挚邀请您微信扫码加入以下方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&#xff01;&#xff01;&…

【Python Cookbook】S01E16 同时对数据做转换和换算

目录 问题解决方案讨论 问题 当换算&#xff08;sum(), min(), max()&#xff09;同时遇到转换或筛选&#xff0c;怎么做&#xff1f; 解决方案 有一种非常优雅的方法&#xff0c;可以将数据换算和转换结合在一起——在函数参数中使用 生成器表达式。 一个直观的案例&#…

YOLOv8+PyQt5海洋船只检测(可以重新训练,yolov8模型,从图像、视频和摄像头三种路径识别检测)

1.效果视频&#xff1a;海洋船只检测yoloV8检测&#xff08;https://mbd.pub/o/bread/mbd-ZpaYk55r&#xff09;_哔哩哔哩_bilibili资源包含可视化的海洋船只检测系统&#xff0c;可对于高空拍摄到的海洋图片进行轮船检测&#xff0c;基于最新的YOLOv8训练的海洋船只检测模型&a…

Facebook开户|FB10大提升视频广告效果实践

Facebook10大提升视频广告效果实践&#xff01;&#xff01;需要的家人们建议点赞收藏哦~ 一、在前3秒吸引注意力 在视频广告推广活动中&#xff0c;一直都有黄金3秒的说法&#xff0c;指的就是通过前三秒的制作&#xff0c;吸引观众的注意。吸引人的画面、个性的CTA、独特性和…

C语言| 字母金字塔

【思路分析&#xff1a;】 1 考虑左边的空格大写字母&#xff0c;而大写字母 先升序后降序输出 2 升序输出的字母的个数行数最大字母在26个英文字母中排的位置序号 3 降序输出的字母 升序输出的字母个数-1 编程顺序&#xff1a; 1 定义循环变量i,表示字母的顺序,循环变量j 表…

软件测试之黑盒测试与白盒测试知识小结

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 对于很多刚开始学习软件测试的小伙伴来说&#xff0c;如果能尽早将黑盒、白盒测试弄明白&#xf…

Makefile的入门学习

一、Makefile的入门学习 编译工具及构建工具介绍 在之前的课程&#xff0c;都是直接使用gcc对代码进行编译&#xff0c;这对简单的工程是可以的&#xff0c;但当我们遇到复杂的工程时&#xff0c;每次用gcc等编译工具去操作就会显得很低效。因此make工具就出现了&#xff0c;…

MYSQL之主从复制

一&#xff0c;安装MYSQL&#xff0c;两台 二&#xff0c;配置master服务器 vim /etc/my.cnf 在mysqld模块下加入 server-id133 #配置server-id&#xff0c;让主服务器有唯一ID号&#xff08;让从服务器知道 他的主服务器是谁&#xff09;,建议使用ip最后3位 log-binmysql-bi…

coze扣子自定义插件开发

之前用过阿里云的&#xff0c;阿里云的插件填写的内容有点复杂 今天体验coze&#xff0c;没想到如此简单&#xff1b; 访问地址&#xff1a;扣子&#xff0c;注册对应账户&#xff0c;并创建对应空间&#xff1b; 第一步&#xff1a;点击插件&#xff0c;新建插件 选择不需要…

OpenHarmony嵌套类对象属性变化:@Observed装饰器和@ObjectLink装饰器

上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数组项class&#xff0c;或者class的属性是class&#xff0c;他们的第二…

代码随想录算法训练营第四十八天 | 70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

70. 爬楼梯 &#xff08;进阶&#xff09; 代码随想录 解题思路 1.确定dp数组以及下标的含义 dp[i]&#xff1a;爬到有i个台阶的楼顶&#xff0c;有dp[i]种方法 2.递推公式 dp[j] dp[j - nums[i] ] 装满背包有多少种方法一般用这个 3.遍历顺序 完全背包&#xff0c;且…