init: Air780EPM 官方 LuatOS 项目代码基线
- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
--[[
|
||||
@module main
|
||||
@summary LuatOS pack API演示主入口,负责加载功能模块
|
||||
@version 1.0
|
||||
@date 2025.10.27
|
||||
@author 陈媛媛
|
||||
@usage
|
||||
本demo演示的核心功能为:
|
||||
1、pack.pack API的各种格式演示
|
||||
2、pack.unpack API的各种用法演示
|
||||
3、大小端编码、字符串格式、数值类型等完整示例
|
||||
|
||||
更多说明参考本目录下的readme.md文件
|
||||
]]
|
||||
|
||||
--[[
|
||||
必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
|
||||
PROJECT:项目名,ascii string类型
|
||||
可以随便定义,只要不使用,就行
|
||||
VERSION:项目版本号,ascii string类型
|
||||
如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
|
||||
X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
|
||||
因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为999
|
||||
如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
|
||||
]]
|
||||
PROJECT = "PACK_DEMO"
|
||||
VERSION = "001.999.000"
|
||||
|
||||
-- 在日志中打印项目名和项目版本号
|
||||
log.info("main", PROJECT, VERSION)
|
||||
|
||||
|
||||
-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
|
||||
-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
|
||||
-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
|
||||
-- 启动errDump日志存储并且上传功能,600秒上传一次
|
||||
-- if errDump then
|
||||
-- errDump.config(true, 600)
|
||||
-- end
|
||||
|
||||
-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
|
||||
-- 可以使用合宙的iot.openluat.com平台进行远程升级
|
||||
-- 也可以使用客户自己搭建的平台进行远程升级
|
||||
-- 远程升级的详细用法,可以参考fota的demo进行使用
|
||||
|
||||
|
||||
-- 启动一个循环定时器
|
||||
-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
|
||||
-- 方便分析内存使用是否有异常
|
||||
-- sys.timerLoopStart(function()
|
||||
-- log.info("mem.lua", rtos.meminfo())
|
||||
-- log.info("mem.sys", rtos.meminfo("sys"))
|
||||
-- end, 3000)
|
||||
|
||||
|
||||
-- 仅加载必要的功能模块
|
||||
require "pack_demo" -- pack API演示模块
|
||||
|
||||
-- 用户代码已结束---------------------------------------------
|
||||
sys.run()
|
||||
-- sys.run()之后不要加任何语句!!!!!
|
||||
@@ -0,0 +1,165 @@
|
||||
--[[
|
||||
@summary pack API演示脚本
|
||||
@version 1.0
|
||||
@date 2025.10.27
|
||||
@author 陈媛媛
|
||||
@usage
|
||||
本脚本演示pack.pack和pack.unpack API的各种用法:
|
||||
1、大小端编码演示:使用'<'和'>'格式符进行小端和大端编码
|
||||
2、多种数据类型打包:打包short、int、float等多种数据类型
|
||||
3、字符串格式演示:'a'格式(带长度前缀)和'z'格式(以null结尾)的字符串打包和解包
|
||||
4、An格式演示:An格式(如A2、A5)的打包行为,即打包前n个字符串参数
|
||||
5、指定位置解包:从指定位置开始解包数据
|
||||
6、复杂数据组合:打包和解包复杂的数据结构,包括整数、字符串和短整数
|
||||
7、边界情况测试:空数据打包和解包,以及数值边界测试
|
||||
]]
|
||||
|
||||
-- 初始化函数
|
||||
local function init()
|
||||
log.info("pack_demo", "脚本初始化完成")
|
||||
end
|
||||
|
||||
-- 大小端编码演示
|
||||
local function demo_endian()
|
||||
log.info("\n--- 实验1:大小端编码 ---")
|
||||
|
||||
-- 小端编码
|
||||
local data_le = pack.pack("<I", 0xAABBCCDD)
|
||||
log.info("小端编码:", data_le:toHex())
|
||||
|
||||
-- 大端编码
|
||||
local data_be = pack.pack(">I", 0xAABBCCDD)
|
||||
log.info("大端编码:", data_be:toHex())
|
||||
|
||||
-- 解包验证
|
||||
local _, val_le = pack.unpack(data_le, "<I")
|
||||
local _, val_be = pack.unpack(data_be, ">I")
|
||||
log.info("解包验证 - 小端:", string.format("0x%08X", val_le))
|
||||
log.info("解包验证 - 大端:", string.format("0x%08X", val_be))
|
||||
end
|
||||
|
||||
-- 多种数据类型打包演示
|
||||
local function demo_mixed_types()
|
||||
log.info("\n--- 实验2:多种数据类型打包 ---")
|
||||
|
||||
-- 打包多个不同类型数据
|
||||
local mixed_data = pack.pack("<hIf", 123, 456789, 3.14)
|
||||
log.info("混合数据打包:", mixed_data:toHex())
|
||||
|
||||
-- 解包混合数据
|
||||
local _, short_val, int_val, float_val = pack.unpack(mixed_data, "<hIf")
|
||||
log.info("解包混合数据:", short_val, int_val, float_val)
|
||||
end
|
||||
|
||||
-- 字符串格式演示
|
||||
local function demo_string_formats()
|
||||
log.info("\n--- 实验3:字符串格式演示 ---")
|
||||
|
||||
-- 'a' 格式 - 带长度前缀的字符串
|
||||
local str_data_a = pack.pack('a', "LuatOS")
|
||||
log.info("'a'格式字符串:", str_data_a:toHex())
|
||||
|
||||
-- 解包a格式
|
||||
local _, str_a = pack.unpack(str_data_a, 'a')
|
||||
log.info("'a'格式解包:", str_a)
|
||||
|
||||
-- 'z' 格式 - 以null结尾的字符串
|
||||
local str_data_z = pack.pack('z', "LuatOS")
|
||||
log.info("'z'格式字符串:", str_data_z:toHex())
|
||||
|
||||
-- 解包z格式
|
||||
local _, str_z = pack.unpack(str_data_z, 'z')
|
||||
log.info("'z'格式解包:", str_z)
|
||||
end
|
||||
|
||||
-- An格式演示
|
||||
local function demo_An_format()
|
||||
log.info("\n--- 实验4:'An'格式演示 ---")
|
||||
|
||||
-- 'A' 格式 - 打包第一个参数的整个字符串
|
||||
local str_data_A = pack.pack('A', "hezhou", "LuatOS")
|
||||
log.info("'A'格式打包:", str_data_A:toHex())
|
||||
log.info("'A'格式结果:", str_data_A)
|
||||
|
||||
-- 'A5' 格式 - 打包前5个字符串参数
|
||||
local str_data_A5 = pack.pack('A5', "he", "zhou", "LuatOS", "!", "!")
|
||||
log.info("'A5'格式打包:", str_data_A5:toHex())
|
||||
log.info("'A5'格式结果:", str_data_A5)
|
||||
end
|
||||
|
||||
-- 指定位置解包演示
|
||||
local function demo_position_unpack()
|
||||
log.info("\n--- 实验5:指定位置解包 ---")
|
||||
|
||||
-- 打包多个数据
|
||||
local multi_data = pack.pack("<hIh", 100, 200, 300)
|
||||
log.info("多数据打包:", multi_data:toHex())
|
||||
|
||||
-- 从指定位置开始解包
|
||||
local pos, val1 = pack.unpack(multi_data, "<h", 1) -- 从位置1开始解包
|
||||
local pos, val2 = pack.unpack(multi_data, "<I", pos) -- 从上次结束位置开始
|
||||
local pos, val3 = pack.unpack(multi_data, "<h", pos) -- 继续解包
|
||||
log.info("分步解包结果:", val1, val2, val3)
|
||||
end
|
||||
|
||||
-- 复杂数据组合演示
|
||||
local function demo_complex_data()
|
||||
log.info("\n--- 实验6:复杂数据组合 ---")
|
||||
|
||||
-- 打包复杂数据结构
|
||||
local complex_data = pack.pack(">H a h", 0x1234, "Test", -50)
|
||||
log.info("复杂数据打包:", complex_data:toHex())
|
||||
|
||||
-- 解包复杂数据
|
||||
local _, header, text, value = pack.unpack(complex_data, ">H a h")
|
||||
log.info("复杂数据解包:", string.format("0x%04X", header), text, value)
|
||||
end
|
||||
|
||||
-- 边界情况演示
|
||||
local function demo_edge_cases()
|
||||
log.info("\n--- 实验7:边界情况 ---")
|
||||
|
||||
-- 打包空数据
|
||||
local empty_data = pack.pack("")
|
||||
log.info("空格式打包:", empty_data:toHex())
|
||||
|
||||
-- 解包空数据
|
||||
local pos_empty = pack.unpack("", "")
|
||||
log.info("空格式解包位置:", pos_empty)
|
||||
|
||||
-- 数值边界测试
|
||||
local max_short = pack.pack("<h", 32767)
|
||||
local min_short = pack.pack("<h", -32768)
|
||||
log.info("短整型边界 - 最大值:", max_short:toHex())
|
||||
log.info("短整型边界 - 最小值:", min_short:toHex())
|
||||
|
||||
local _, max_val = pack.unpack(max_short, "<h")
|
||||
local _, min_val = pack.unpack(min_short, "<h")
|
||||
log.info("边界值验证:", max_val, min_val)
|
||||
end
|
||||
|
||||
-- 运行所有演示
|
||||
local function run_all_demos()
|
||||
log.info("=== pack.pack 和 pack.unpack API 演示开始 ===")
|
||||
|
||||
init()
|
||||
demo_endian()
|
||||
demo_mixed_types()
|
||||
demo_string_formats()
|
||||
demo_An_format()
|
||||
demo_position_unpack()
|
||||
demo_complex_data()
|
||||
demo_edge_cases()
|
||||
|
||||
log.info("=== pack API 演示完成 ===")
|
||||
end
|
||||
|
||||
-- 主任务函数
|
||||
local function main()
|
||||
log.info("pack_demo", "开始运行pack API演示")
|
||||
run_all_demos()
|
||||
log.info("pack_demo", "演示运行完毕")
|
||||
end
|
||||
|
||||
-- 启动演示任务
|
||||
sys.taskInit(main)
|
||||
@@ -0,0 +1,139 @@
|
||||
# pack_DEMO 项目说明
|
||||
|
||||
## 项目概述
|
||||
本项目演示了LuatOS的pack核心库的使用,pack核心库提供了二进制数据的打包和解包功能,支持多种数据格式和字节序。
|
||||
|
||||
## 功能说明
|
||||
|
||||
本demo通过7个实验演示pack核心库的主要功能:
|
||||
|
||||
大小端编码演示:使用'<'和'>'格式符进行小端和大端编码
|
||||
|
||||
多种数据类型打包:打包short、int、float等多种数据类型
|
||||
|
||||
字符串格式演示:'a'格式(带长度前缀)和'z'格式(以null结尾)的字符串打包和解包
|
||||
|
||||
An格式演示:An格式(如A2、A5)的打包行为,即打包前n个字符串参数
|
||||
|
||||
指定位置解包:从指定位置开始解包数据
|
||||
|
||||
复杂数据组合:打包和解包复杂的数据结构,包括整数、字符串和短整数
|
||||
|
||||
边界情况测试:空数据打包和解包,以及数值边界测试
|
||||
|
||||
## 演示硬件环境
|
||||
|
||||
1、Air780EPM开发板
|
||||
|
||||

|
||||
|
||||
2、TYPE-C USB数据线一根
|
||||
- Air780EPM开发板通过 TYPE-C USB 口供电;
|
||||
- TYPE-C USB 数据线直接插到核心板的 TYPE-C USB 座子,另外一端连接电脑 USB 口;
|
||||
|
||||
|
||||
## 演示软件环境
|
||||
|
||||
1、Luatools下载调试工具 [https://docs.openluat.com/air780epm/common/Luatools/]
|
||||
|
||||
2、固件版本LuatOS-SoC_V2016_Air780EPM 版本固件。不同版本区别请见 https://docs.openluat.com/air780epm/luatos/firmware/version/
|
||||
|
||||
3、lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;
|
||||
|
||||
4、准备好软件环境之后,接下来查看[如何烧录项目文件到 Air780EPM开发板中](https://docs.openluat.com/air780epm/luatos/common/download/)将本篇文章中演示使用的项目文件烧录到相应的核心板中。
|
||||
|
||||
## 相关软件资料
|
||||
|
||||
pack 核心库文档:https://docs.openluat.com/osapi/core/pack/
|
||||
|
||||
## 演示核心步骤
|
||||
|
||||
1、搭建好硬件环境
|
||||
|
||||
2、Luatools烧录内核固件和demo脚本代码
|
||||
|
||||
3、烧录成功后,自动开机运行
|
||||
|
||||
4、在日志中查看演示结果
|
||||
|
||||
本demo包含7个实验,运行后会在日志中输出每一步的结果:
|
||||
|
||||
- 实验1:大小端编码
|
||||
|
||||
演示如何使用'<'和'>'格式符进行小端和大端编码
|
||||
|
||||
``` lua
|
||||
I/user.小端编码: DDCCBBAA 8
|
||||
I/user.大端编码: AABBCCDD 8
|
||||
I/user.解包验证 - 小端: 0xAABBCCDD
|
||||
I/user.解包验证 - 大端: 0xAABBCCDD
|
||||
```
|
||||
|
||||
- 实验2:多种数据类型打包
|
||||
|
||||
演示如何同时打包short、int、float等多种数据类型
|
||||
|
||||
``` lua
|
||||
I/user.混合数据打包: 7B0055F80600C3F54840 20
|
||||
I/user.解包混合数据: 123 456789 3.140000
|
||||
```
|
||||
|
||||
|
||||
- 实验3:字符串格式演示
|
||||
|
||||
演示'a'格式(带长度前缀)和'z'格式(以null结尾)的字符串打包和解包
|
||||
|
||||
``` lua
|
||||
I/user.'a'格式字符串: 060000004C7561744F53 20
|
||||
I/user.'a'格式解包: LuatOS
|
||||
I/user.'z'格式字符串: 4C7561744F5300 14
|
||||
I/user.'z'格式解包: LuatOS
|
||||
```
|
||||
|
||||
- 实验4:An格式演示
|
||||
|
||||
演示An格式(如A2、A5)的打包行为,即打包前n个字符串参数
|
||||
|
||||
``` lua
|
||||
I/user.'A'格式打包: 68657A686F75 12
|
||||
I/user.'A'格式结果: hezhou
|
||||
I/user.'A5'格式打包: 68657A686F754C7561744F532121 28
|
||||
I/user.'A5'格式结果: hezhouLuatOS!!
|
||||
```
|
||||
|
||||
- 实验5:指定位置解包
|
||||
|
||||
演示如何从指定位置开始解包数据
|
||||
|
||||
``` lua
|
||||
I/user.多数据打包: 6400C80000002C01 16
|
||||
I/user.分步解包结果: 100 200 300
|
||||
```
|
||||
|
||||
- 实验6:复杂数据组合
|
||||
|
||||
演示如何打包和解包复杂的数据结构,包括整数、字符串和短整数
|
||||
|
||||
``` lua
|
||||
I/user.复杂数据打包: 12340000000454657374FFCE 24
|
||||
I/user.复杂数据解包: 0x1234 Test -50
|
||||
```
|
||||
|
||||
- 实验7:边界情况
|
||||
|
||||
演示空数据打包和解包,以及数值边界测试
|
||||
|
||||
``` lua
|
||||
I/user.空格式打包: 0
|
||||
I/user.空格式解包位置: 1
|
||||
I/user.短整型边界 - 最大值: FF7F 4
|
||||
I/user.短整型边界 - 最小值: 0080 4
|
||||
I/user.边界值验证: 32767 -32768
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
本demo仅用于演示pack核心库的基本用法,更多高级用法请参考[pack 核心板文档](https://docs.openluat.com/osapi/core/pack/)。
|
||||
|
||||
在实际使用中,请根据具体需求选择合适的数据类型和字节序。
|
||||
|
||||
Reference in New Issue
Block a user