我目前正在开发一个项目,一个使用MQTT的聊天应用程序,其中有3个客户端A,B,C。当每个客户端加入时,他们最初订阅了2个主题为A的AB,AC,而B订阅了AB ,BC和c订阅了AC和BC。这些是聊天消息发送和接收的主题。现在我想添加在线支持,以通知用户是离线还是在线。是否存在MQTT代理支持的内置机制来实现此目标。
答案 0 :(得分:10)
某些代理实现可能会为连接/断开事件提供合适的挂钩来启用此功能,但对于代理而言,这不是协议的要求。
可以使用协议的功能创建存在感知系统
您可以在此处阅读更多内容:https://github.com/mqtt/mqtt.github.io/wiki/presence
总之,当客户端连接时,它应该定义要发布到主题0
的{{1}}的Last Will消息,并设置保留标志。然后,它应该将保留消息发布到值为client/[client-id]
的主题client/[client-id]
。
这意味着任何人都可以订阅1
并获取所有已知客户的当前状态:
client/+
的{{1}}消息表示A当前已连接1
的{{1}}消息表示A当前已断开连接顺便说一句,您应该仔细考虑您希望客户订阅哪些主题。正如您所描述的那样,您可以让每个客户明确订阅其他客户的主题。这不会很好地扩展 - 考虑如何使用通配符来管理它。