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
This commit is contained in:
@@ -68,14 +68,8 @@ class MqttClient:
|
||||
self._connected = True
|
||||
self._notify_status(True, "已连接到 Broker")
|
||||
|
||||
from .protocol import (
|
||||
TOPIC_ALL_CONFIG_RESP, TOPIC_ALL_DATA_LOOP,
|
||||
TOPIC_ALL_DATA_EVENT, TOPIC_ALL_STATUS
|
||||
)
|
||||
client.subscribe(TOPIC_ALL_CONFIG_RESP, qos=1)
|
||||
client.subscribe(TOPIC_ALL_DATA_LOOP, qos=1)
|
||||
client.subscribe(TOPIC_ALL_DATA_EVENT, qos=1)
|
||||
client.subscribe(TOPIC_ALL_STATUS, qos=0)
|
||||
from .protocol import TOPIC_ALL_DEVICE_UP
|
||||
client.subscribe(TOPIC_ALL_DEVICE_UP, qos=1)
|
||||
else:
|
||||
self._connected = False
|
||||
self._notify_status(False, f"连接失败 (rc={rc})")
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
"""
|
||||
DLD960 IoT MQTT 协议定义
|
||||
|
||||
基于《DLD960_IoT_MQTT协议.md》V1.00
|
||||
基于《DLD960_IoT_MQTT协议.md》V1.01
|
||||
双主题结构:{sn}/down(服务器下发)、{sn}/up(设备上报)
|
||||
消息类型由 JSON `cmd` 字段区分。
|
||||
"""
|
||||
|
||||
import json
|
||||
@@ -11,49 +13,32 @@ from dataclasses import dataclass, field, asdict
|
||||
|
||||
|
||||
# ============================================================
|
||||
# Topic 结构
|
||||
# Topic 结构(V1.01 — 双主题)
|
||||
# ============================================================
|
||||
|
||||
def topic_config_set(dev_serial: str) -> str:
|
||||
"""服务器下发 — 设置配置"""
|
||||
return f"dld960/{dev_serial}/srv/config/set"
|
||||
def topic_down(dev_serial: str) -> str:
|
||||
"""服务器下发 — 设备订阅此主题接收所有命令"""
|
||||
return f"dld960/{dev_serial}/down"
|
||||
|
||||
|
||||
def topic_config_query(dev_serial: str) -> str:
|
||||
"""服务器下发 — 查询配置"""
|
||||
return f"dld960/{dev_serial}/srv/config/query"
|
||||
def topic_up(dev_serial: str) -> str:
|
||||
"""设备上报 — 设备发布到此主题(数据、事件、心跳、响应)"""
|
||||
return f"dld960/{dev_serial}/up"
|
||||
|
||||
|
||||
def topic_ctrl(dev_serial: str) -> str:
|
||||
"""服务器下发 — 控制命令"""
|
||||
return f"dld960/{dev_serial}/srv/ctrl"
|
||||
# 保持向后兼容的别名(4.7 iot_topic_set 仍使用 topic_pub / topic_sub)
|
||||
def topic_dev_pub(dev_serial: str) -> str:
|
||||
"""设备发布主题(= topic_up)"""
|
||||
return topic_up(dev_serial)
|
||||
|
||||
|
||||
def topic_config_resp(dev_serial: str) -> str:
|
||||
"""设备上报 — 配置响应"""
|
||||
return f"dld960/{dev_serial}/dev/config/resp"
|
||||
def topic_dev_sub(dev_serial: str) -> str:
|
||||
"""设备订阅主题(= topic_down)"""
|
||||
return topic_down(dev_serial)
|
||||
|
||||
|
||||
def topic_data_loop(dev_serial: str) -> str:
|
||||
"""设备上报 — 线圈数据"""
|
||||
return f"dld960/{dev_serial}/dev/data/loop"
|
||||
|
||||
|
||||
def topic_data_event(dev_serial: str) -> str:
|
||||
"""设备上报 — 事件"""
|
||||
return f"dld960/{dev_serial}/dev/data/event"
|
||||
|
||||
|
||||
def topic_status(dev_serial: str) -> str:
|
||||
"""设备上报 — 状态/心跳"""
|
||||
return f"dld960/{dev_serial}/dev/status"
|
||||
|
||||
|
||||
# 订阅通配符(监听所有设备)
|
||||
TOPIC_ALL_CONFIG_RESP = "dld960/+/dev/config/resp"
|
||||
TOPIC_ALL_DATA_LOOP = "dld960/+/dev/data/loop"
|
||||
TOPIC_ALL_DATA_EVENT = "dld960/+/dev/data/event"
|
||||
TOPIC_ALL_STATUS = "dld960/+/dev/status"
|
||||
# 服务器端通配符订阅(监听所有设备)
|
||||
TOPIC_ALL_DEVICE_UP = "dld960/+/up"
|
||||
|
||||
|
||||
# ============================================================
|
||||
@@ -158,15 +143,8 @@ def build_response(cmd: str, msg_id: int, code: int = 0, msg_text: str = "succes
|
||||
|
||||
|
||||
def get_topic_for_cmd(cmd: str, dev_serial: str) -> str:
|
||||
"""根据命令获取对应的下发 topic"""
|
||||
if cmd in CONFIG_SET_COMMANDS:
|
||||
return topic_config_set(dev_serial)
|
||||
elif cmd in CONFIG_QUERY_COMMANDS:
|
||||
return topic_config_query(dev_serial)
|
||||
elif cmd in CTRL_COMMANDS:
|
||||
return topic_ctrl(dev_serial)
|
||||
else:
|
||||
return topic_config_set(dev_serial) # 默认
|
||||
"""获取命令对应的下发 topic。所有命令统一使用 topic_down"""
|
||||
return topic_down(dev_serial)
|
||||
|
||||
|
||||
# ============================================================
|
||||
|
||||
Reference in New Issue
Block a user