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,259 @@
|
||||
--[[
|
||||
@module excloud_test
|
||||
@summary excloud测试文件
|
||||
@version 1.0
|
||||
@date 2025.09.22
|
||||
@author 孟伟
|
||||
@usage
|
||||
本demo演示的功能为:
|
||||
本demo演示了excloud扩展库的完整使用流程,包括:
|
||||
1. 设备连接与认证
|
||||
2. 数据上报与接收
|
||||
3. 运维日志管理
|
||||
4. 文件上传功能
|
||||
5. 心跳保活机制
|
||||
]]
|
||||
-- 导入excloud库
|
||||
local excloud = require("excloud")
|
||||
|
||||
-- 注册回调函数
|
||||
-- 注册回调函数
|
||||
function on_excloud_event(event, data)
|
||||
log.info("用户回调函数", event, json.encode(data))
|
||||
|
||||
if event == "connect_result" then
|
||||
if data.success then
|
||||
log.info("连接成功")
|
||||
sys.publish("aircloud_connected")
|
||||
else
|
||||
log.info("连接失败: " .. (data.error or "未知错误"))
|
||||
end
|
||||
elseif event == "auth_result" then
|
||||
if data.success then
|
||||
log.info("认证成功")
|
||||
else
|
||||
log.info("认证失败: " .. data.message)
|
||||
end
|
||||
elseif event == "message" then
|
||||
log.info("收到消息, 流水号: " .. data.header.sequence_num)
|
||||
|
||||
-- 处理服务器下发的消息
|
||||
for _, tlv in ipairs(data.tlvs) do
|
||||
log.info("TLV字段", "含义:", tlv.field, "类型:", tlv.type, "值:", tlv.value)
|
||||
|
||||
if tlv.field == excloud.FIELD_MEANINGS.CONTROL_COMMAND then
|
||||
log.info("收到控制命令: " .. tostring(tlv.value))
|
||||
|
||||
-- 处理控制命令并发送响应
|
||||
local response_ok, err_msg = excloud.send({
|
||||
{
|
||||
field_meaning = excloud.FIELD_MEANINGS.CONTROL_RESPONSE,
|
||||
data_type = excloud.DATA_TYPES.UNICODE,
|
||||
value = "命令执行成功"
|
||||
}
|
||||
}, false)
|
||||
|
||||
if not response_ok then
|
||||
log.info("发送控制响应失败: " .. err_msg)
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif event == "disconnect" then
|
||||
log.warn("与服务器断开连接")
|
||||
elseif event == "reconnect_failed" then
|
||||
log.info("重连失败,已尝试 " .. data.count .. " 次")
|
||||
elseif event == "send_result" then
|
||||
if data.success then
|
||||
log.info("发送成功,流水号: " .. data.sequence_num)
|
||||
else
|
||||
log.info("发送失败: " .. data.error_msg)
|
||||
end
|
||||
|
||||
elseif event == "mtn_log_upload_start" then
|
||||
log.info("运维日志上传开始", "文件数量:", data.file_count)
|
||||
|
||||
elseif event == "mtn_log_upload_progress" then
|
||||
log.info("运维日志上传进度",
|
||||
"当前文件:", data.current_file,
|
||||
"总数:", data.total_files,
|
||||
"文件名:", data.file_name,
|
||||
"状态:", data.status)
|
||||
|
||||
elseif event == "mtn_log_upload_complete" then
|
||||
log.info("运维日志上传完成",
|
||||
"成功:", data.success_count,
|
||||
"失败:", data.failed_count,
|
||||
"总计:", data.total_files)
|
||||
end
|
||||
end
|
||||
|
||||
-- 注册回调
|
||||
excloud.on(on_excloud_event)
|
||||
-- 主任务函数
|
||||
function excloud_task_func()
|
||||
-- 如果当前时间点设置的默认网卡还没有连接成功,一直在这里循环等待
|
||||
while not socket.adapter(socket.dft()) do
|
||||
log.warn("excloud_task_func", "wait IP_READY", socket.dft())
|
||||
-- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
|
||||
-- 或者等待1秒超时退出阻塞等待状态;
|
||||
-- 注意:此处的1000毫秒超时不要修改的更长;
|
||||
-- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时,会隐式的修改默认使用的网卡
|
||||
-- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配
|
||||
-- 此处的1秒,能够保证,即使时序不匹配,也能1秒钟退出阻塞状态,再去判断socket.adapter(socket.dft())
|
||||
sys.waitUntil("IP_READY", 1000)
|
||||
end
|
||||
-- -- 配置excloud参数
|
||||
local ok, err_msg = excloud.setup({
|
||||
use_getip = true, -- 使用getip服务
|
||||
device_type = 1, -- 4G设备
|
||||
auth_key = "VmhtOb81EgZau6YyuuZJzwF6oUNGCbXi",
|
||||
transport = "tcp", -- 使用TCP传输
|
||||
auto_reconnect = true, -- 自动重连
|
||||
reconnect_interval = 10, -- 重连间隔(秒)
|
||||
max_reconnect = 5, -- 最大重连次数
|
||||
mtn_log_enabled = true, -- 启用运维日志
|
||||
mtn_log_blocks = 1, -- 日志文件块数
|
||||
mtn_log_write_way = excloud.MTN_LOG_CACHE_WRITE -- 缓存写入方式
|
||||
})
|
||||
|
||||
|
||||
--不使用getip服务,注意把use_getip设置为false
|
||||
-- local ok, err_msg = excloud.setup({
|
||||
-- use_getip = false, -- 不使用getip服务
|
||||
-- device_type = 1, -- 设备类型: 4G
|
||||
-- host = "112.125.89.8", -- 服务器地址
|
||||
-- port = 32585, -- 服务器端口
|
||||
-- auth_key = "VmhtOb81EgZau6YyuuZJzwF6oUNGCbXi", -- 鉴权密钥
|
||||
-- transport = "tcp", -- 使用TCP传输
|
||||
-- auto_reconnect = true, -- 自动重连
|
||||
-- reconnect_interval = 10, -- 重连间隔(秒)
|
||||
-- max_reconnect = 5, -- 最大重连次数
|
||||
-- mtn_log_enabled = true -- 启用运维日志
|
||||
-- })
|
||||
|
||||
-- 配置excloud参数,虚拟设备链接
|
||||
-- local ok, err_msg = excloud.setup({
|
||||
-- use_getip = true, --使用getip服务
|
||||
-- device_type = 9,
|
||||
-- auth_key = "VmhtOb81EgZau6YyuuZJzwF6oUNGCbXi",
|
||||
-- virtual_phone_number = "15893470522", -- 11位手机号
|
||||
-- virtual_serial_num = 1, -- 序列号(0-999)
|
||||
-- transport = "tcp", -- 由于mqtt链接需要使用imei,虚拟设备没有,所以只能使用TCP传输
|
||||
-- mtn_log_enabled = true
|
||||
-- })
|
||||
|
||||
if not ok then
|
||||
log.info("初始化失败: " .. err_msg)
|
||||
return
|
||||
end
|
||||
log.info("excloud初始化成功")
|
||||
|
||||
-- 开启excloud服务
|
||||
local ok, err_msg = excloud.open()
|
||||
if not ok then
|
||||
log.info("开启excloud服务失败: " .. err_msg)
|
||||
return
|
||||
end
|
||||
log.info("excloud服务已开启")
|
||||
-- 启动自动心跳,默认5分钟一次的心跳
|
||||
excloud.start_heartbeat()
|
||||
log.info("自动心跳已启动")
|
||||
|
||||
-- 启动3分钟一次的心跳,可配置自定义内容
|
||||
-- excloud.start_heartbeat(180, {
|
||||
-- { field_meaning = excloud.FIELD_MEANINGS.TIMESTAMP,
|
||||
-- data_type = excloud.DATA_TYPES.INTEGER,
|
||||
-- value = os.time() }
|
||||
-- })
|
||||
|
||||
-- 停止自动心跳
|
||||
--excloud.stop_heartbeat()
|
||||
-- 记录启动日志
|
||||
--excloud.mtn_log("system", "设备启动完成", "version", "1.0.0")
|
||||
-- 获取并打印二维码信息
|
||||
local qrinfo = excloud.get_qrinfo()
|
||||
if qrinfo and qrinfo.url then
|
||||
log.info("二维码URL:", qrinfo.url)
|
||||
else
|
||||
log.info("未获取到二维码信息")
|
||||
end
|
||||
|
||||
-- 主循环:定期上报数据
|
||||
|
||||
while true do
|
||||
-- 每30秒上报一次数据
|
||||
sys.wait(30000)
|
||||
-- 检查连接状态
|
||||
local status = excloud.status()
|
||||
if not status.is_connected then
|
||||
log.warn("设备未连接,跳过数据上报")
|
||||
|
||||
else
|
||||
-- 上报基础状态数据
|
||||
local ok, err_msg = excloud.send({
|
||||
{
|
||||
field_meaning = excloud.FIELD_MEANINGS.SIGNAL_STRENGTH_4G,
|
||||
data_type = excloud.DATA_TYPES.INTEGER,
|
||||
value = 22 -- 信号强度
|
||||
},
|
||||
{
|
||||
field_meaning = excloud.FIELD_MEANINGS.SIM_ICCID,
|
||||
data_type = excloud.DATA_TYPES.ASCII,
|
||||
value = "89860118801012345678" -- SIM卡ICCID
|
||||
},
|
||||
{
|
||||
field_meaning = excloud.FIELD_MEANINGS.TIMESTAMP,
|
||||
data_type = excloud.DATA_TYPES.INTEGER,
|
||||
value = os.time()
|
||||
}
|
||||
}, false)
|
||||
|
||||
if ok then
|
||||
log.info("基础数据上报成功")
|
||||
else
|
||||
log.error("基础数据上报失败:", err_msg)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
-- 启动主任务
|
||||
sys.taskInit(excloud_task_func)
|
||||
--上传图片示例
|
||||
function upload_image_fun()
|
||||
-- 等待连接建立
|
||||
sys.waitUntil("aircloud_connected", 10000)
|
||||
-- 上传图片
|
||||
log.info("开始上传图片")
|
||||
if not excloud.status().is_connected then
|
||||
log.info("设备未连接,跳过图片上传")
|
||||
return
|
||||
end
|
||||
if io.exists("/luadb/test.jpg") then
|
||||
local ok, err = excloud.upload_image("/luadb/test.jpg", "test.jpg")
|
||||
if ok then
|
||||
log.info("图片上传成功")
|
||||
else
|
||||
log.error("图片上传失败:", err)
|
||||
end
|
||||
else
|
||||
log.warn("测试图片文件不存在")
|
||||
end
|
||||
end
|
||||
|
||||
sys.taskInit(upload_image_fun)
|
||||
|
||||
-- 运维日志测试示例
|
||||
function mtnlog_test_task()
|
||||
local test_count = 0
|
||||
while true do
|
||||
test_count = test_count + 1
|
||||
|
||||
excloud.mtn_log("info", "mtn_test", test_count)
|
||||
-- 每30秒记录一次
|
||||
sys.wait(1000)
|
||||
end
|
||||
end
|
||||
|
||||
sys.taskInit(mtnlog_test_task)
|
||||
Reference in New Issue
Block a user