feat(vd960Air): 方案 C MVP — 0x7F 帧解析 + 标准 JSON 上报(2026-08-31)
协议依据:《DLD960_IoT_MQTT协议》V1.13(4G 通道适配方案 C) 新增模块: - frame_parser.lua: 0x7F 帧解析状态机(Lua 版 lup_feed_byte, XOR+SUM 校验) - proto_conv.lua: 0xC0 传感帧 → loop_data + car_state/loop_state 沿检测(4 类线圈事件) - evt_queue.lua: event_report 队列 + ACK 状态机(16深/5s×3/跨重连同 msg_id,对齐 DBN) - clock.lua: report_config 时钟校准(协议 §2.3) - app_iot.lua: initialize(extra_info imei/iccid + link)/ heartbeat / poll 驱动 - tools/sim_frame_test.py: 帧协议参考验证(56B 帧/4 路解析/沿检测/JSON 格式,全过) 改造: - uart_app.lua: 0x7D 帧 → 0x7F 帧驱动;loop_data/event_report 组包 + link 注入 - mqtt_receiver.lua: 下行分发(ACK 路由 + 时钟校准) - mqtt_main.lua: 连接成功 → initialize + 未决事件重发 - config.lua/main.lua: 方案 C 配置与入口 MVP 范围: 上行(initialize/loop_data/event_report/heartbeat)+ report_config; 下行命令转换与 0x7D 配置同步列入 P1。
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
--[[
|
||||
@module app_iot
|
||||
@summary vd960Air 设备业务: initialize 上线 / heartbeat 心跳 / 主循环驱动
|
||||
@version 0.1
|
||||
@date 2026.08.31
|
||||
@usage
|
||||
- on_connected(): MQTT 连接成功后调用 → 发 initialize(extra_info imei/iccid + link)
|
||||
- heartbeat 定时任务: 60s 发 heartbeat(协议 §5.4,带 link)
|
||||
- poll(): 主循环驱动 uart_app 事件重发检查(可挂 sys.timerLoopStart)
|
||||
]]
|
||||
|
||||
local CFG = require "config"
|
||||
local link_info = require "link_info"
|
||||
local clock = require "clock"
|
||||
|
||||
local app_iot = {}
|
||||
|
||||
local HEARTBEAT_INTERVAL = CFG.CFG_HEARTBEAT_INTERVAL or 60
|
||||
|
||||
-- 上行 JSON 注入 link
|
||||
local function inject_link(payload)
|
||||
if CFG.CFG_LINK_ENABLE then
|
||||
local ok, obj = pcall(json.decode, payload)
|
||||
if ok and type(obj) == "table" then
|
||||
obj.link = link_info.get()
|
||||
return json.encode(obj)
|
||||
end
|
||||
end
|
||||
return payload
|
||||
end
|
||||
|
||||
-- 组 initialize(协议 §5.1,extra_info 含 imei/iccid V1.13)
|
||||
local function build_initialize()
|
||||
local info = link_info.get()
|
||||
local payload = string.format(
|
||||
'{"msg_id":1,"cmd":"initialize","ts":%d,'
|
||||
.. '"data":{"dev_serial":"%s","model":"%s","hard_ver":"%s","soft_ver":"%s",'
|
||||
.. '"loop_ver":"%s","loop_hw_ver":"%s",'
|
||||
.. '"extra_info":{"code":"%s","imei":"%s","iccid":"%s","csq":"%s","location":""}}}',
|
||||
clock.now(),
|
||||
CFG.CFG_DEV_SERIAL, CFG.CFG_MODEL or "DLD960", CFG.CFG_HW_VER or "1.0", CFG.CFG_SW_VER or "1.0",
|
||||
CFG.CFG_LOOP_VER or "", CFG.CFG_LOOP_HW_VER or "",
|
||||
info.imsi, info.imei, info.iccid, tostring(info.csq))
|
||||
return inject_link(payload)
|
||||
end
|
||||
|
||||
-- 组 heartbeat(协议 §5.4)
|
||||
local function build_heartbeat()
|
||||
local uart_app = require "uart_app"
|
||||
local loop_ok = uart_app.get_loop_status()
|
||||
local ls = string.format('[%s,%s,%s,%s]',
|
||||
tostring(loop_ok[1]), tostring(loop_ok[2]),
|
||||
tostring(loop_ok[3]), tostring(loop_ok[4]))
|
||||
local payload = string.format(
|
||||
'{"msg_id":%d,"cmd":"heartbeat","ts":%d,'
|
||||
.. '"data":{"uptime":%d,"loop_status":%s,"net_status":true,"iot_status":true}}',
|
||||
math.floor(mstick() / 1000) % 100000 + 1000, clock.now(),
|
||||
math.floor(mstick() / 1000), ls)
|
||||
return inject_link(payload)
|
||||
end
|
||||
|
||||
-- MQTT 连接成功后调用
|
||||
function app_iot.on_connected()
|
||||
-- 发 initialize(上线)
|
||||
local payload = build_initialize()
|
||||
sys.publish("SEND_DATA_REQ", "vd960DBN", CFG.CFG_TOPIC_UP, payload, 1)
|
||||
log.info("app_iot", "initialize sent")
|
||||
end
|
||||
|
||||
-- 心跳定时任务
|
||||
local function heartbeat_task()
|
||||
while true do
|
||||
sys.wait(HEARTBEAT_INTERVAL * 1000)
|
||||
local payload = build_heartbeat()
|
||||
sys.publish("SEND_DATA_REQ", "vd960DBN", CFG.CFG_TOPIC_UP, payload, 0)
|
||||
log.info("app_iot", "heartbeat sent")
|
||||
end
|
||||
end
|
||||
|
||||
-- 主循环驱动: 事件重发检查(500ms 粒度)
|
||||
local function poll_task()
|
||||
local uart_app = require "uart_app"
|
||||
while true do
|
||||
sys.wait(500)
|
||||
uart_app.poll()
|
||||
end
|
||||
end
|
||||
|
||||
-- 初始化(evt_queue 复位 + 启动定时任务)
|
||||
function app_iot.init()
|
||||
local evt_queue = require "evt_queue"
|
||||
evt_queue.init()
|
||||
sys.taskInit(heartbeat_task)
|
||||
sys.taskInit(poll_task)
|
||||
log.info("app_iot", "init ok")
|
||||
end
|
||||
|
||||
return app_iot
|
||||
Reference in New Issue
Block a user