我想知道主题命名和mqtt消息的有效负载设计的最佳实践。

最好使用多个主题名称和较长主题名称,并使用较大的有效负载或较短的主题名称和较大的负载。

例如:

plant1/machineA/sensorX/temperature/value 20
plant1/machineA/sensorX/temperature/unit C
plant1/machineA/sensorX/temperature/timestamp 2018-08-01T12:00:30.123Z


vs.

plant1/machineA/
{
  ["sensorX": {
   "value": 20,
   "unit": "C",
   "timestamp": "2018-08-01T12:00:30.123Z"
  }]
}


有一个还有更多的可能性。但是有没有通用的方法?尽可能在主题名称或有效载荷中使用?

评论

这完全取决于您的用例。

#1 楼

您的设计问题是MQTT传输协议之上的协议。
现有的协议可以指导您的选择:


Cirrus Link Sparkplug https://www.Cirrus Link Sparkplug。 cirrus-link.com/oem-device-data-integration/

任何其他云IoT平台API(AWS,Azure,Google,IBM等)

对于高可伸缩性应用程序,主题端点的选择似乎只是每件事主题集很小(很有意义:如果您有数百万个事物,则希望最大程度地减少代理的切换负担),至少要有一个“事件”主题(从事物到应用程序发布遥测)和一个“控制”主题(事物由应用程序从应用程序接收命令)。

此外,有效负载中的信息通常由一个密钥组成(例如,时间戳或序列号)和属性值。在您的第一选择中,如何面对网络上不同步的消息流,如何将在不同主题上获得的不同值结合在一起?

评论


感谢您指向卷云。那很有趣。您还知道其他类似的“协议”吗? BR

– CPA
18年8月17日在11:31

e-s-r.net/download/specification/ESR030-LWM2M-MQTT-1.0-A.pdf

–Gambit支持
18年8月17日在14:26

#2 楼

应该根据您如何使用主题来做出决定。如果需要在一起使用值,则将它们发布到一个主题中;如果单独使用,则将它们放在单独的主题中。也不要像在第一个示例中那样在主题中发布值。并且不要创建超出主题的范围,例如温度传感器的sensorX /温度,从一开始就更通用,到最后更具体。
所以我建议您发布到:

plant1/machineA/sensorX
{
   "value": 20,
   "unit": "C",
   "timestamp": "2018-08-01T12:00:30.123Z"
}


,或者如果您有各种类型的传感器,并且要在它们之间进行选择,请将温度放在传感器名称之前的某个位置:

plant1/machineA/temperature/sensorX


,或者也可以案例是:

temperature/plant1/machineA/sensorX