wangfq
|
51298693da
|
fix(vd960DBN): OTA 刷写成功误判未启动 — 状态回 idle + 补 ota_report 主动上报
现场: 远程平台发起 OTA, 设备物理刷写成功 (70块全ACK, flash DONE),
但平台 ota_status 轮询只见 state=ready → 误判'刷写未启动'。
根因:
1. ota_flash_done 刷写成功后台侧状态置 READY (与协议状态机
'FLASHING──成功──▶IDLE(清槽/保留)' 不符), 平台无法区分
'待刷 ready' 与 '已刷完' → 持续 ready 判未启动
2. 固件漏实现协议 §5.5 ota_report 主动上报 (done/failed 重发 3次×5s),
平台收不到成功信号, 只能靠 ota_status 轮询兜底
修复 (协议 V1.09 + 固件):
- 协议: 刷写成功状态明确回 idle (镜像保留, last_result=0, 可重刷);
ota_report 升级为刷写结果主依据; 平台判定指引 (idle+size>0+last_result=0
=成功; 不得以轮询未见 flashing 或持续 ready 判未启动)
- ota_srv.c: ota_flash_done → OTA_STATE_IDLE (镜像保留) + 上报 done;
ota_flash_fail → 补 ota_report failed (保留 event_report 告警);
ota_cmd_begin 兼容 idle+size/crc32 一致 → 直接回 ready (免下载重刷)
- iot_mqtt_srv.c: 新增 ota_report 上报状态机 (立即首发 + 5s×3 重发,
同 msg_id/ts), 共享 _iot_pub_payload (event_report 复用, RAM 零新增)
- 单测: test_flash_flow/test_flash_ready_timeout 断言 ota_report 上报,
state 断言 READY→IDLE; 新增 test_begin_reflash; 10/10 全过 + 22 py 断言
|
2026-08-20 18:56:21 +08:00 |
|
wangfq
|
6c1f276002
|
feat(DBNMQTTool): OTA 页签 + 协议单测 (MQTT V1.08 工具先行)
- protocol.py: OTA 模块 — 命令常量/ota_crc32(ISO-HDLC)/ota_split_bin(256B×96KB)/
data_ota_* 构建器/状态·阶段·错误码描述
- main.py: OTA 页签 — bin 选择(≤96KB+CRC32 显示)/版本·force·slot 参数/
下载(OtaDownloadThread: begin→data×N→end, 断点续传·缺片重定位·CRC 重发)/
刷写(二次确认)/中止/状态查询; 进度条 + ota_report/ota_status 实时显示
- tests/test_ota_protocol.py: 22 断言 — CRC32 标准向量/分片边界/构建器/
OtaDeviceSim 设备状态机(顺序·幂等·乱序·单片CRC·全镜像复核·续传)/完整下载流
- devlog 置顶条目
|
2026-08-20 11:53:50 +08:00 |
|
wangfq
|
5a1893cd1c
|
feat(vd960DBN)+fix(DBNMQTTool): log_query 改 hex 原始字节上报 (2026-08-18)
背景: MQTT 快照流实测 MQTTSerialize_publish failed — JSON 化快照记录 ~810B/条 超 800B 发送缓冲
方案(用户拍板): 对齐 BLE 通道, 原始字节 hex 上报
固件 (V4.3):
- offlog.c/h: 新增 offlog_evt_to_hex() (32B→64 hex)
- snapshot.c/h: 新增 snap_rec_to_hex() (64B→128 hex); 删 SNAP_MAX_QUERY_JSON, 恢复 count=2
- tcp_json_srv.c / iot_mqtt_srv.c: log_query 改 {"seq":N,"hex":"..."}; SEND_BUF 保持 800
- 2 条快照 hex 响应 406B < 800B
文档: TCP JSON V1.03 / MQTT V1.07 §4.17 records 改 hex + 解析表引用 BLE §6.4/§7
工具: parse_offlog_hex/parse_snap_hex/offlog_payload_desc + hex 展示; 验证: gcc 9 断言 + 工具解析全过 + offscreen UI
|
2026-08-18 14:04:26 +08:00 |
|
wangfq
|
5e9b188c6a
|
feat(DBNMQTTool): 脱机日志翻页 — 上一页/下一页 + 自动填充起始序号 (2026-08-18)
- 按钮行新增 ◀上一页/下一页▶ (拉取成功后启用)
- 下一页: 锚点 = 当前页最后一条 seq+1 (快照/事件流均精确), 空记录按 start+count 步进
- 上一页: max(1, 当前起始-条数), 边界保护
- offscreen 6 场景验证全过
|
2026-08-18 11:57:11 +08:00 |
|
wangfq
|
f2141976f0
|
feat(vd960DBN)+fix(DBNMQTTool): MQTT 查询命令补齐 + 工具命令集对齐 (2026-08-18)
固件 (V4.2):
- iot_mqtt_srv.c 补齐 ssc_net_query / iot_net_query / iot_topic_query (只读全局组包, 与 TCP JSON §4.5/4.7/4.9 对齐)
- 修复实测: MQTT 通道 ssc_net_query/iot_net_query 返回 code=4 unsupported
工具:
- 禁用固件未实现的 6 个按钮 (ssc/iot_net/iot_topic_set + pwd_set/factory_reset/device_reset) + tooltip 引导 TCP/BLE
- 设备刷新列表移除 loop_param_query (固件未实现)
- offscreen 验证按钮状态正确
|
2026-08-18 11:44:52 +08:00 |
|
wangfq
|
d39ab5ae89
|
feat(DBNMQTTool): 脱机日志支持快照流 stream=snapshot (2026-08-18)
- protocol.py: STREAM_EVENT/STREAM_SNAPSHOT 常量, data_log_query 加 stream 参数(快照流 count≤2), 新增 data_log_clear(stream), SNAP_MISC_TYPE_DESC
- main.py: 日志流选择器 + 三命令按流发请求 + log_stat/log_query 响应区分流(快照 channels 逐字段展示)
- 验证: protocol 断言 6 例 + offscreen MainWindow 快照/事件流展示实测全过
- devlog 置顶 + .gitignore (venv/)
|
2026-08-18 09:38:33 +08:00 |
|
wangfq
|
5ebd8247f0
|
feat(DBNMQTTool): 脱机事件日志命令支持 — log_stat/log_query/log_clear (MQTT V1.06)
- protocol.py: CMD_LOG_* 常量 + LOG_COMMANDS + data_log_query 边界钳制
(start_seq>=1, count 1~4) + LOG_EVENT_TYPE_DESC 事件类型中文描述
- main.py: 参数配置 Tab 新增脱机日志面板 (统计/拉取/清除 + 显示区)
- _on_message 响应分发: log_stat 统计展示, log_query 记录格式化
(unix_ts 真实时间 / boot+ts_ms 未同步), log_clear 二次确认
- devlog 追加
|
2026-08-05 09:06:11 +08:00 |
|
wangfq
|
01db1e6a1c
|
DBNMQTTool: 增加 dld960/+/dev/# 订阅兼容旧固件多级 topic
旧固件响应发布到 dld960/{sn}/dev/config/resp 等多级路径,
单级通配 dld960/+/dev 无法匹配,# 通配确保向后兼容。
|
2026-07-10 09:12:31 +08:00 |
|
wangfq
|
9d9e4fa4bc
|
DBNMQTTool: initialize 消息解析后同步显示设备型号到列表
- device_manager.mark_online 增加 model/hard_ver/soft_ver 参数
- 修复旧格式 extra_info.version 取 soft_ver 的问题
- main.py 的 initialize 处理传入完整设备信息
|
2026-07-10 09:04:39 +08:00 |
|
wangfq
|
11d1a96d24
|
同步协议 V1.03:双主题发布对齐 + initialize 数据格式修正
vd960DBN:
- heartbeat/sensor/initialize 发布统一走 dld960/{sn}/dev
- dev_initialize_pub 补 model/hard_ver/soft_ver,删 extra_info.version
DBNMQTTool:
- 协议版本号更新至 V1.03
- 协议 Topic 树和模拟页增加 initialize 支持
|
2026-07-10 08:49:28 +08:00 |
|
wangfq
|
652fc5f938
|
feat: V1.03 initialize 上线消息 — 固件+工具同步
vd960DBN:
- dev_initialize_pub() 改为 V1.03 格式 (msg_id/cmd/ts/data/extra_info)
- iot_mqtt_srv: 订阅改双主题 dld960/{sn}/srv, 响应 topic 改 dev
- SUBACK 后自动发 initialize 告知服务器上线
- net_srv.h: 加 dev_initialize_pub 声明
DBNMQTTool:
- protocol.py: 加 CMD_INITIALIZE
- device_manager: DeviceInfo 加 extra_info, 加 mark_online()
- main.py: 接收 initialize 消息, 自动标记设备上线
- docs: 协议 V1.03 + devlog V3.1
|
2026-07-09 21:32:39 +08:00 |
|
wangfq
|
c515638032
|
fix: MQTT协议 V1.02 同步 — 字段名缩短 + 时间单位修正
- docs/DLD960_IoT_MQTT协议.md: 字段缩写 + 时间单位 5ms→50ms
- vd960DBN/iot_mqtt_srv.c: 6字段缩短对齐协议 (level/iscar/freq/diff/sens/cndtn)
- vd960DBN/tcp_json_srv.c: gap_ms5/passtime_ms → gap/passtime
- vd960DBN/loop_uart_proto.h: 注释 5ms→50ms
- DBNMQTTool/main.py: 模拟样本数据字段同步
|
2026-07-09 10:18:03 +08:00 |
|
wangfq
|
cd92f3e0c3
|
feat(DBNMQTTool): 查询响应自动回填输入框 + 主动上报配置
- _on_message 中 ssc_net/iot_net/iot_topic/report_config 查询结果
不再仅显示 JSON,改为调用 _apply_* 方法回填到对应输入框
- 新增「主动上报配置」GroupBox(sensor_type / interval / timeout
+ 4 开关),支持查询/设置 CMD_REPORT_CONFIG
- import 增加 CMD_REPORT_CONFIG / data_report_config
|
2026-07-07 18:22:39 +08:00 |
|
wangfq
|
b932dd7c6f
|
feat: DBNMQTTool 日志增强 — 收发打印 topic + payload 详情
新增 _log_send() / _log_recv() 两个统一日志方法:
- 发送: 标签 + → topic + PASTE:{精简payload}
- 接收: ← topic + summary + RECV:{精简payload}
- payload >200/300 字符自动截断
覆盖所有收发路径:
- [模拟]/[协议]/[自定义]/[命令] 发送
- 响应/loop_data/event_report/heartbeat/Initialize 接收
- mqtt_client.py 自动订阅事件日志
|
2026-07-07 17:47:58 +08:00 |
|
wangfq
|
5e4e1b1ec7
|
fix: DeviceManager 死锁 — threading.Lock 改为 RLock
根因: update_from_dev_info/update_loop_data/update_event/update_heartbeat
在 with self._lock 块内调用 get_or_create(), 后者再次 with self._lock.
Python threading.Lock 不可重入 → 永久阻塞 → GUI 无响应.
修复: self._lock = threading.RLock() (可重入锁)
清理: mqtt_client.py 移除 debug print 和未使用的 sys import
|
2026-07-07 17:36:35 +08:00 |
|
wangfq
|
c98aa5b0bb
|
fix: MqttClient 回退信号方案,添加 publish debug 日志追踪阻塞点
- 移除 QObject 基类和 QueuedConnection 信号方案
- publish() 直接调用 self._client.publish() 并打印前后日志
- 添加 print(flush=True) 确保 Windows 终端实时输出
目的是确认阻塞发生在:
[MqttClient] publish topic=... qos=1 ← 打印后消失?
[MqttClient] publish done mid=... ← 这行能否出现?
|
2026-07-07 17:27:15 +08:00 |
|
wangfq
|
baa82c895d
|
fix: MqttClient 重构为 QObject — publish 通过 Qt 信号排队避免 C 层崩溃
问题: paho-mqtt publish() C 扩展在 Windows 上从 GUI 线程调用时静默崩溃。
修复:
- MqttClient 改为 QObject 子类
- publish() 通过 Qt Signal(Qt.QueuedConnection) 排队,_do_publish()
始终在主线程事件循环中执行 paho 调用
- 状态/消息通知改用 Qt Signal 跨线程传递
- 新增 subscribe()/unsubscribe() 公开 API,消除 main.py 直接
访问 _client 的脆弱代码
- 移除 MainWindow 中已不再需要的中间信号 _mqtt_status/_mqtt_msg
|
2026-07-07 14:25:49 +08:00 |
|
wangfq
|
6eb93637c7
|
fix: DBNMQTTool — 所有 publish 路径增加通用异常捕获
问题: _custom_publish / _proto_publish / _sim_publish 只 catch
json.JSONDecodeError, MqttClient.publish() 抛出的 ConnectionError
等异常未被捕获, 在 Qt 信号槽中导致静默崩溃(Windows 无 traceback).
修复:
- _custom_publish: +except Exception, 避免 toPlainText() 重复调用
- _proto_publish: +except Exception, 避免 toPlainText() 重复调用
- _sim_publish: +except Exception
- _custom_subscribe/_custom_unsubscribe: +except Exception, +_client 空检查
|
2026-07-07 14:15:36 +08:00 |
|
wangfq
|
5a2ef0be5d
|
fix: DBNMQTTool — right 局部变量改为 self._notebook
_build_ui() 中 right = QTabWidget() 是局部变量,导致
_proto_publish_item() 中 self._notebook.setCurrentWidget() 报
AttributeError: 'MainWindow' object has no attribute '_notebook'
|
2026-07-07 14:07:52 +08:00 |
|
wangfq
|
b707241429
|
feat: MQTT 双主题同步到 vd960DBN 固件 + DBNMQTTool devlog
vd960DBN 固件改动:
- net_srv.h: 默认 topic 改为 dld960/{sn}/srv + dld960/{sn}/dev
- net_srv.c: dg_subscribe_display_topic() 直接用 topic_sub 订阅(不再追加 client_id/sn 后缀)
- net_srv.c: mqtt_deserialize_publish() topic 过滤改用 g_iot_topic.topic_sub(不再硬编码 TOPIC_DEFAULT_SUBSCRIBE)
DBNMQTTool 文档:
- devlog.md: 清理过期 topic 引用语义
|
2026-07-07 09:46:54 +08:00 |
|
wangfq
|
770d67346f
|
refactor: MQTT 主题方向 down→srv, up→dev
- dld960/{sn}/down → dld960/{sn}/srv
- dld960/{sn}/up → dld960/{sn}/dev
- 通配符 dld960/+/up → dld960/+/dev
|
2026-07-07 09:42:35 +08:00 |
|
wangfq
|
213716033c
|
feat: MQTT 协议 V1.01 — Topic 压缩为双主题 (up/down)
- 7个主题压缩为2个: dld960/{sn}/down + dld960/{sn}/up
- 消息类型由 JSON cmd 字段区分,不再依赖 topic 路径
- protocol.py: topic_up()/topic_down() 替代旧7个函数
- mqtt_client.py: 4个通配符订阅→1个 dld960/+/up
- main.py: 消息路由改为 cmd 匹配,协议Topic树简化
- 文档更新 V1.01
|
2026-07-07 09:18:29 +08:00 |
|
wangfq
|
d29e16acc8
|
docs(DBNMQTTool): 开发日志 — 初始化到模拟上报全记录
|
2026-07-06 23:27:40 +08:00 |
|
wangfq
|
c19e465284
|
feat(DBNMQTTool): 模拟上报 + 协议Topic + 自定义Topic
新增三个 Tab:
1. 模拟上报 — 可编辑 loop_data/event_report/heartbeat JSON,
支持单次发送和周期上报(间隔可调)
2. 协议Topic — 按协议文档列出所有 dld960/{sn}/srv/... 和 dev/... topic,
双击填充到发布区,支持编辑 JSON 载荷
3. 自定义Topic — 自由输入 topic 发布,支持订阅/取消订阅,
接收消息实时展示
新增:
- QComboBox, QSpinBox, QPlainTextEdit 控件
- paho.mqtt.client 导入(topic_matches_sub 通配符匹配)
- 自定义订阅消息自动路由到接收区
|
2026-07-06 21:40:26 +08:00 |
|
wangfq
|
5210051f19
|
chore(DBNMQTTool): 删除误提交的 vim swap 文件
|
2026-07-06 21:32:30 +08:00 |
|
wangfq
|
213c0ddc2d
|
fix(DBNMQTTool): paho-mqtt disconnect 回调签名兼容 v1/v2
- _on_disconnect: 用 *args 兼容 v1(3参数) 和 v2(5参数)
- Client 构造加 callback_api_version=VERSION2
- _on_connect 签名保持不变 (v2)
|
2026-07-06 21:32:24 +08:00 |
|
wangfq
|
e1bf3dcfca
|
refactor(DBNMQTTool): tkinter → PySide6
- main.py: 完整重写为 PySide6 (Qt for Python)
- requirements.txt: 加 PySide6>=6.6.0
- 使用 Qt 信号/槽替代 tkinter 回调
- 界面更现代化,Fusion 风格
- 分组框 (QGroupBox) 布局,QSplitter 分栏
|
2026-07-06 21:19:55 +08:00 |
|
wangfq
|
a2cfe4602c
|
feat: DBNMQTTool — DLD960 IoT MQTT 设备管理工具 (Python/tkinter 跨平台)
基于《DLD960_IoT_MQTT协议.md》V1.00 实现
功能:
- MQTT Broker 连接管理
- 设备自动发现(订阅 dld960/+/dev/# 通配符)
- 设备信息查询(dev_info_query)
- 网络配置(SSC/IoT TCP)+ Topic 配置
- 实时线圈数据监控(loop_data)+ 事件上报(event_report)
- 心跳监控(heartbeat)
- 控制命令:密码验证/设置、出厂初始化、设备复位
项目结构:
- main.py 主窗口 (tkinter GUI)
- dbn_mqtt_tool/
- protocol.py DLD960 IoT MQTT 协议定义
- mqtt_client.py MQTT 客户端封装 (paho-mqtt)
- device_manager.py 设备发现与状态管理
|
2026-07-06 18:14:38 +08:00 |
|