init: Air780EPM 官方 LuatOS 项目代码基线

- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码
- 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等)
- 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
wangfq
2026-08-31 08:53:49 +08:00
commit 173dd6874f
813 changed files with 125484 additions and 0 deletions
@@ -0,0 +1,375 @@
## 功能模块介绍
1、main.lua:主程序入口;
2、fota_file.lua:介绍了使用文件系统进行FOTA升级功能的实现模块,包括完整的升级流程;
3、fota_uart.lua:介绍了使用串口分段进行FOTA升级功能的实现模块,包括完整的升级流程;
4、main.py:Python脚本工具,用于通过串口分段发送升级包,演示分段升级的流程;
5、fota_uart.bin:演示串口分段升级的升级包文件,升级内容仅升级版本号以及添加几行打印;
## 演示功能概述
FOTA是固件远程升级的简称,用于设备固件的远程更新和维护;
本demo演示的核心功能为:
Air780EPM模块的两种FOTA升级方式:文件系统直接升级和串口分段升级;
分两种不同的应用场景来演示固件升级的实现方法:
1、文件系统直接升级:通过模组文件系统中的文件直接升级,代码演示通过luatools的烧录文件系统功能将升级包文件直接烧录到文件系统然后升级;
2、分段升级:通过串口将升级包文件分多个片段发送,每个片段接收并写入,代码演示使用usb虚拟串口分段写入升级包升级;
适用场景:
非标准数据传输 -> 串口、TCP、MQTT等自定义通道升级
流程精细控制 -> 需要自定义升级前后处理逻辑
## 演示硬件环境
![](https://docs.openluat.com/air780epm/luatos/app/driver/eth/image/RFSvb75NRoEWqYxfCRVcVrOKnsf.jpg)
1、Air780EPM V1.3版本开发板一块
2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air780EPM V1.3版本开发板和数据线的硬件接线方式为:
- Air780EPM V1.3版本开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
## 演示软件环境
1、Luatools下载调试工具
2、[Air780EPM V2016版本固件)](https://docs.openluat.com/air780epm/luatos/firmware/version/)
3、Python 3 环境(用于运行main.py发送升级包)
## 演示操作步骤
### 方式1:文件系统直接升级
1、搭建好演示硬件环境
2、修改demo脚本代码,取消`main.lua``require("fota_file")`的注释,注释掉`require("fota_uart")`
3、使用Luatools制作升级包,先把新旧版本分别生成量产文件,然后再制作升级包,工具上栏 luatOS->固件工具->差分包/整包升级包制作,将制作好的升级包放到luatools工具上面的烧录文件系统功能。
4、Luatools烧录内核固件和修改前的demo脚本代码,以及升级包文件。烧录成功后,自动开机运行。
5、可以看到如下日志:
日志分析如下:
1. 开始升级,读取文件系统目录下的升级包文件/update.bin
2. FOTA初始化 → 底层就绪 → 文件写入 → MD5校验通过
3. 升级完成,版本验证成功
4. 设备自动重启
5. 新版本 1.0.1 正常运行,新增日志确认升级成功
结果:文件系统FOTA升级完全成功,版本从1.0.0升级到1.0.1
```lua
[2025-10-24 17:56:47.892][000000005.840] D/mobile bearer act 0, result 0
[2025-10-24 17:56:47.902][000000005.841] D/mobile NETIF_LINK_ON -> IP_READY
[2025-10-24 17:56:47.911][000000005.890] D/mobile TIME_SYNC 0
[2025-10-24 17:56:48.203][000000006.204] I/user.fota version 1.0.0
[2025-10-24 17:56:49.208][000000007.204] I/user.fota version 1.0.0
[2025-10-24 17:56:50.205][000000008.204] I/user.fota version 1.0.0
[2025-10-24 17:56:51.205][000000009.205] I/user.fota version 1.0.0
[2025-10-24 17:56:52.199][000000010.205] I/user.fota version 1.0.0
[2025-10-24 17:56:52.207][000000010.210] I/user.FOTA_FILE === ===
[2025-10-24 17:56:52.217][000000010.210] I/user.FOTA_FILE FOTA...
[2025-10-24 17:56:52.224][000000010.226] I/user.FOTA_FILE ...
[2025-10-24 17:56:52.234][000000010.226] I/user.FOTA_FILE
[2025-10-24 17:56:52.242][000000010.227] I/user.FOTA_FILE /update.bin
[2025-10-24 17:56:52.251][000000010.230] I/fota write common data
[2025-10-24 17:56:52.309][000000010.311] I/fota common data done, now checking 0
[2025-10-24 17:56:52.317][000000010.312] I/fota common data md5 ok
[2025-10-24 17:56:52.325][000000010.312] I/fota only common data
[2025-10-24 17:56:52.358][000000010.362] I/fota fota type 0 ok!, wait reboot
[2025-10-24 17:56:52.370][000000010.362] I/user.FOTA_FILE flash中的fota分区结果 true true 0
[2025-10-24 17:56:52.380][000000010.363] I/user.FOTA_FILE fota分区...
[2025-10-24 17:56:52.389][000000010.363] I/user.FOTA_FILE fota分区状态 : true : true
[2025-10-24 17:56:52.402][000000010.363] I/user.FOTA_FILE
[2025-10-24 17:56:53.199][000000011.205] I/user.fota version 1.0.0
[2025-10-24 17:56:54.197][000000012.205] I/user.fota version 1.0.0
[2025-10-24 17:56:55.575][000000000.000] main_entry 708:SDK base line V017_pb18.002
[2025-10-24 17:56:55.589][000000000.008] am_service_init 1154:Air780EPM_A11
[2025-10-24 17:56:55.604][000000000.008] am_get_chip_type 635:6bef6,19,24,c7,0,EC718
[2025-10-24 17:56:55.618][000000000.049] bsp_user_init_io 312:io volt 3.3v 21
[2025-10-24 17:56:55.630][000000000.050] BSP_CustomInit 558:hardfault mode init 4
[2025-10-24 17:56:55.643][000000000.050] Uart_ChangeBR 1338:uart0, 6000000 6028985 26000000 69
[2025-10-24 17:56:55.654][000000000.072] I/pm poweron: Power/Reset
[2025-10-24 17:56:55.668][000000000.181] self_info 127:model Air780EPM_A11 imei 862419074066563
[2025-10-24 17:56:55.682][000000000.181] self_info 129:firmware[1] BASIC
[2025-10-24 17:56:55.692][000000000.181] self_info 131:zone(kbytes) fs 168 script 256
[2025-10-24 17:56:55.704][000000000.181] I/main LuatOS@Air780EPM base 25.03 bsp V2016 32bit
[2025-10-24 17:56:55.720][000000000.181] I/main ROM Build: Oct 9 2025 21:32:15
[2025-10-24 17:56:55.734][000000000.183] W/pins /luadb/pins_AIR780EPM.json not exist!!
[2025-10-24 17:56:55.749][000000000.186] D/main loadlibs luavm 1048568 14888 14888
[2025-10-24 17:56:55.762][000000000.186] D/main loadlibs sys 2375432 53100 58844
[2025-10-24 17:56:55.772][000000000.186] D/main loadlibs psram 2375432 53184 58844
[2025-10-24 17:56:56.105][000000001.206] I/user.fota version 1.0.1
[2025-10-24 17:56:56.118][000000001.206] I/user.fota123456789
[2025-10-24 17:56:57.105][000000002.206] I/user.fota version 1.0.1
[2025-10-24 17:56:57.111][000000002.207] I/user.fota123456789
[2025-10-24 17:56:58.108][000000003.207] I/user.fota version 1.0.1
[2025-10-24 17:56:58.116][000000003.208] I/user.fota123456789
```
### 方式2:串口分段升级
1、搭建好演示硬件环境
2、修改demo脚本代码,确保`main.lua`中已注释`require("fota_file")`,取消`require("fota_uart")`的注释
3、使用Luatools制作升级包,先把新旧版本分别生成量产文件,然后再制作升级包,工具上栏 luatOS->固件工具->差分包/整包升级包制作,将制作好的升级包放在main.py同级目录下
4、Luatools烧录内核固件和修改前的demo脚本代码,烧录成功后,自动开机运行。
5、确认设备连接到电脑的串口(虚拟USB串口)
6、按一下核心板上的Powerkey键,然后运行Python脚本发送升级包:
```lua
python main.py
```
7、脚本会自动寻找设备虚拟串口,发送升级命令并传输`fota_uart.bin`文件
8、设备接收并验证升级包,升级成功后会自动重启
9、可以看到如下日志:
串口分段升级日志解读:
1. USB虚拟串口连接,收到#FOTA起始指令
2. 开始分段接收升级包,每次256字节,累计5751字节
3. 所有数据包写入成功,MD5校验通过
4. 升级完成,重启
5. 重启后新版本1.0.2运行,新增日志确认升级成功
结果:串口FOTA升级完全成功,版本从1.0.0升级到1.0.2。
```lua
[2025-10-24 19:04:42.229][000000130.217] I/user.fota version 1.0.0
[2025-10-24 19:04:43.235][000000131.217] I/user.fota version 1.0.0
[2025-10-24 19:04:44.239][000000132.217] I/user.fota version 1.0.0
[2025-10-24 19:04:44.896][000000132.888] luat_usb_recv_cb 447:usb serial connected
[2025-10-24 19:04:44.909][000000132.889] I/user.uart 6 6
[2025-10-24 19:04:44.921][000000132.891] I/user.fota fota起始标记,FOTA状态 #FOTA
[2025-10-24 19:04:45.238][000000133.217] I/user.fota version 1.0.0
[2025-10-24 19:04:45.916][000000133.894] I/user.uart 256 262
[2025-10-24 19:04:45.931][000000133.895] I/user.fota包 256 256
[2025-10-24 19:04:45.939][000000133.896] I/fota write common data
[2025-10-24 19:04:45.957][000000133.896] D/user.fota.run true false 1
[2025-10-24 19:04:45.968][000000133.896] I/user.fota 256
[2025-10-24 19:04:46.227][000000134.217] I/user.fota version 1.0.0
[2025-10-24 19:04:46.929][000000134.906] I/user.uart 256 518
[2025-10-24 19:04:46.942][000000134.907] I/user.fota包 256 512
[2025-10-24 19:04:46.953][000000134.908] D/user.fota.run true false 1
[2025-10-24 19:04:46.964][000000134.908] I/user.fota 256
[2025-10-24 19:04:47.227][000000135.217] I/user.fota version 1.0.0
[2025-10-24 19:04:47.940][000000135.917] I/user.uart 256 774
[2025-10-24 19:04:47.950][000000135.918] I/user.fota包 256 768
[2025-10-24 19:04:47.963][000000135.919] D/user.fota.run true false 1
[2025-10-24 19:04:47.971][000000135.919] I/user.fota 256
[2025-10-24 19:04:48.238][000000136.217] I/user.fota version 1.0.0
[2025-10-24 19:04:48.956][000000136.933] I/user.uart 256 1030
[2025-10-24 19:04:48.965][000000136.933] I/user.fota包 256 1024
[2025-10-24 19:04:48.976][000000136.934] D/user.fota.run true false 1
[2025-10-24 19:04:48.986][000000136.934] I/user.fota 256
[2025-10-24 19:04:49.237][000000137.217] I/user.fota version 1.0.0
[2025-10-24 19:04:49.968][000000137.945] I/user.uart 256 1286
[2025-10-24 19:04:49.977][000000137.946] I/user.fota包 256 1280
[2025-10-24 19:04:49.987][000000137.946] D/user.fota.run true false 1
[2025-10-24 19:04:49.995][000000137.947] I/user.fota 256
[2025-10-24 19:04:50.231][000000138.217] I/user.fota version 1.0.0
[2025-10-24 19:04:50.981][000000138.957] I/user.uart 256 1542
[2025-10-24 19:04:50.990][000000138.958] I/user.fota包 256 1536
[2025-10-24 19:04:51.008][000000138.958] D/user.fota.run true false 1
[2025-10-24 19:04:51.016][000000138.959] I/user.fota 256
[2025-10-24 19:04:51.229][000000139.217] I/user.fota version 1.0.0
[2025-10-24 19:04:51.992][000000139.969] I/user.uart 256 1798
[2025-10-24 19:04:52.002][000000139.970] I/user.fota包 256 1792
[2025-10-24 19:04:52.013][000000139.970] D/user.fota.run true false 1
[2025-10-24 19:04:52.020][000000139.971] I/user.fota 256
[2025-10-24 19:04:52.228][000000140.217] I/user.fota version 1.0.0
[2025-10-24 19:04:53.007][000000140.984] I/user.uart 256 2054
[2025-10-24 19:04:53.019][000000140.985] I/user.fota包 256 2048
[2025-10-24 19:04:53.029][000000140.985] D/user.fota.run true false 1
[2025-10-24 19:04:53.037][000000140.985] I/user.fota 256
[2025-10-24 19:04:53.226][000000141.217] I/user.fota version 1.0.0
[2025-10-24 19:04:54.005][000000141.997] I/user.uart 256 2310
[2025-10-24 19:04:54.019][000000141.998] I/user.fota包 256 2304
[2025-10-24 19:04:54.034][000000141.998] D/user.fota.run true false 1
[2025-10-24 19:04:54.044][000000141.999] I/user.fota 256
[2025-10-24 19:04:54.225][000000142.217] I/user.fota version 1.0.0
[2025-10-24 19:04:55.022][000000142.998] I/user.uart 256 2566
[2025-10-24 19:04:55.032][000000142.999] I/user.fota包 256 2560
[2025-10-24 19:04:55.042][000000143.000] D/user.fota.run true false 1
[2025-10-24 19:04:55.050][000000143.000] I/user.fota 256
[2025-10-24 19:04:55.240][000000143.217] I/user.fota version 1.0.0
[2025-10-24 19:04:56.035][000000144.012] I/user.uart 256 2822
[2025-10-24 19:04:56.044][000000144.013] I/user.fota包 256 2816
[2025-10-24 19:04:56.054][000000144.013] D/user.fota.run true false 1
[2025-10-24 19:04:56.060][000000144.014] I/user.fota 256
[2025-10-24 19:04:56.237][000000144.217] I/user.fota version 1.0.0
[2025-10-24 19:04:57.048][000000145.024] I/user.uart 256 3078
[2025-10-24 19:04:57.063][000000145.025] I/user.fota包 256 3072
[2025-10-24 19:04:57.076][000000145.026] D/user.fota.run true false 1
[2025-10-24 19:04:57.088][000000145.026] I/user.fota 256
[2025-10-24 19:04:57.235][000000145.217] I/user.fota version 1.0.0
[2025-10-24 19:04:58.057][000000146.034] I/user.uart 256 3334
[2025-10-24 19:04:58.065][000000146.035] I/user.fota包 256 3328
[2025-10-24 19:04:58.076][000000146.035] D/user.fota.run true false 1
[2025-10-24 19:04:58.085][000000146.035] I/user.fota 256
[2025-10-24 19:04:58.228][000000146.217] I/user.fota version 1.0.0
[2025-10-24 19:04:59.070][000000147.048] I/user.uart 256 3590
[2025-10-24 19:04:59.079][000000147.049] I/user.fota包 256 3584
[2025-10-24 19:04:59.085][000000147.049] D/user.fota.run true false 1
[2025-10-24 19:04:59.094][000000147.049] I/user.fota 256
[2025-10-24 19:04:59.227][000000147.217] I/user.fota version 1.0.0
[2025-10-24 19:05:00.083][000000148.061] I/user.uart 256 3846
[2025-10-24 19:05:00.096][000000148.062] I/user.fota包 256 3840
[2025-10-24 19:05:00.109][000000148.062] D/user.fota.run true false 1
[2025-10-24 19:05:00.121][000000148.062] I/user.fota 256
[2025-10-24 19:05:00.240][000000148.217] I/user.fota version 1.0.0
[2025-10-24 19:05:01.093][000000149.070] I/user.uart 256 4102
[2025-10-24 19:05:01.102][000000149.071] I/user.fota包 256 4096
[2025-10-24 19:05:01.112][000000149.071] D/user.fota.run true false 1
[2025-10-24 19:05:01.119][000000149.071] I/user.fota 256
[2025-10-24 19:05:01.233][000000149.217] I/user.fota version 1.0.0
[2025-10-24 19:05:02.090][000000150.082] I/user.uart 256 4358
[2025-10-24 19:05:02.102][000000150.083] I/user.fota包 256 4352
[2025-10-24 19:05:02.136][000000150.116] D/user.fota.run true false 1
[2025-10-24 19:05:02.144][000000150.116] I/user.fota 256
[2025-10-24 19:05:02.229][000000150.217] I/user.fota version 1.0.0
[2025-10-24 19:05:03.117][000000151.094] I/user.uart 256 4614
[2025-10-24 19:05:03.144][000000151.095] I/user.fota包 256 4608
[2025-10-24 19:05:03.153][000000151.095] D/user.fota.run true false 1
[2025-10-24 19:05:03.162][000000151.096] I/user.fota 256
[2025-10-24 19:05:03.226][000000151.216] I/user.fota version 1.0.0
[2025-10-24 19:05:04.118][000000152.095] I/user.uart 256 4870
[2025-10-24 19:05:04.128][000000152.096] I/user.fota包 256 4864
[2025-10-24 19:05:04.138][000000152.097] D/user.fota.run true false 1
[2025-10-24 19:05:04.152][000000152.097] I/user.fota 256
[2025-10-24 19:05:04.227][000000152.216] I/user.fota version 1.0.0
[2025-10-24 19:05:05.133][000000153.108] I/user.uart 256 5126
[2025-10-24 19:05:05.147][000000153.109] I/user.fota包 256 5120
[2025-10-24 19:05:05.167][000000153.109] D/user.fota.run true false 1
[2025-10-24 19:05:05.179][000000153.110] I/user.fota 256
[2025-10-24 19:05:05.226][000000153.217] I/user.fota version 1.0.0
[2025-10-24 19:05:06.126][000000154.117] I/user.uart 256 5382
[2025-10-24 19:05:06.138][000000154.118] I/user.fota包 256 5376
[2025-10-24 19:05:06.150][000000154.119] D/user.fota.run true false 1
[2025-10-24 19:05:06.161][000000154.119] I/user.fota 256
[2025-10-24 19:05:06.233][000000154.216] I/user.fota version 1.0.0
[2025-10-24 19:05:07.155][000000155.132] I/user.uart 256 5638
[2025-10-24 19:05:07.167][000000155.133] I/user.fota包 256 5632
[2025-10-24 19:05:07.181][000000155.133] D/user.fota.run true false 1
[2025-10-24 19:05:07.192][000000155.133] I/user.fota 256
[2025-10-24 19:05:07.234][000000155.216] I/user.fota version 1.0.0
[2025-10-24 19:05:08.170][000000156.147] I/user.uart 113 5751
[2025-10-24 19:05:08.189][000000156.148] I/user.fota包 113 5745
[2025-10-24 19:05:08.209][000000156.177] I/fota common data done, now checking 0
[2025-10-24 19:05:08.232][000000156.179] I/fota common data md5 ok
[2025-10-24 19:05:08.256][000000156.179] I/fota only common data
[2025-10-24 19:05:08.268][000000156.213] I/fota fota type 0 ok!, wait reboot
[2025-10-24 19:05:08.278][000000156.213] D/user.fota.run true true 0
[2025-10-24 19:05:08.287][000000156.217] I/user.fota version 1.0.0
[2025-10-24 19:05:08.324][000000156.314] I/user.fota ,1s后重启
[2025-10-24 19:05:09.227][000000157.217] I/user.fota version 1.0.0
[2025-10-24 19:05:10.822][000000000.000] main_entry 708:SDK base line V017_pb18.002
[2025-10-24 19:05:10.835][000000000.008] am_service_init 1154:Air780EPM_A11
[2025-10-24 19:05:10.847][000000000.008] am_get_chip_type 635:6bef6,19,24,c7,0,EC718
[2025-10-24 19:05:10.858][000000000.051] bsp_user_init_io 312:io volt 3.3v 21
[2025-10-24 19:05:10.870][000000000.051] BSP_CustomInit 558:hardfault mode init 4
[2025-10-24 19:05:10.879][000000000.052] Uart_ChangeBR 1338:uart0, 6000000 6028985 26000000 69
[2025-10-24 19:05:10.894][000000000.073] I/pm poweron: Power/Reset
[2025-10-24 19:05:10.908][000000000.185] self_info 127:model Air780EPM_A11 imei 862419074066563
[2025-10-24 19:05:10.920][000000000.186] self_info 129:firmware[1] BASIC
[2025-10-24 19:05:10.935][000000000.186] self_info 131:zone(kbytes) fs 168 script 256
[2025-10-24 19:05:10.946][000000000.186] I/main LuatOS@Air780EPM base 25.03 bsp V2016 32bit
[2025-10-24 19:05:10.956][000000000.186] I/main ROM Build: Oct 9 2025 21:32:15
[2025-10-24 19:05:10.972][000000000.188] W/pins /luadb/pins_AIR780EPM.json not exist!!
[2025-10-24 19:05:10.987][000000000.191] D/main loadlibs luavm 1048568 14888 14888
[2025-10-24 19:05:11.002][000000000.191] D/main loadlibs sys 2375432 53100 58844
[2025-10-24 19:05:11.018][000000000.191] D/main loadlibs psram 2375432 53184 58844
[2025-10-24 19:05:11.257][000000001.213] I/user.fota version 1.0.2
[2025-10-24 19:05:11.273][000000001.213] I/user.fota1111122222222222
[2025-10-24 19:05:12.083][000000002.214] I/user.fota version 1.0.2
[2025-10-24 19:05:12.094][000000002.214] I/user.fota1111122222222222
[2025-10-24 19:05:13.079][000000003.215] I/user.fota version 1.0.2
[2025-10-24 19:05:13.088][000000003.215] I/user.fota1111122222222222
```
main.py 日志:
```lua
D:\gitee_hz\fota>python main.py
COM59
b'#FOTA RDY\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
256
b'#FOTA NEXT\n'
113
b'#FOTA OK\n'
,退
```