1 回答
TA贡献1793条经验 获得超6个赞
基于对您的代码的快速审查,这就是我认为正在发生的事情(因为您没有提供所有代码,所以涉及一些猜测):
main()
调用InitializeBroker
创建两个到代理的连接。默认发布处理程序设置为firstPubHandler
并在OnConnect
您订阅的处理程序中SubClientId+"/id/Certificate
当接收到消息 ( ) 时,您从消息中获取证书并使用它与使用相同客户端 ID 但不同/default 发布处理程序
firstPubHandler
的代理建立一组新连接。OnConnect
因此,在第 2 点之后,您实际上有两组独立的代理连接(总共 4 个连接)。但是MQTT-3.1.4-2
(参见规范)指出:
如果 ClientId 代表一个已经连接到服务器的客户端,那么服务器必须断开现有的客户端。
因此,当建立第二组连接时,代理将丢弃第一组连接。这是您看到的“EOF”断开连接。第二组连接仍将启动。当您connectLostHandler
对第一组和第二组连接使用相同的连接时,您无法在日志中看到哪个连接被终止。
总之,我相信您的代码确实有效。但是,您可能应该调用c.Disconnect()
,firstConnectHandler
以便在建立第二组连接之前完全关闭初始连接。您还需要将其存储在publisher
某处,以便同时断开该连接。
注意:我很难理解你为什么要这样做。建立初始连接以检索证书似乎会降低系统的整体安全性。标准方法是给每个客户端一个唯一的证书,然后使用代理上的 ACL 来应用任何必要的限制。对于许多代理,您可以在 ACL 中使用证书公用名(从而消除对第二个连接的需要)。
- 1 回答
- 0 关注
- 926 浏览
添加回答
举报