1 回答

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
基于對(duì)您的代碼的快速審查,這就是我認(rèn)為正在發(fā)生的事情(因?yàn)槟鷽](méi)有提供所有代碼,所以涉及一些猜測(cè)):
main()
調(diào)用InitializeBroker
創(chuàng)建兩個(gè)到代理的連接。默認(rèn)發(fā)布處理程序設(shè)置為firstPubHandler
并在OnConnect
您訂閱的處理程序中SubClientId+"/id/Certificate
當(dāng)接收到消息 ( ) 時(shí),您從消息中獲取證書(shū)并使用它與使用相同客戶端 ID 但不同/default 發(fā)布處理程序
firstPubHandler
的代理建立一組新連接。OnConnect
因此,在第 2 點(diǎn)之后,您實(shí)際上有兩組獨(dú)立的代理連接(總共 4 個(gè)連接)。但是MQTT-3.1.4-2
(參見(jiàn)規(guī)范)指出:
如果 ClientId 代表一個(gè)已經(jīng)連接到服務(wù)器的客戶端,那么服務(wù)器必須斷開(kāi)現(xiàn)有的客戶端。
因此,當(dāng)建立第二組連接時(shí),代理將丟棄第一組連接。這是您看到的“EOF”斷開(kāi)連接。第二組連接仍將啟動(dòng)。當(dāng)您connectLostHandler
對(duì)第一組和第二組連接使用相同的連接時(shí),您無(wú)法在日志中看到哪個(gè)連接被終止。
總之,我相信您的代碼確實(shí)有效。但是,您可能應(yīng)該調(diào)用c.Disconnect()
,firstConnectHandler
以便在建立第二組連接之前完全關(guān)閉初始連接。您還需要將其存儲(chǔ)在publisher
某處,以便同時(shí)斷開(kāi)該連接。
注意:我很難理解你為什么要這樣做。建立初始連接以檢索證書(shū)似乎會(huì)降低系統(tǒng)的整體安全性。標(biāo)準(zhǔn)方法是給每個(gè)客戶端一個(gè)唯一的證書(shū),然后使用代理上的 ACL 來(lái)應(yīng)用任何必要的限制。對(duì)于許多代理,您可以在 ACL 中使用證書(shū)公用名(從而消除對(duì)第二個(gè)連接的需要)。
- 1 回答
- 0 關(guān)注
- 1031 瀏覽
添加回答
舉報(bào)