VOCs 色谱边缘工作站 MQTT 协议标准规范 (草案)
1. 背景与痛点分析
在审阅原有的 MQTT.md(PEA780303型号)协议时,我们发现存在以下导致数据冗余和带宽浪费的痛点:
- 严重的数据冗余:
- 每次上报都在 Payload 中包含
index、clientid、Node、mn和imei,这些本质上都是同一个设备唯一标识的变体。 factor因子字典中,每个因子都重复携带了name(名称) 和unit(单位)。对于 VOCs 这种动辄十几个组分的设备,每次都上传“非甲烷总烃”、“mg/m³”等固定元数据会造成极大的带宽浪费。
- 每次上报都在 Payload 中包含
- 动静数据未分离:
- 设备的 GPS 经纬度 (
lng,lat)、IP 地址、ICCID 等几乎是不变的静态信息,却和传感器数据绑在一起高频上传。
- 设备的 GPS 经纬度 (
- 缺乏针对色谱的精细化分层:
- VOCs 色谱工作站的数据分为几种完全不同的生命周期:周期性硬件状态(温度、压力,秒/分钟级)、分析结果(组分浓度,周期级 2-15 分钟)、系统日志(按需触发,15秒队列管控)。混在一个结构里会导致极大浪费。
2. 核心优化原则
为了适应大规模工控机部署和低带宽网络(IoT 物联网卡),并无缝对接 Elasticsearch:
- 依赖 Topic 路由提取 MN 号:
- 将
MN(即 ClientID / 唯一编码)放在 MQTT Topic 路径中。MQTT Broker (如 EMQX) 或 Logstash/Fluentd 订阅 Topic 时,可以自动从 Topic 提取 MN 并作为 Elasticsearch 的index路由键。Payload 内部不再重复发送MN和index。
- 将
- 动静分离,多 Topic 策略:
- 将上报分为
info(基础信息)、status(硬件工况)、result(分析结果) 和log(运行日志) 四个独立的 Topic。
- 将上报分为
- 因子扁平化(K-V键值对):
- 去除 Payload 内部的中文名称和单位,全部使用标准因子代码(如参考 HJ212 的
a24088代表非甲烷总烃)或简写英文 Key 作为键,值为 Float 类型。单位和名称由上位机或云平台在展示时统一映射。
- 去除 Payload 内部的中文名称和单位,全部使用标准因子代码(如参考 HJ212 的
3. Topic 设计规范
所有 Topic 的基础前缀为:vocs/device/{MN} ({MN} 替换为实际的设备唯一编码,与 ClientID 一致)。
4. Payload 数据结构定义 (JSON)
4.1 设备信息 (Info)
Topic: vocs/device/{MN}/info
4.2 硬件工况状态 (Status)
Topic: vocs/device/{MN}/status
注:只传实测值,不传设定值,以最扁平的格式传输。
4.3 分析结果 (Result)
Topic: vocs/device/{MN}/result
注:采用因子代码映射,剥离中文和单位。例如 a24088 为非甲烷总烃,a05001 为总烃,a05002 为甲烷。
4.4 系统日志与报警 (Log)
Topic: vocs/device/{MN}/log
注:遵循【日志需队列功能,15秒覆盖一次】的核心规则,如果15秒内产生多条日志,将打包为一个数组上传,防止刷屏。
5. 云端 ElasticSearch 路由与解析建议
- Logstash / Fluentd 接收端:
- 订阅通配符 Topic:
vocs/device/+/+ - 使用正则或路径拆分,将 Topic 中的
{MN}提取出来。 - 动态拼接写入 ES 的索引名:
index => "vocs-mqtt-%{MN}-%{+YYYY.MM}"。
- 订阅通配符 Topic:
- 前端与云平台映射:
- 云端数据库维护一份
Factor Dictionary(如a24088->非甲烷总烃,单位mg/m³)。 - 在前端查询和展示 ES 数据时,再将这些固定不变的名称和单位渲染上去。
- 云端数据库维护一份
