我正在构建一个具有以下要求的项目:


我的硬件设备(NanoPi)应该访问代理以获取视频密钥。
代理应具有一个队列,该队列将按住服务器发送的视频密钥,然后根据请求将其转发到设备。
设备会将视频密钥推送到远程服务器,并请求特定的视频。
远程服务器将发送视频密钥。视频到设备,设备将在监视器上显示视频。
视频播放完成后,设备将再次请求新的视频密钥。

我应该使用哪个经纪人来将视频密钥存储在队列中? MQTT经纪人是否适合我的应用程序?如果不是,我应该使用哪个其他经纪人?

#1 楼

我不确定MQTT是否真的适合您的需求。 MQTT具有“保留消息”的概念,由服务器保留,并在客户端连接后立即发送给客户端。但是每个主题只能保留一条消息。不是消息队列。

如果客户端连接到代理,则可以按顺序发送数据包,并且通常保留顺序(在QoS 1和2中),但是客户端需要处理排队。代理将在接收到数据包后立即将数据包发送到客户端。

我认为您会发现拥有通过API(也许是REST API)访问的中央服务器会更容易。例如,您的客户端可以发送请求:

POST /key/new


,然后服务器可以为该服务器创建新的密钥。客户并将其发送。对于我来说,这似乎比添加MQTT代理的间接操作容易,这不能为您建议的解决方案增加任何好处。

#2 楼

我同意Aurora的回答-可能有更好的解决方案来实现队列而不是MQTT,但是在MQTT中仍然是完全可能的。

您需要MQTT Broker和clean = false(在MQTT 3.x中)或具有适当的有效期限(MQTT 5.0)。然后,逻辑就非常简单。

您拥有持久的(但未连接)客户端会话,该客户端会话已通过QoS = 1进行订阅,以更正主题以接收和缓冲由密钥生成器发布的密钥。

设备连接,使用适当的client_id进行给定会话的授权,并立即接收密钥。您应该只确认第一个密钥,然后关闭连接。

即-客户端中有一个密钥,当MQTT代理收到该数据包的ack时,它将把它从会话存储中删除。

评论


基本上不编写自己的MQTT客户端,要实现您的描述并不容易。随着on_message回调返回,往往会发生对第一条消息的确认,此时,代理将发送第二条消息,并且最好在再次调用on_message之前彻底断开连接。

– hardillb
18年6月28日在9:43

我认为几乎所有MQTT客户端都可以对QoS = 1消息进行手动确认。是的,在确认后几秒钟断开连接,以确保确认已到达代理并导致断开连接,这是强制代理重新发送消息的唯一方法。

–shal
18年6月28日在11:27