首页 > 解决方案 > 请求/响应的 MQTT 主题名称

问题描述

我正在设计一个系统,其中包含许多使用 MQTT 连接到中央代理的设备。

有一些主设备可以向某些从设备发送请求。来自一个主站的请求通常被定向到一个从站。

请求的主题可以是: mysystem/slaveId/req,因此从属可以订阅该主题,而主可以发布到同一主题。只有被寻址的从机才会收到请求,因为它应该是。

我的问题是如何确定回复的主题。我在:mysystem/slaveId/res/masterId或者只是mysystem/slaveId/res.

在第一种情况下,我应该masterId在请求的有效负载中发送到从站,这样从站就可以构造响应主题名称。只有发送请求的主机才能收到答复。

在第二种情况下,所有活动的主人都会收到响应,因为主题不包含masterId. 发送请求的主机应该通过查看requestId有效负载中的 a 来检测其响应(这也是在请求有效负载中发送的)。

我认为第一个选择更好,但是 AWS 的Device Shadow服务使用类似于第二个选择的主题名称。例如,响应获取请求的设备将消息发布到$aws/things/myLightBulb/shadow/get/accepted. 因此,每个设备都会收到消息,而不仅仅是请求的那个。

我认为 AWS 做出了很好的选择,所以我很想遵循它……但是我不确定我是否理解他们的工作。

标签: amazon-web-servicesmqttiotaws-iot

解决方案


“好的选择”取决于上下文,这里上下文不同。设备影子旨在跟踪并准确反映设备的状态。您链接的页面没有讨论一个设备有多个阴影,并且可能没有考虑到多个接收器。尽管如此,它的简单主题架构仍然可以在每个设备具有多个影子的系统中工作,因为影子应该接收来自其设备的所有响应。这些响应中的任何一个都可能揭示设备状态的变化,并且客户端未收到响应的任何影子都将过时,并且与其他影子不同步。

你的主人听起来不像影子。也许他们独立地将他们的结果报告给充当影子的数据存储。也许响应中的任何内容都不能代表请求之外值得跟踪的状态变化。无论哪种方式,文档听起来都与您的目标无关。

我支持您对首选的偏好,尤其是随着节点数量的增加。主要缺点是跟踪请求主 ID 的额外工作。这对大师来说很容易(每个人都可以订阅mySystem/+/res/masterId,并且在具有主题访问控制的系统中,您甚至可以隔离它们)。如果请求正文很简单(尚未解析多个属性),您可能会考虑让主服务器发布到mysystem/slaveId/req/masterId(从服务器可以订阅mysystem/slaveId/req/+)。

AWS 的最大例子可能是主题中清晰的层次感。如果在主题末尾包含 masterId 的解析便利不是您最关心的问题,那么排序为:(mysystem/masterId/slaveId/reqres)可能更有意义。非常依赖于您的系统和目标。


推荐阅读