wangfq
|
28418dab66
|
feat(vd960Air): 配置同步改用 0x8F 本机侧私有帧;MQTT 凭据外置到非跟踪文件
- readme §2.2/§3:0x7D 帧设计稿 v0.2 作废,改写为「0x7F 业务帧字节流 + 0x8F 本机侧私有帧」
(权威源规则 / 拉取为主+推送为辅 / 帧长上限 260B / 两侧缓冲需同步扩容),依据协议 §6.9
- readme §3.1:对比表由 0x7D 改为 0x8F,保留 0x7F 帧布局参考
- config.lua / uart_app.lua:注释中的 0x7D 计划改为 0x8F 配置同步;协议版本引用 V1.13 → V1.14
- config.lua:MQTT 账号密码不再明文入库,改从 cred.lua 读取;缺失时降级为空串(匿名连接)
- 新增 .gitignore(忽略 cred.lua)+ cred.lua.example(填写模板)
⚠ 原明文凭据已存在于 git 历史,商用前必须更换服务器密码
- 语法:luac5.3 -p config.lua / cred.lua / uart_app.lua 全部通过
|
2026-09-10 21:46:02 +08:00 |
|
wangfq
|
2f75f5abff
|
fix(vd960Air): 修复 initialize 组装崩溃(mobile.msisdn 不存在) + link 采集兜底
现象(第一批修复后): 模块成功注网(IP_READY 10.38.28.79)并连上 MQTT(conack nil nil /
suback true 0), 随即在组装 initialize 报文时崩溃:
E/user.coroutine.resume link_info.lua:29: attempt to call a nil value (field 'msisdn')
link_info.lua:29 in 'link_info.get'
app_iot.lua:34 in upvalue 'build_initialize'
app_iot.lua:65 in function 'app_iot.on_connected'
E/main Lua VM exit!! reboot in 15000ms
根因: mobile.msisdn() 在 Air780EPM 上不存在。LuatOS 各固件 API 面不一致, 且字段不存在时
"直接调用 = 抛异常崩 VM"(不是返回 nil) —— 与 mstick() 同性质。手机号官方 API 是
mobile.number(simid)(见 demo/mobile/mobile_test.lua), 物联卡普遍也无机号。
修复(防御性, 两层):
1. link_info.lua: 新增 safe(fn, ...) 助手(type(fn)=="function" 判断 + pcall), 所有 mobile.*
调用统一走它 → 字段缺失/调用异常一律返回 nil、不再抛出; msisdn 改用 safe(mobile.number, 0);
csq 兼容 table 返回
2. app_iot.lua: 新增 get_link() 兜底(内部 pcall + 失败时返回全空 link 表), inject_link 与
build_initialize 均改用它 → link 采集失败绝不影响上行, 更不允许崩 VM
自检增强 + 反向验证:
- tools/sim_load_test.lua 的 mobile 桩改为"只含官方 demo 证实存在的 API"(移除 msisdn):
桩面必须与真实固件一致 —— "想当然"多写的桩会掩盖真实 bug
- 反向验证: 把 mobile.msisdn() 注射回代码 → 自检精确报
"✗ link_info.get() [link_info.lua:53: attempt to call a nil value (field 'msisdn')]"(exit 1);
还原后 exit 0 → 该自检可拦住整类"API 面假设错误"
验证: luac5.3 -p 全绿; Lua 离线自检通过; Python 帧协议验证通过; readme 表格列数 0 异常
文档: readme §8 补第二批修复记录, 修正 link.msisdn 字段来源说明
|
2026-09-10 15:44:47 +08:00 |
|
wangfq
|
e8917e7041
|
fix(vd960Air): 修复上电反复复位, 打通测试服务器连接
现象: 上电后 Lua VM 报 uart_app.lua:28 attempt to index a boolean value
→ VM exit → 15s 后自动复位, 死循环, 永远走不到 MQTT 连接
根因(4 处叠加, 第 1 处致命):
1. config.lua 末尾漏 return —— require 对无返回值模块返回 true,
local CFG = require "config" 后访问 CFG.CFG_xxx 直接报错
2. 全工程 10 处调用 mstick(), 但 LuatOS 并无此 API(正确为 mcu.ticks())
3. MQTT 服务器仍是合宙官方测试服 lbsmqtt.airm2m.com:1884
4. MQTT 鉴权用户名/密码硬编码为空串
修复:
1. config.lua 末尾加 return _G(配置项本就是全局变量);
另: ClientID 的 mobile.imei() 加空值防护(or "unknown")
2. 新增 mstick.lua: 全局 mstick() = mcu.ticks() 封装(回退 os.time()*1000),
原 10 处调用点零改动; main.lua 在 require "config" 之后 require "mstick"
3. 服务器改为 110.41.131.144:1883(明文非 TLS), 新增 CFG_MQTT_USER/PASS,
mqtt_main 改为 auth(CLIENT_ID, CFG_MQTT_USER, CFG_MQTT_PASS, true)
4. .gitignore 放行 vd960Air/tools/ —— 官方 tools/ 忽略规则导致自检脚本
无法入库(sim_frame_test.py 自 8/31 起一直未入库)
新增工具:
- tools/sim_load_test.lua: 离线加载+冒烟自检(lua5.3 + LuatOS API 桩 + 严格全局
检查), 按 main.lua 真实顺序加载全部模块并冒烟调用关键函数, 用于抓取
"require 返回值缺失""调用了不存在的 API"这类语法检查抓不到的运行时问题
验证:
- luac5.3 -p 全部 14 个 lua 文件通过
- 离线自检: 16 项断言 + 8 项冒烟全部通过
- Python 帧协议参考验证全部通过
- readme Markdown 表格列数 0 异常
文档: readme 补 §8 板级问题修复记录, 更新文件结构/待确认清单/计划表
|
2026-09-10 15:35:10 +08:00 |
|
wangfq
|
3ad7ae8f09
|
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。
|
2026-08-31 15:47:43 +08:00 |
|
wangfq
|
6d763f02fe
|
docs(vd960Air): 方案B定稿 — hex 封装 + frame_report/frame_cmd 协议设计
用户决策 2026-08-31:
1. 4G 上报格式 = hex 封装
2. 方案 B(原始帧透传)正式采用
3. 0x7D 帧仅保留给配置同步/握手,数据面走 0x7F 帧字节流
新增 §2.1.1:
- 上行 frame_report: data.frame = 0x7F 帧 hex(含魔数/校验),携带 link
- 下行 frame_cmd: data.frame = 0x7F(→Loop)或 0x8F(→DBN 本地)hex
- 协议更新说明清单 5 条(并入《DLD960_IoT_MQTT协议》4G 章节时落实)
|
2026-08-31 14:38:40 +08:00 |
|
wangfq
|
caef43a6be
|
docs(vd960Air): 方案B(原始帧透传)列入 vd960DBN 开发计划 + 文档结构修复
用户 2026-08-31 提出方案 B: vd960DBN 做纯转发
- 上行: Loop 0x7F帧(UART2) → DBN 原样转发(UART1) → Air780 → MQTT
- 下行: 平台 → Air780 → DBN → 0x7F帧(UART2) → Loop(地感指令零改造)
- 魔数分流: 0x7F → UART2 透传 / 0x8F → DBN 本地
- 待确认: 4G上报格式(hex建议)/ 双通道策略 / 0x7D帧去留
修复: §2 编号重排(2.1 透传/2.2 配置链路/2.3 link),补回被吃掉的 §2.2 标题,同步引用
|
2026-08-31 14:34:38 +08:00 |
|
wangfq
|
50b8ce8fd7
|
feat(vd960Air): 帧校验统一 XOR+SUM(用户决策 2026-08-31)
- uart_app.lua: 接收状态机 RX_XOR/RX_SUM 双校验(从 LEN_H 起,不含 HEAD)
下行组帧加 XOR+SUM 两字节,与 DBN↔Loop 0x7F 完全一致
- config.lua/readme: 帧协议 v0.2 定稿标注,移除"待确认"
|
2026-08-31 14:14:31 +08:00 |
|
wangfq
|
16d030d790
|
docs(vd960Air): 帧协议对比 DBN↔Loop 0x7F + 配置同步链路 + 通道切换策略(用户决策 2026-08-31)
1. 帧格式确认: 参考 DLD960_串口通信协议 + loop_uart_proto.c 核实
- DBN↔Loop 0x7F 帧: [7F][Addr][LEN(1B)][CMD][Value][XOR][SUM], Value 0~64B
- Air780↔DBN 0x7D 帧: LEN 扩 2B(≤2048B), 状态机同构, 待确认校验统一 XOR+SUM
2. 服务器参数配置链路(列入 vd960DBN 计划): BLE→DBN→UART1→Air780 存储
3. 通道切换策略: 暂定默认 4G;动态自动 vs 人工设置待讨论
|
2026-08-31 14:11:27 +08:00 |
|
wangfq
|
d994013517
|
feat(vd960Air): 4G 特有字段 link 注入 + 用户决策落地
用户决策(2026-08-31):
1. 波特率默认 115200,后续再调
2. dev_serial 与有线通道同一序列号;4G 上报附加 IMEI/流量卡ICCID/IMSI/MSISDN/CSQ
3. 4G 适配并入《DLD960_IoT_MQTT协议》主协议,4G 特有部分单独标注
实现:
- link_info.lua: 采集 mobile.imei()/iccid()/imsi()/msisdn()/csq()
- uart_app.lua: 上行 json.decode → 注入顶层 link 对象 → encode(解析失败原样转发)
- config.lua: CFG_LINK_ENABLE 开关
- readme: §2.1 link 字段定义 + 决策记录/待确认清单更新
|
2026-08-31 11:54:34 +08:00 |
|
wangfq
|
8911b04df2
|
feat(vd960Air): Air8781P 4G UART<->MQTT 桥接工程骨架
基于官方 Air780EPM demo/mqtt 骨架创建 vd960Air 工程:
- 目标: vd960DBN 有线网络失效时,经 Air780EPM 4G 兜底上报
- UART1(115200 8N1)对接 vd960DBN CH32V208 串口1 PB6/PB7
- MQTT 主题按《DLD960_IoT_MQTT协议》V1.10: 订阅 dld960/{sn}/srv, 发布 dld960/{sn}/dev
- 帧协议(设计稿 v0.1): [0x7D][LEN_H][LEN_L][JSON][SUM], 双向对称, ≤2048B
- 上行: DBN JSON 帧 → 4G 校验拆帧 → MQTT publish(JSON 命令面与有线完全一致)
- 下行: MQTT 订阅 → 组帧 → UART1 下发 DBN
- 改造: config.lua 集中配置 / 去掉官方 demo 的 "send from" 演示前缀 / 单路 MQTT
- readme: 架构、协议设计决策(4G 适配协议=命令面复用+网络类裁剪+4G特有扩展)、待确认清单
|
2026-08-31 11:35:22 +08:00 |
|
wangfq
|
bb5e5dda68
|
docs(hardware): 修正命名 — Air8781P 整板原理图 (REV-D 2026-06-12)
- Air8781P = PCB 整板模块名(原始上传文件名 Air8781P_V0_20260612.pdf)
- Air780EPM = 板上核心通信模组(4G),图纸标题栏为此型号
- 含整板外围: SIM卡座/USIM2、4G天线、GNSS_VDD、VBAT_M/VDD_EXT 供电、USB/SPI0/ADC/GPIO
|
2026-08-31 09:48:38 +08:00 |
|
wangfq
|
450e245edc
|
docs(hardware): Air780EPM 模块原理图 (REV-D 2026-06-12)
- 图纸标题栏型号: Air780EPM(单页 A4 全图)
- 原始上传文件名: Air8781P_V0_20260612.pdf(文档编号,非型号)
- 含: SIM卡座/USIM2、4G天线、GNSS_VDD、VBAT_M/VDD_EXT 供电、USB/SPI0/ADC/GPIO 引脚定义
|
2026-08-31 09:38:21 +08:00 |
|
wangfq
|
173dd6874f
|
init: Air780EPM 官方 LuatOS 项目代码基线
- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码
- 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等)
- 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
|
2026-08-31 08:53:49 +08:00 |
|