2026/3/19 17:44:32
网站建设
项目流程
服务器网站目录,广州番禺区核酸检测点,免费做网站怎么做网站619,腾讯云服务器优惠在物联网设备日益普及的今天#xff0c;远程固件升级#xff08;FOTA#xff09;已成为设备维护与功能迭代的核心能力。本文将详细介绍如何借助开源扩展库libfota2#xff0c;在自建第三方服务器环境下#xff0c;实现安全、稳定的远程固件升级服务。从环境搭建、固件打包…在物联网设备日益普及的今天远程固件升级FOTA已成为设备维护与功能迭代的核心能力。本文将详细介绍如何借助开源扩展库libfota2在自建第三方服务器环境下实现安全、稳定的远程固件升级服务。从环境搭建、固件打包、版本管理到客户端升级流程提供一站式全链路技术解析助力开发者快速集成FOTA功能。一、FOTA 概述FOTA 即远程升级功能此功能可以让用户在不方便大量线刷升级(设备不在身边/量产 PCB 没引出 USB/需要大批量进行功能升级)的情况下快速进行底层固件/脚本/脚本 底层固件的远程更新。LuatOS 开发模式下固件分为两部分core 和 script远程升级时升级 script 和 corescript 仅 script 脚本升级时为全量升级corescript 都升级时为差分升级远程升级时可以仅升级 script也可以同时升级 corescript支持 iot 平台升级和自建第三方服务器(HTTP)升级二、演示功能概述本文将详细讲述如何使用自建服务器服务器进行远程升级。另外此教程演示了自建服务器的三种升级相关场景(1) fota 升级简单演示使用 iot 服务器进行远程升级功能模块简单升级演示(2) tcp 服务器下发升级指令通过 tcp 服务器下发升级指令指令格式使用 json 字符串包含是否升级参数控制设备使用 fota 功能模块(3) psm 低功耗 fota低功耗 fota 功能模块此场景是针对 psm 状态下升级没完成就进入休眠导致升级失败的情况写的一个示例。三、自有服务器 FOTAFOTA 有多种方式可以使用我们的 iot 平台进行升级也可以使用用户自建平台升级可以只升级 core可以只升级用户脚本也可以 core 脚本一起升级接下来介绍自建服务器的升级。3.1 网卡切换fota 功能需要联网去下载升级包所以需要选择一种联网方式netdrv_device配置连接外网使用的网卡目前支持以下四种选择三选一(1) netdrv_4g4G 网卡(2) netdrv_eth_spi通过 SPI 外挂 CH390H 芯片的以太网卡(3) netdrv_multiple支持以上三种网卡可以配置三种网卡的优先级在 netdrv_device.lua 文件中选择一种使用即可。3.2 云平台配置每一家的云平台都不一样但是本质上都一样都是给模块下发正确的升级文件。建议平台做一些验证比如 imei 验证、版本号验证循环请求验证这样能够有效的避免因为升级包下载不对导致的模块循环升级不跑代码其他逻辑引起的假死机现象。3.3 升级包制作并上传自建服务器可以使用此服务器来做测试http://airtest.openluat.com/download 该服务器只能上传文件上传后可以获得一个下载链接复制的链接用作自建服务器的 url。所以我们在最开始先要生成一个链接步骤如下在进行脚本改动前需要在你的电脑上随便生成一个.bin 后缀大小不为 0 的文件(可以随便往里面写点什么)然后将这个 bin 文件上传到模块请求的地址去目的是为了获取升级的 url。比如我的 bin 文件升级 url 为”http://airtest.openluat.com/download/FOTA2_DEMO_001.000.001_LuatOS-SoC_V2012_Air780EPM_1.soc“3.3.1 单脚本升级3.3.1.1 旧版本软件本地烧录如果用户只是新增一些自己的脚本逻辑没有更新底层可以选择仅脚本升级1.脚本中修改 url 为自己的升级 url然后打开 luatools 的项目管理界面点击生成量产文件默认放在 luatools 根目录下的SOC 量产及远程升级文件\Air8000目录下注一定要注意 url 前的###标志位如果不加###模块进行 HTTP 请求时会在请求头里加上 version、project_key,imei,firmware_name 等参数2、将对应生成的 2010 版本001.000.000 的 SOC 的固件烧录到模组中。3.3.1.2 新版本软件级包制作并上传1、因为模块烧录的是 001.000.000 版本所以我们需要给脚本里的版本号改一下改为 001.000.001 版本2、再将脚本中增加几行打印(为了模拟用户修改脚本的动作)3、然后重新生成一次量产固件4、将升级文件改名成上面 url 中的文件名字 FOTA2_DEMO_001.000.001_LuatOS-SoC_V2010_Air780EPM_1.soc 。然后上传到服务器对应的地址。3.3.2 含 core 升级注意对于不同后缀的固件不能直接升级分区有差异强行升级可能无法启动。比如LuatOS-SoC_V2012_Air780EPM_1.soc 只能升级LuatOS-SoC_V2014_Air780EPM_1.soc 后缀的固件不能升级 LuatOS-SoC_V2014_Air780EPM_2.soc 后缀的固件。3.3.2.1 旧版本软件本地烧录每一次 core 的升级都会带来一些网络上的优化(例如信号差时的网络稳定性)以及一些 bug 修复所以在发布新版本以后用户可以先测试下 core 对自己脚本有无明显影响或性能提升然后进行远程 FOTA。1、本次选择脚本版本是 001.000.000升级到 001.000.001固件版本从 2010 升级到 2012 版本按照生成量产固件的步骤001.000.000 版本脚本搭配 V2010 版本固件生成量产文件如下图2、将对应生成的 2010 版本001.000.000 的 SOC 的固件烧录到模组中。3.3.2.2 新版本软件级包制作并上传1、修改脚本版本后以及固件版本后重新生成量产固件如下需要注意的是生成了这个版本以后再去脚本中改动脚本版本号为 001.000.002(只要前后两位有一位大于 1一位大于 0 即可(当然第一位大于 1 的时候整个版本号自然大于 001.000.001)如 002.000.200001.000.001030.000.311 等)脚本版本号分为 A.B.C 三段因为历史原因中间这一段 B 没有任何意义但是必须存在假设旧的脚本版本号为 A1.B1.C1新的脚本版本号为 A2.B2.C2当新旧脚本版本号满足以下任何一种条件时版本号允许升级1、A2 等于 A1同时 C2 大于 C12、A2 大于 A1同时 C2 大于或者等于 C13、B1 B2 无意义2、接下来就是针对这两个量产文件制作一个差分文件用来远程升级(注远程升级中 core 为差分脚本为全量升级)点击到 luatools 的主界面依次点击图中蓝框所示意的地方(注必须使用 luatools_3.0.9 及其以上版本要不差分包升级的时候可能会出问题)3、按下图所示选择低版本以及高版本的固件然后点击开始执行即可如果不想输出的差分包在 luatools 根目录下可以自行选择一个输出路径4、在你选择的目录下看到如下所示带着脚本的 PROJECT core 版本号 脚本版本号的 bin 后缀的差分文件。5、将升级文件上传完成以后为了防止模块当前固件不是最早的版本可以点击 luatools 主界面右边的下载固件选择最早的 001.000.000 版本按住 boot 重启模块然后点击下载将最早的固件下载进模块里即可6、将升级文件改名成上面 url 中的文件名字 FOTA2_DEMO_001.000.001_LuatOS-SoC_V2012_Air780EPM_1.soc 。然后上传到服务器对应的地址。7、将对应生成的 2010 版本001.000.000 的 SOC 的量产固件烧录到模组中。3.4 示例结果展示本 demo 将会演示三种场景下的 fota 升级场景在 main.lua 中切换。3.4.1 场景一fota 升级简单演示主要代码如下升级中模块请求升级下载完升级包以后会进行 MD5 验证升级包有无问题如果没问题就会启动重启程序然后进行升级工作升级后升级成功后按我们之前的脚本每隔 5S打印一次降功耗,找合宙以及当前脚本版本号可以看出当前版本号已经由原来的 001.000.000 变为了 001.000.001固件版本从 2010 变为 2012。3.4.2 场景二tcp 服务器下发升级指令通过 tcp 服务器下发升级指令指令格式使用 json 字符串包含是否升级参数控制设备使用 fota 功能模块。此场景下设备会先连接到 TCP 服务器等待服务器下发升级指令。在 air_srv_fota.lua 中会有一个参数控制防止升级过程中重复下载升级包。测试服务器链接https://netlab.luatos.com/ 打开一个 tcp 服务器在 tcp_self_main.lua 中配置 tcp 服务器信息升级前设备连接到 TCP 服务器等待指令下发{fota: true, url: http://airtest.openluat.com/download/FOTA2_DEMO_001.000.001_LuatOS-SoC_V2012_Air780EPM_1.soc}升级中模组收到服务器下发的升级指令后设备开始下载升级包并进行验证升级后升级包下载完成后设备重启升级并循环打印新的版本号信息3.4.3 场景三psm 低功耗 fota此场景是防止 psm 状态下升级没完成就进入休眠导致升级失败的情况写的一个例子。需要注意的是要等待升级成功后再去进入休眠。主要代码如下升级前设备会在开机的时候去请求下配置的 url 的升级包定期唤醒检查是否有升级任务在此过程中模组会保持唤醒状态并等待升级包下载成功并校验通过以及检查版本是否一致。如果版本不一致或升级包检验没通过则进入休眠等待下次唤醒检查升级包。没问题的话升级包下载成功后会重启并升级升级流程如下升级后升级完成后设备显示新的版本号并重新去请求升级包没有新的升级包则会进入 PSM 状态四、常见问题与注意事项4.1 注意事项1、版本号格式使用 IoT 平台时项目的 VERSION 必须为 xxx.yyy.zzz 的三段数字格式如 001.000.001否则平台版本比对可能出错。2、PRODUCT_KEY使用 IoT 平台时必须在 main.lua 中正确定义全局变量 PRODUCT_KEY其值需从 IoT 平台的项目中获取。3、重启时机下载升级包成功result 为 0后通常需要调用 rtos.reboot() 重启设备以更新。你可以根据需要延迟重启。4、自建服务器规则需要升级时服务器应返回 HTTP 200消息体为升级文件内容。无需升级时服务器应返回 HTTP 300 或以上的状态码。5、固件类型使用 IoT 平台进行脚本升级时使用 Luatools 生成的 .bin 量产文件。4.2 为什么升级后我的模块没有任何反应了像是变砖一样有多种可能4.2.1 检查脚本首先先检查下用户自己的脚本有可能是引起重启/死机的代码写在了最前面例如新加的某个值或者函数为 nil 但是还是去做了些加减乘除或者判断大小的逻辑。可以直接本地烧录下新版本的 core 脚本验证如果有 fskv 等用到 flash 的代码可能需要仔细检查才能排除问题比如下载的时候勾选如下图所示的两个选项。4.2.2 检查 core如果是仅脚本升级但是没注意使用了新 core 中才有的接口就有可能引起循环重启如果重启在代码最开头模块可能来不及打印任何日志就重启了可以直接本地烧录下新版本的 core 脚本验证如果有 fskv 等用到 flash 的代码可能需要仔细检查。4.3 检查过脚本和 core没问题为什么会循环升级 6 次以后禁止升级检查下升级包是否正常有时候因为人员误操作经常会出现旧脚本 新 core 或者新脚本 旧 core 的意外组合例如本来应该如下表描述的一样操作人员失误后变成了如下然后误操作旧版本(1) 和误操作新版本(1)进行差分这样虽然脚本版本号旧版本大于了新版本但是 core 的旧版本小于新版本所以升级平台依旧认为是依次有效的升级下发了升级包。升级完成后模块内部脚本版本号变成了 001.000.000 core 版本号为 V2008下次模块请求升级的时候当前固件上报的脚本版本号(001.000.000)依旧小于云平台存储的脚本版本号(001.000.001)然后继续下发升级包就这么循环 6 次然后触发 iot 平台的禁止升级规则在正确生成差分包并且上传成功后可以在 iot 平台里解除禁止升级的限制在我的设备中选择升级 imei 所在的项目然后点击右边的解除禁止升级确定“导致设备循环升级的异常”已经处理完成后点击确定解除即可解除限制升级4.4 我想在服务器发送特定的字符串如update时再触发升级应该怎么做只需要在你希望的升级升级逻辑后面加上升级语句即可例如 mqtt 的 demo 里增加几句话又或者希望按键升级4.5 如何处理同个项目外面有多个版本设备的升级情况4.5.1 场景1多种不同内核固件版本都要升级为最新版本内核固件最新脚本需要对每个版本都生成对应的差分包操作步骤 现有A1、A2、A3三种内核固件需升级为B新脚本 - 生成3个升级包A1→B差分包新脚本、A2→B差分包新脚本、A3→B差分包新脚本 - 在IoT平台创建3个升级配置分别对应三类设备IMEI4.5.2 场景2多种不同内核固件版本不同版本脚本都要升级为最新版本脚本既只升级脚本。操作步骤 1. 准备完整的最新脚本无需内核差分包 2. 在IoT平台创建一个升级配置指定所有需升级设备IMEI列表4.5.3 升级规则说明内核固件仅支持差分升级脚本支持全量升级可一次性完成今天的内容就分享到这里了~