# 对接工业物联网平台（统一命名空间）

厂内部署了 Ignition、Cogent DataHub 等 IIoT 平台，或需要按 Sparkplug B 规范建立**统一命名空间（UNS，Unified Namespace）**时，使用这一类北向应用。

## 与普通 MQTT 的差别

MQTT 规定了消息发往哪个主题，不规定消息的结构。由此产生三个问题：payload 的字段命名与数据类型需要收发双方事先约定，网关侧一旦调整格式，平台侧的解析随之改动；平台无法得知新接入设备有哪些点位，需要人工建模；平台也无法区分数据是新值还是陈旧值——收不到数据可能是设备停机、网关掉线，也可能是该点位本就不上报。

Sparkplug B 是建立在 MQTT 3.1.1 之上的工业物联网数据传输规范，用四个机制解决上述问题：

| 机制 | 作用 |
| --- | --- |
| **BIRTH 消息** | 设备上线时声明自身的点位清单、数据类型和初始值，平台据此自动建模，新增设备无需在平台侧修改配置 |
| **DEATH 消息** | 网关异常断开时由 Broker 通过 MQTT 遗嘱机制代发，平台立即得知该设备数据不再可信 |
| **序号与 bdSeq** | 每条消息携带递增序号，平台可据此发现消息丢失并请求重新 BIRTH，保持模型与现场一致 |
| **别名（Alias）** | 以短整数代替点位全名传输，点位数量大时可显著减小报文体积 |

这四项共同使 MQTT 网络具备状态感知与结构自描述能力，即统一命名空间的基础：全厂维护单一数据来源，上层各系统从该来源读写，而非两两点对点对接。

## 命名空间结构

EMQX Neuron 作为 Sparkplug B 的**边缘节点（Edge Node）**接入，将每个南向驱动映射为其下的一台设备：

```
spBv1.0 / {组 ID} / DDATA / {节点 ID} / {南向驱动名}
             ↑                 ↑             ↑
        工厂或车间           本网关        一台设备
```

| 字段 | 来源 |
| --- | --- |
| **组 ID** | 应用配置项，命名空间的最顶层分组，通常对应工厂或车间 |
| **节点 ID** | 应用配置项，本 EMQX Neuron 实例的唯一标识 |
| **{南向驱动名}** | 被订阅的南向驱动节点名称，一个驱动即一台设备 |

**组 Path** 参数默认开启，此时采集组名作为指标名的起始路径，平台侧看到的树状结构与现场的组织结构一致。

组 ID 与节点 ID 的变更会触发重新 BIRTH，批量部署前应先确定两者的命名规则。

完整的主题清单见 [Sparkplug B · 主题结构](./sparkplugb/overview.md#主题结构)。

## 反控设备

上层平台通过 `DCMD` 命令向指定南向驱动的点位写值，`NCMD` 用于边缘节点级命令。目标点位须在南向驱动中配置 **write** 属性，见[组与点位 · 点位属性](../groups-tags/groups-tags.md#点位属性)。

## 选择应用

| 应用 | 适用情形 |
| --- | --- |
| [Sparkplug B](./sparkplugb/overview.md) | 平台侧支持 Sparkplug B 规范时的首选。连接参数（服务器地址、端口、用户名密码、SSL、离线缓存）与 [MQTT 应用](./mqtt/overview.md)一致，仅**组 ID** 与**节点 ID** 来自 Sparkplug B 规范本身 |

## 连接示例

- [集成 EMQX](./sparkplugb/sparkplug.md)：上报到 EMQX 并通过编解码功能还原数据
- [Ignition 连接示例](./sparkplugb/ignition.md)
- [Cogent DataHub 连接示例](./sparkplugb/cogent.md)
