Files
vd_960/docs/DLD960_IoT_MQTT协议.md
T
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

826 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DLD960 IoT 接口协议(MQTT + JSON
> 基于《DLD960 串口通信协议》V1.01,将设备管理、参数配置、数据上报映射到 MQTT 协议。
> 交互格式:JSON。
---
# 1 通信说明
## 1.1 连接参数
| 项目 | 说明 |
|------|------|
| 协议 | MQTT 3.1.1 / 5.0 |
| 传输层 | TCP (TLS 可选) |
| QoS | 配置类 QoS 1,数据上报类 QoS 0/1 |
| 编码 | UTF-8 |
| 序列化 | JSON |
## 1.2 Topic 结构
协议仅使用两个主题,所有消息类型通过 JSON 内 `cmd` 字段区分。
```
dld960/{dev_serial}/{direction}
```
| 字段 | 说明 |
|------|------|
| `dev_serial` | 设备序列码(6字节十六进制字符串,如 `A1B2C3D4E5F6` |
| `direction` | `srv` = 服务器下发(设备订阅),`dev` = 设备上报(服务器订阅) |
### 1.2.1 服务器下发 Topic — `dld960/{sn}/srv`
设备订阅此主题,接收服务器下发的所有命令(配置设置、查询、控制等)。
服务器发布到此主题。
对应串口 CMD0x09 ~ 0x1F, 0x63, 0x64, 0xC5 等。
### 1.2.2 设备上报 Topic — `dld960/{sn}/dev`
设备发布到此主题,上报线圈数据、事件、心跳及命令响应。
服务器订阅此主题接收所有设备上行消息。
服务器端可订阅通配符 `dld960/+/dev` 监听所有设备。
---
# 2 JSON 消息格式
## 2.1 通用结构
```json
{
"msg_id": 12345,
"cmd": "dev_info_query",
"ts": 1719000000,
"data": { ... }
}
```
| 字段 | 类型 | 说明 |
|------|------|------|
| `msg_id` | uint32 | 消息序列号,递增,用于请求-响应匹配(由发起方生成) |
| `cmd` | string | 命令标识符 |
| `ts` | uint32 | Unix 时间戳(秒),发起方填充 |
| `data` | object | 命令参数,结构依 cmd 而定 |
## 2.2 响应通用结构
```json
{
"msg_id": 12345,
"cmd": "dev_info_query",
"ts": 1719000001,
"code": 0,
"msg": "success",
"data": { ... }
}
```
| 字段 | 类型 | 说明 |
|------|------|------|
| `code` | int | 0 = 成功,非 0 = 失败码 |
| `msg` | string | 错误描述(成功时为 `"success"` |
### 错误码定义
| code | 说明 |
|------|------|
| 0 | 成功 |
| 1 | 参数错误(格式/范围不正确) |
| 2 | 密码验证失败 |
| 3 | 设备忙(操作执行中) |
| 4 | 不支持的命令 |
| 5 | 内部错误 |
| 6 | 数据超长 |
---
# 3 命令详表
| cmd | 说明 | 方向 | 对应串口 |
|-----|------|------|----------|
| `dev_serial_set` | 更改设备序列码 | srv→dev | 0x09 |
| `dev_info_query` | 查询设备信息 | srv→dev | 0x10 |
| `ssc_net_set` | 设置 SSC 网络配置 | srv→dev | 0x11 |
| `ssc_net_query` | 查询 SSC 网络配置 | srv→dev | 0x12 |
| `iot_net_set` | 设置 IoT 网络配置 | srv→dev | 0x13 |
| `iot_net_query` | 查询 IoT 网络配置 | srv→dev | 0x14 |
| `iot_topic_set` | 设置设备 Topic | srv→dev | 0x15 |
| `iot_topic_query` | 查询设备 Topic | srv→dev | 0x16 |
| `pwd_verify` | 验证设备密码 | srv→dev | 0x1C |
| `pwd_set` | 设置设备密码 | srv→dev | 0x1D |
| `factory_reset` | 设备出厂初始化 | srv→dev | 0x1E |
| `device_reset` | 设备复位 | srv→dev | 0x1F |
| `loop_param_set` | 设置车检器多路参数 | srv→dev | 0x63 |
| `loop_param_query` | 读取车检器多路参数 | srv→dev | 0x64 |
| `report_config` | 设置主动上报 | srv→dev | 0xC5 |
| `initialize` | 设备上电初始化登陆 | dev→srv | — |
| `loop_data` | 线圈传感数据上报 | dev→srv | 0xC0 |
| `event_report` | 事件上报 | dev→srv | — |
| `heartbeat` | 设备心跳 | dev→srv | — |
---
# 4 命令详情
## 4.1 更改设备序列码 `dev_serial_set`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 1,
"cmd": "dev_serial_set",
"ts": 1719000000,
"data": {
"dev_serial": "A1B2C3D4E5F6"
}
}
```
**响应:** Topic: `dld960/{sn}/dev`
```json
{
"msg_id": 1,
"cmd": "dev_serial_set",
"ts": 1719000001,
"code": 0,
"msg": "success"
}
```
## 4.2 查询设备信息 `dev_info_query`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 2,
"cmd": "dev_info_query",
"ts": 1719000000
}
```
**响应:**
```json
{
"msg_id": 2,
"cmd": "dev_info_query",
"ts": 1719000001,
"code": 0,
"msg": "success",
"data": {
"dev_serial": "A1B2C3D4E5F6",
"hard_ver": "1.1",
"soft_ver": "1.1",
"model": "DLD960",
"product_code": "960001",
"sub_code": {
"net": true,
"iot": true
},
"bus": {
"bus1": 0,
"bus2": 0,
"bus3": 0,
"bus4": 0
}
}
}
```
| data 字段 | 类型 | 说明 |
|-----------|------|------|
| `dev_serial` | string | 12 位十六进制序列码 |
| `hard_ver` | string | 硬件版本,格式 `"主.次"` |
| `soft_ver` | string | 软件版本,格式 `"主.次"` |
| `model` | string | 产品型号,1~10 字符 |
| `product_code` | string | 产品编码,6 位数字字符串 |
| `sub_code.net` | bool | 网络功能是否启用 |
| `sub_code.iot` | bool | IoT/MQTT 功能是否启用 |
| `bus.bus1~4` | uint8 | 各总线探头数 |
## 4.3 设置 SSC 网络配置 `ssc_net_set`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 3,
"cmd": "ssc_net_set",
"ts": 1719000000,
"data": {
"dev_ip": "192.168.1.100",
"subnet_mask": "255.255.255.0",
"route_ip": "192.168.1.1",
"lssc_ip": "192.168.1.200",
"dns": "8.8.8.8",
"port": 502
}
}
```
| data 字段 | 类型 | 说明 |
|-----------|------|------|
| `dev_ip` | string | 设备 IP 地址 |
| `subnet_mask` | string | 子网掩码 |
| `route_ip` | string | 网关地址 |
| `lssc_ip` | string | LSSC 服务器 IP |
| `dns` | string | DNS 服务器 IP |
| `port` | uint16 | 端口号 |
**响应:**
```json
{
"msg_id": 3,
"cmd": "ssc_net_set",
"ts": 1719000001,
"code": 0,
"msg": "success"
}
```
## 4.4 查询 SSC 网络配置 `ssc_net_query`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 4,
"cmd": "ssc_net_query",
"ts": 1719000000
}
```
**响应:** 返回字段同 4.3 的 `data`
## 4.5 设置 IoT 网络配置 `iot_net_set`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 5,
"cmd": "iot_net_set",
"ts": 1719000000,
"data": {
"host": "mqtt.example.com",
"port": 1883,
"client_id": "dld960_A1B2C3D4E5F6",
"username": "admin",
"password": "secret"
}
}
```
| data 字段 | 类型 | 说明 |
|-----------|------|------|
| `host` | string | MQTT Broker 域名或 IP |
| `port` | uint16 | MQTT 端口,默认 1883 |
| `client_id` | string | MQTT Client ID,空时用空格 |
| `username` | string | MQTT 用户名 |
| `password` | string | MQTT 密码 |
**响应:** 标准成功/失败。
## 4.6 查询 IoT 网络配置 `iot_net_query`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 6,
"cmd": "iot_net_query",
"ts": 1719000000
}
```
**响应:** 返回字段同 4.5 的 `data`
## 4.7 设置设备 Topic `iot_topic_set`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 7,
"cmd": "iot_topic_set",
"ts": 1719000000,
"data": {
"client_id_enable": true,
"topic_pub": "dld960/data/A1B2C3D4E5F6",
"topic_sub": "dld960/cmd/A1B2C3D4E5F6"
}
}
```
**响应:** 标准成功/失败。
## 4.8 查询设备 Topic `iot_topic_query`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 8,
"cmd": "iot_topic_query",
"ts": 1719000000
}
```
**响应:** 返回字段同 4.7 的 `data`
## 4.9 验证设备密码 `pwd_verify`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 9,
"cmd": "pwd_verify",
"ts": 1719000000,
"data": {
"password": "123456"
}
}
```
| data 字段 | 类型 | 说明 |
|-----------|------|------|
| `password` | string | 6 位数字密码 |
**响应:**
```json
{
"msg_id": 9,
"cmd": "pwd_verify",
"ts": 1719000001,
"code": 0,
"msg": "success"
}
```
## 4.10 设置设备密码 `pwd_set`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 10,
"cmd": "pwd_set",
"ts": 1719000000,
"data": {
"old_password": "123456",
"new_password": "654321"
}
}
```
**响应:** 标准成功/失败。旧密码错误时 `code=2`
## 4.11 设备出厂初始化 `factory_reset`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 11,
"cmd": "factory_reset",
"ts": 1719000000
}
```
**响应:**
```json
{
"msg_id": 11,
"cmd": "factory_reset",
"ts": 1719000001,
"code": 0,
"msg": "success"
}
```
## 4.12 设备复位 `device_reset`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 12,
"cmd": "device_reset",
"ts": 1719000000
}
```
无响应(设备复位后断开连接)。
## 4.13 设置车检器多路参数 `loop_param_set`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 13,
"cmd": "loop_param_set",
"ts": 1719000000,
"data": {
"auto_mode": false,
"channels": [
{
"ch": 1,
"sens": 7,
"level": "high",
"delay": 0,
"output": "exist",
"exist": 0,
"dir": 0,
"safe": 0,
"fun_mode": 0
},
{
"ch": 2,
"sens": 7,
"level": "mid_high",
"delay": 5,
"output": "enter_pulse",
"exist": 10,
"dir": 0,
"safe": 0,
"fun_mode": 0
},
{
"ch": 3,
"sens": 5,
"level": "mid_low",
"delay": 0,
"output": "exist",
"exist": 0,
"dir": 1,
"safe": 5,
"fun_mode": 0
},
{
"ch": 4,
"sens": 8,
"level": "low",
"delay": 10,
"output": "leave_pulse",
"exist": 15,
"dir": 0,
"safe": 0,
"fun_mode": 0
}
]
}
}
```
| data 字段 | 类型 | 说明 |
|-----------|------|------|
| `auto_mode` | bool | 自动调频模式,默认 false |
| `channels` | array | 各路通道参数,1~4 路 |
| `channels[].ch` | uint8 | 通道号 1~4 |
| `channels[].sens` | uint8 | sensitivity, 灵敏度 0~9,默认 7 |
| `channels[].level` | string | freq_level, `"high"`(33nF) / `"mid_high"`(43nF) / `"mid_low"`(66nF) / `"low"`(76nF) |
| `channels[].delay` | uint8 | loop_delay, 延时时间,0~200(×0.1s),最大 20s |
| `channels[].output` | string | exist_mode, `"exist"` / `"enter_pulse"` / `"leave_pulse"` / `"direction"` |
| `channels[].exist` | uint8 | output_mode, 存在方式,0=永久,非0=分钟数 |
| `channels[].dir` | uint8 | direction_mode, 方向判别模式,0=触发,1~6=方向输出 |
| `channels[].safe` | uint8 | safe_mode, 安全模式,0=关闭,非0=分钟数 |
| `channels[].fun_mode` | uint8 | function_mode, 功能模式 |
**响应:**
```json
{
"msg_id": 13,
"cmd": "loop_param_set",
"ts": 1719000001,
"code": 0,
"msg": "success"
}
```
## 4.14 读取车检器多路参数 `loop_param_query`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 14,
"cmd": "loop_param_query",
"ts": 1719000000
}
```
**响应:**
```json
{
"msg_id": 14,
"cmd": "loop_param_query",
"ts": 1719000001,
"code": 0,
"msg": "success",
"data": {
"auto_mode": false,
"channels": [
{
"ch": 1,
"sens": 7,
"level": "high",
"delay": 0,
"output": "exist",
"exist": 0,
"dir": 0,
"safe": 0,
"fun_mode": 0,
"f_initial": 105300,
"f_current": 105280,
"diff": 20
}
]
}
}
```
| 额外字段 | 类型 | 单位 | 说明 |
|----------|------|------|------|
| `f_initial` | uint32 | Hz | freq_initial, 初始频率 |
| `f_current` | uint32 | Hz | freq_current, 当前实时频率 |
| `diff` | uint32 | Hz | 变化量(绝对值) |
## 4.15 设置主动上报 `report_config`
> Topic: `dld960/{sn}/srv`
**请求:**
```json
{
"msg_id": 15,
"cmd": "report_config",
"ts": 1719000000,
"data": {
"sensor_type": 12,
"enable": true,
"once": false,
"env_eval": false,
"interval": 5,
"ack_required": false,
"timeout": 0
}
}
```
| data 字段 | 类型 | 说明 |
|-----------|------|------|
| `sensor_type` | uint8 | 传感器类型,线圈=0x0C(12) |
| `enable` | bool | 是否使能主动上报 |
| `once` | bool | 仅上报一次(查询模式) |
| `env_eval` | bool | 环境评估使能 |
| `interval` | uint8 | 上报间隔(秒),0=实时 |
| `ack_required` | bool | 上报是否需要确认 |
| `timeout` | uint8 | 超时时间(分钟),0=无限制 |
**响应:** 标准成功/失败。
---
# 5 设备主动上报
## 5.1 设备上电登陆信息 `initialize`
> Topic: `dld960/{sn}/dev`
> QoS: 0/1
```json
{
"msg_id": 1,
"cmd": "initialize",
"ts": 1719000000,
"data": {
"dev_serial":"A1B2C3D4E5F6",
"model": "DLD960",
"hard_ver": "1.0",
"soft_ver": "1.0",
"extra_info": {
"code": "869756049404948",
"csq": "21",
"location": "113.9237976,022.6400375",
}
}
}
```
| 字段 | 类型 | 说明 |
|------|------|------|
| `data.dev_serial` | string | 设备序列码 |
| `data.model` | string | 产品型号 |
| `data.hard_ver` | string | 硬件版本 |
| `data.soft_ver` | string | 固件版本 |
| `data.extra_info.code` | string | 可选,设备代码如IMSI/ICCID |
| `data.extra_info.csq` | string | 可选,当前信号强度 |
| `data.extra_info.location` | string | 可选,经纬度(经度,纬度) |
## 5.2 线圈传感数据 `loop_data`
> Topic: `dld960/{sn}/dev`
> QoS: 0/1
```json
{
"msg_id": 100,
"cmd": "loop_data",
"ts": 1719000100,
"data": {
"channels": [
{
"ch": 1,
"level": "high",
"iscar": false,
"loop_ok": true,
"freq": 105280,
"diff": 20,
"sens": 7,
"cndtn": 0,
"misc": {
"type": "time",
"value": 0
}
},
{
"ch": 2,
"level": "mid_high",
"iscar": true,
"loop_ok": true,
"freq": 98700,
"diff": 1500,
"sens": 7,
"cndtn": 2,
"misc": {
"type": "time",
"value": 350
}
},
{
"ch": 3,
"level": "mid_low",
"iscar": false,
"loop_ok": false,
"freq": 0,
"diff": 0,
"sens": 5,
"cndtn": 0,
"misc": {
"type": "cut_count",
"value": 3
}
},
{
"ch": 4,
"level": "low",
"iscar": false,
"loop_ok": true,
"freq": 62100,
"diff": 5,
"sens": 8,
"cndtn": 0,
"misc": {
"type": "flow_count",
"value": 128
}
}
]
}
}
```
| 通道字段 | 类型 | 说明 |
|----------|------|------|
| `ch` | uint8 | 通道号 1~4 |
| `level` | string | freq_level 线圈高低频档位 |
| `iscar` | bool | 是否有车 |
| `loop_ok` | bool | 线圈是否正常(false=断开) |
| `freq` | uint32 | 当前频率 (Hz) |
| `diff` | uint32 | 变化量 |
| `sens` | uint8 | sensitivity, 当前灵敏度等级 |
| `cndtn` | uint8 | condition, 环境状态评估值(越大干扰越大) |
| `misc.type` | string | `"time"`(时间量) / `"cut_count"`(断开次数) / `"flow_count"`(车流量) |
| `misc.value` | uint32 | 杂项数值(时间量单位 50ms) |
## 5.3 事件上报 `event_report`
> Topic: `dld960/{sn}/dev`
设备检测到事件时主动上报,非周期性。
```json
{
"msg_id": 101,
"cmd": "event_report",
"ts": 1719000200,
"data": {
"events": [
{
"type": "car_enter",
"ch": 2,
"value": 0
},
{
"type": "car_leave",
"ch": 2,
"value": 350
},
{
"type": "loop_cut",
"ch": 3,
"value": 0
}
]
}
}
```
| 事件类型 `type` | 说明 | `value` 含义 |
|----------------|------|-------------|
| `car_enter` | 车辆进入 | 0 |
| `car_leave` | 车辆离开 | 通过时间 (×50ms) |
| `loop_cut` | 线圈断开 | 0 |
| `loop_restore` | 线圈恢复 | 断开持续时长 (×50ms) |
## 5.4 设备心跳 `heartbeat`
> Topic: `dld960/{sn}/dev`
> 周期:默认 60 秒
```json
{
"msg_id": 200,
"cmd": "heartbeat",
"ts": 1719000060,
"data": {
"uptime": 3600,
"loop_status": [true, true, false, true],
"net_status": true,
"iot_status": true
}
}
```
| data 字段 | 类型 | 说明 |
|-----------|------|------|
| `uptime` | uint32 | 设备运行时长(秒) |
| `loop_status` | bool[4] | 各路线圈是否正常 |
| `net_status` | bool | 以太网连接状态 |
| `iot_status` | bool | MQTT 连接状态 |
---
# 修订记录
| 版本 | 修订时间 | 修订说明 | 修订人 |
|------|----------|----------|--------|
| V1.00 | 2026-06-22 | 初始版本,基于串口协议 V1.01 | wangfq |
| V1.01 | 2026-07-07 | Topic 压缩为双主题(`{sn}/srv` + `{sn}/dev`),消息类型由 `cmd` 字段区分 | wangfq |
| V1.02 | 2026-07-09 | 缩写相关字段 | wangfq |
| V1.03 | 2026-07-09 | 增加设备上电初始化指令 | wangfq |