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,149 @@
--[[
@module fskv_test
@summary fskv_test测试功能模块
@version 1.0
@date 2025.11.14
@author 马亚丹
@usage
本demo演示的功能为:使用Air780EPM核心板演示fskv核心库API的用法,演示设置kv数据、设置 table 内的键值对数据,用kv迭代器遍历kv数据,删除kv数据等操作。
运行核心逻辑:
1.初始化fskv
2.获取 kv 数据库状态
3.设置不同类型的kv数据
4.设置 table 内的键值对数据
5.根据 key 获取对应的数据
6.使用kv迭代器遍历kv数据
7.删除kv数据,清空KV数据
]]
--1.定义功能函数:置kv 数据
local function setKV()
--如下所示设置用户数据是字符串
local r1 = fskv.set("my_str", "goodgoodstudy")
log.info("fskv设置用户数据是字符串", r1)
--如下所示设置用户数据是布尔值
local r2 = fskv.set("my_bool", true)
log.info("fskv设置用户数据是布尔值", r2)
--如下所示设置用户数据是数值
local r3 = fskv.set("my_number", 1.23)
log.info("fskv设置用户数据是数值", r3)
--如下所示设置用户数据是整数
local r4 = fskv.set("my_int", 5)
log.info("fskv设置用户数据是整数", r4)
--如下所示设置用户数据是table
local r5 = fskv.set("my_table", { name = "wendal", age = 18 })
log.info("fskv用户数据是table类型", r5)
return true
end
--2.定义功能函数:设置 table 内的键值对数据
local function setttable()
--如下所示设置用户数据是字符串
local r1=fskv.sett("mytable", "wendal", "goodgoodstudy")
log.info("mytable设置用户数据是字符串", r1)
--如下所示设置用户数据是布尔值
local r2=fskv.sett("mytable", "upgrade", true)
log.info("mytable设置用户数据是布尔值", r2)
--如下所示设置用户数据是数值
local r3=fskv.sett("mytable", "timer", 1)
log.info("mytable设置用户数据是数值", r3)
--如下所示设置用户数据是table
local r4=fskv.sett("mytable", "bigd", { name = "wendal", age = 123 })
log.info("mytable设置用户数据是table", r4)
return true
end
--3.定义功能函数:获取kv数据
local function getKV()
local my_str = fskv.get("my_str")
log.info("获取my_str的类型和值", type(my_str), my_str)
local my_bool = fskv.get("my_bool")
log.info("获取upgrade的类型和值", type(my_bool), my_bool)
local my_number = fskv.get("my_number")
log.info("获取my_number的类型和值", type(my_number), my_number)
local my_int = fskv.get("my_int")
log.info("获取my_int的类型和值", type(my_int), my_int)
local my_table = fskv.get("my_table")
log.info("获取my_table的类型和值", my_table,json.encode(my_table))
local mytable = fskv.get("mytable")
log.info("获取mytable的类型和值", mytable, json.encode(mytable))
return true
end
--4.定义功能函数:kv数据库迭代器遍历KV数据
local function iterKV()
local iter = fskv.iter()
log.info("kv数据库迭代器", iter)
if iter then
while 1 do
local k = fskv.next(iter)
log.info("kv迭代器获取下一个key", k)
if not k then
log.info("kv数据库遍历完成")
break
end
log.info("fskv", k, "value", fskv.get(k))
end
end
return true
end
--====功能演示主函数====
local function fskv_test()
-- 初始化kv数据库
local r = fskv.init()
log.info("fskv", "init complete", r)
--获取 kv 数据库状态
local used, total, kv_count = fskv.status()
log.info("获取kv数据库状态", "fskv", "kv", used, total, kv_count)
--=======设置kv 数据=======
if not setKV() then
log.info("设置kv数据失败")
end
--=======设置 table 内的键值对数据=======
if not setttable() then
log.info("设置 table 内的键值对数据失败")
end
--======根据 key 获取对应的数据====
if not getKV() then
log.info("获取kv数据失败")
end
--======使用kv数据库迭代器遍历KV数据====
if not iterKV() then
log.info("遍历kv数据失败")
end
-- 删除测试
local d = fskv.del("my_bool")
log.info("fskv", "my_bool删除结果", d)
local t = fskv.get("my_bool")
log.info("fskv", "删除后查询my_bool", type(t), t)
-- 如果设置table的value为nil, 代表删除对应的skey
-- 如下写法是删除name
log.info("设置新的tablekey是mytable2", fskv.set("mytable2", { age = 18, name = "wendal" }))
log.info("mytable2的值", fskv.get("mytable2"),json.encode(fskv.get("mytable2")))
log.info("mytable2删除name测试", fskv.sett("mytable2", "name", nil))
log.info("mytable2删除结果", fskv.get("mytable2"), json.encode(fskv.get("mytable2")))
--清空整个kv数据库
log.info("清空整个kv数据库", fskv.clear())
local used, total, kv_count = fskv.status()
log.info("获取kv数据库状态", "fskv", "kv", used, total, kv_count)
end
sys.taskInit(fskv_test)
@@ -0,0 +1,68 @@
--[[
@module main
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
@version 001.999.000
@date 2025.9.05
@author 马亚丹
@usage
本demo演示的功能为:使用Air780EPM核心板演示fskv核心库API 的用法,
详细逻辑请看fskv_test.lua文件
]]
--[[
必须定义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 = "Air780EPM_fskv"
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)
-- 加载fskv_test功能模块
require "fskv_test"
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行
@@ -0,0 +1,105 @@
## 功能模块介绍:
1. main.lua:主程序入口
2. fskv_test.lua:演示fskv核心库API的用法,详细逻辑请看fskv_test.lua 文件
## 演示功能概述:
### fskv_test.lua
1.初始化fskv
2.获取 kv 数据库状态
3.设置不同类型的kv数据
4.设置 table 内的键值对数据
5.根据 key 获取对应的数据
6.使用kv迭代器遍历kv数据
7.删除kv数据,清空KV数据
## 演示硬件环境:
![](https://docs.openluat.com/accessory/AirSPINORFLASH_1000/image/780EPM.jpg)
1. 合宙 Air780EPM 核心板一块
2. TYPE-C USB 数据线一根 Air780EPM 核心板和数据线的硬件接线方式为:
- Air780EPM 核心板通过 TYPE-C USB 口供电;(USB的拨码开关off/on,拨到on
- TYPE-C USB 数据线直接插到开发板的 TYPE-C USB 座子,另外一端连接电脑 USB 口;
## 演示软件环境:
1. Luatools 下载调试工具
2. 固件版本:LuatOS-SoC_V2018_Air780EPM_1,固件地址,如有最新固件请用最新 [https://docs.openluat.com/Air780EPM/luatos/firmware/](https://docs.openluat.com/air780epm/luatos/firmware/)
3. pc 系统 win11win10 及以上)
## 演示核心步骤:
1. 搭建好硬件环境
2. Luatools 烧录内核固件和 脚本文件
3. 烧录成功后,代码会自动运行,查看打印日志,如果正常运行,会打印相关信息,设置kv数据、设置 table 内的键值对数据,用kv迭代器遍历kv数据,删除kv数据等。
4. 如下 log 显示:
```bash
[2025-11-21 17:37:24.554][000000000.319] I/user.main Air780EPM_fskv 001.000.000
[2025-11-21 17:37:24.581][000000000.327] I/lfs sfd_lfs mount ret -84, exec auto-format
[2025-11-21 17:37:24.607][000000000.482] D/lfs init ok
[2025-11-21 17:37:24.649][000000000.482] I/user.fskv init complete true
[2025-11-21 17:37:24.681][000000000.483] I/user.获取kv数据库状态 fskv kv 8192 65536 0
[2025-11-21 17:37:24.733][000000000.484] I/user.fskv设置用户数据是字符串 true
[2025-11-21 17:37:24.773][000000000.485] I/user.fskv设置用户数据是布尔值 true
[2025-11-21 17:37:24.822][000000000.487] I/user.fskv设置用户数据是数值 true
[2025-11-21 17:37:24.854][000000000.488] I/user.fskv设置用户数据是整数 true
[2025-11-21 17:37:24.884][000000000.489] I/user.fskv用户数据是table类型 true
[2025-11-21 17:37:24.922][000000000.492] I/user.mytable设置用户数据是字符串 true
[2025-11-21 17:37:24.957][000000000.494] I/user.mytable设置用户数据是布尔值 true
[2025-11-21 17:37:24.996][000000000.497] I/user.mytable设置用户数据是数值 true
[2025-11-21 17:37:25.034][000000000.500] I/user.mytable设置用户数据是table true
[2025-11-21 17:37:25.068][000000000.502] I/user.获取my_str的类型和值 string goodgoodstudy
[2025-11-21 17:37:25.097][000000000.503] I/user.获取upgrade的类型和值 boolean true
[2025-11-21 17:37:25.128][000000000.505] I/user.获取my_number的类型和值 number 1.230000
[2025-11-21 17:37:25.160][000000000.507] I/user.获取my_int的类型和值 number 5
[2025-11-21 17:37:25.192][000000000.508] I/user.获取my_table的类型和值 table: 0C1A7D70 {"name":"wendal","age":18}
[2025-11-21 17:37:25.218][000000000.510] I/user.获取mytable的类型和值 table: 0C1A7BF8 {"bigd":{"name":"wendal","age":123},"wendal":"goodgoodstudy","timer":1,"upgrade":true}
[2025-11-21 17:37:25.245][000000000.510] I/user.kv数据库迭代器 userdata: 0C1A7A10
[2025-11-21 17:37:25.266][000000000.513] I/user.kv迭代器获取下一个key my_bool
[2025-11-21 17:37:25.287][000000000.515] I/user.fskv my_bool value true
[2025-11-21 17:37:25.312][000000000.517] I/user.kv迭代器获取下一个key my_int
[2025-11-21 17:37:25.342][000000000.519] I/user.fskv my_int value 5
[2025-11-21 17:37:25.363][000000000.521] I/user.kv迭代器获取下一个key my_number
[2025-11-21 17:37:25.380][000000000.523] I/user.fskv my_number value 1.230000
[2025-11-21 17:37:25.396][000000000.525] I/user.kv迭代器获取下一个key my_str
[2025-11-21 17:37:25.417][000000000.527] I/user.fskv my_str value goodgoodstudy
[2025-11-21 17:37:25.438][000000000.529] I/user.kv迭代器获取下一个key my_table
[2025-11-21 17:37:25.463][000000000.531] I/user.fskv my_table value table: 0C1A78D8
[2025-11-21 17:37:25.485][000000000.533] I/user.kv迭代器获取下一个key mytable
[2025-11-21 17:37:25.504][000000000.535] I/user.fskv mytable value table: 0C1A77C0
[2025-11-21 17:37:25.530][000000000.536] I/user.kv迭代器获取下一个key nil
[2025-11-21 17:37:25.553][000000000.537] I/user.kv数据库遍历完成
[2025-11-21 17:37:25.565][000000000.573] I/user.fskv my_bool删除结果 true
[2025-11-21 17:37:25.578][000000000.574] I/user.fskv 删除后查询my_bool nil nil
[2025-11-21 17:37:25.591][000000000.575] I/user.设置新的tablekey是mytable2 true
[2025-11-21 17:37:25.607][000000000.578] I/user.mytable2的值 table: 0C1A7580 {"age":18,"name":"wendal"}
[2025-11-21 17:37:25.630][000000000.580] I/user.mytable2删除name测试 true
[2025-11-21 17:37:25.651][000000000.583] I/user.mytable2删除结果 table: 0C1A7398 {"age":18}
[2025-11-21 17:37:25.670][000000000.643] I/user.清空整个kv数据库 true
[2025-11-21 17:37:25.694][000000000.643] I/user.获取kv数据库状态 fskv kv 8192 65536 0
[2025-11-21 17:37:28.866][000000005.695] D/mobile cid1, state0
[2025-11-21 17:37:28.888][000000005.696] D/mobile bearer act 0, result 0
[2025-11-21 17:37:28.896][000000005.696] D/mobile NETIF_LINK_ON -> IP_READY
[2025-11-21 17:37:28.906][000000005.738] D/mobile TIME_SYNC 0
```