欢迎来到我们的MQTT 5要点系列的第9部分。在第8部分中,我们介绍了MQTT 5中的负载格式描述。在本文中,我们将重点介绍两个突出的元素:响应主题和关联数据。
在处理现代物联网项目的复杂性时,需要跨不同供应商和团队进行协作。随着MQTT成为物联网的卓越协议,增强的互操作性和系统透明性成为MQTT版本5蓝图中的主要需求。今天我们要深入探讨的特性通过提供一种标准解决方案,用于使用MQTT实现请求-响应模式,以满足用户的需求。
什么是MQTT中的请求-响应模式?
MQTT根植于异步消息传递,采用发布-订阅范式。这个设计允许发送方和接收方独立运行,促进了一对多的关系。重要的是要理解,MQTT的请求-响应模式与同步的、基于一对一的协议(例如HTTP)从根本上不同。
在MQTT中,响应通常不会直接回答请求的“问题”。相反,请求会在接收方触发特定操作,而响应则会传达这个操作的结果。
听起来复杂吗?不要担心,一个具体的示例很快会让这一切变得清晰!
什么是MQTT 5中的响应主题?
响应主题是一个可选的UTF-8字符串,包含在任何PUBLISH或CONNECT数据包中。如果响应主题中存在值,发送方将立即将相关的PUBLISH标记为请求。响应主题字段指示了消息接收者预期的响应主题。最初的PUBLISH(请求)和响应主题可以有多个或没有订阅者。理想情况下,原始的PUBLISH(请求)发送方应在发送请求之前订阅响应主题。
什么是MQTT 5中的关联数据?
关联数据是后续的响应主题之后的可选二进制数据。它帮助请求的发送方识别后来接收到的响应与哪个特定的请求相关。关联数据允许原始请求发送方管理从多个接收者可能发送的异步响应。重要的是要注意,这些数据与MQTT代理无关,但用于标识发送方和接收方之间的关系。
MQTT 5中的响应信息是什么?
为了促进透明的实现和改进标准化,MQTT 5规范引入了响应信息属性。通过CONNECT中的一个布尔字段,客户端可以请求代理发送响应信息。当设置为true时,代理可以在CONNACK数据包中发送一个可选的UTF-8字符串字段(响应信息),以传达预期的响应主题。
这个特性允许用户在代理上全局定义主题树的特定部分,所有表示他们打算在连接建立时使用请求-响应模式的客户端都可以访问这个部分。
MQTT 5中的端到端确认
MQTT确保消息发送方和接收方完全解耦。在许多情况下,用例需要从预期的接收方那里获得消息接收的确认。例如,当通过命令打开智能家居的门时,发送方(通常是移动应用程序)希望知道消息何时接收以及命令的结果。
请求-响应模式在智能门上的示例
例如,使用MQTT 5请求-响应功能,通过移动设备打开智能门的示例。
MQTT 5规范中包含请求-响应模式,主要是为了满足这些“业务确认”的需求。MQTT用户寻求在应用消息的发送方和接收方之间提供端到端确认的能力。通过直接将响应主题、关联数据和响应信息集成到协议字段中,我们显著增强了使用请求-响应模式进行应用程序开发的灵活性、动态性和透明性。
MQTT请求-响应工作流的源代码示例
以下是展示HiveMQ MQTT客户端能力的快速代码片段,提供了MQTT中请求-响应模式工作流的味道。请注意,这不是一个完整的、可运行的示例。
您可以在GitHub上访问完整示例,并在我们的HiveMQ社区论坛中咨询任何实施问题。
// 请求方订阅响应主题
Mqtt5SubAck subAck = requester.subscribeWith()
.topicFilter("job/client1234/result")
.send();
// 请求方发布请求
Mqtt5PublishResult result = requester.publishWith()
.topic("job")
.correlationData("1234".getBytes())
.responseTopic("job/client1234/result")
.payload(message.getBytes())
.send();
// 响应方订阅请求主题
Mqtt5SubAck subAck = responder.subscribeWith()
.topicFilter("job")
.send();
// 响应方在接收请求后发送响应
Mqtt5PublishResult result = responder.publishWith()
.topic(publish.getResponseTopic().get())
.payload(msg.getBytes())
.correlationData(publish.getCorrelationData().get())
.send();
MQTT请求-响应中的关键要点
以下是MQTT请求-响应的一些关键要点:
- MQTT中的请求-响应模式与同步的、基于客户端-服务器的协议(如HTTP)显著不同。
- MQTT允许请求和响应的订阅者为多个、单个或甚至没有。
- 关联数据确保请求和响应之间的正确关联,提高消息跟踪的能力。
- 这种模式促进了“业务确认”功能的实现,提供了一种可扩展、动态和透明的解决方案。
在使用MQTT的请求-响应时要考虑的最佳实践
在使用MQTT的请求-响应时,以下是一些最佳实践:
- 确保请求方在发送请求之前订阅相关的响应主题。
- 在响应主题中使用唯一的标识符以避免混淆。
- 确保响应方和请求方具有发布和订阅响应主题的必要权限。
- 为响应目的专门分配主题树的一个特定部分,并利用响应信息字段将其传递给客户端。
结论
当我们探讨MQTT v5的变革性特性时,我们发现了协议演进的力量。这些增强功能,如请求-响应模式,不仅简化了现有的实践,还开启了应用程序开发中新的动态、透明和可扩展的领域。在第10部分中,我们将讨论主题别名的话题。
您必须登录才能发表评论。