0

有没有办法用 mosca MQTT 实现请求-响应模式来“检查来自客户端的回复,如果我在预期时间内没有收到预期的回复,则重新发布”。

我相信这在 Mqtt 5 中是可能的,但到目前为止,我必须使用具有 QoS 1 的 Mosca 代理(支持到 Mqtt 3.1.1)

我正在寻找一种 Node js 解决方法来实现这一点。

4

2 回答 2

2

根据我的评论,您可以使用任何 MQTT 代理实现请求-响应模式,但在 v5 之前,您需要自己实现这一点(要么有一个回复主题和一个消息 ID,要么包含一个特定的回复主题在每条消息中)。

因为 MQTT 3.11 本身不直接提供此功能,并且 MQTT 有效负载没有标准格式(只有一些字节!),所以不可能提出通用实现(请求中需要某种唯一 id)。这在 MQTT v5 中通过包含Response TopicCorrelation Data等属性的能力得到解决。对于早期版本,您只能在有效负载中添加一些额外的信息(使用您选择的任何编码机制)。

有一些 Stack Overflow 问题可能会提供一些见解:

其他文章:

这里有几个节点包(注意:这些已经有一段时间没有更新了,我也没有查看代码):

即使使用 MQTT v5,您也需要自己实现空闲超时位。如果您使用的是 QOS 1/2,那么代理将负责重新发送消息(直到它接收到 PUBACK/PUBCOMP),因此重新发送消息可能会适得其反(当通信链路断开时,大量相同的消息排队等候)

于 2020-01-26T07:18:12.370 回答
0

我所做的工作流程的总结

  • 为每条消息添加“相关 ID”
  • 预期的回复存储在 Redis 中作为请求有效负载(以相关 ID 作为键的请求)来比较来自客户端的响应。
  • 如果预期的消息等同于预期的响应主题和有效负载,则该条目将从 Redis 中删除。
  • 超时对从客户端到服务器的每个响应使用节点 cron 作业。
于 2020-01-30T15:03:18.847 回答