2013-09-27 358 views
12

有什麼方法可以從其他客戶端找到有關所有連接的客戶端詳細信息(IP &名稱)?我知道有一個話題「$ SYS/broker/clients/active」給出了當前連接的客戶端的數量,但如果我想知道更多關於每個連接的客戶端,有什麼辦法嗎?如何查找連接的MQTT客戶端詳細信息

我正在開發一個解決方案,其中客戶端的數量將連接到(使用無線網絡)到位於服務器上的MQTT代理。我還會在同一臺機器上運行另一個客戶機,並連接到代理,以觀察是否有任何與代理連接的新客戶或獲取斷開連接的客戶機。當新客戶端連接或連接的客戶端斷開連接時,我可以在代理控制檯上看到消息。我們可以從連接到經紀商的客戶那裏得到類似的東西嗎?請提出什麼是實現這一目標的最佳方式?

在此先感謝。

-Dilip

+0

你可以添加一些關於你正在使用的工具的更多細節嗎?細節問題非常簡單。 – ralight

+0

你所要求的那種事情將會是特定於實現的 - MQTT協議不提供這個;因此有關你正在使用哪些工具/客戶/經紀人的問題。 – knolleary

+0

感謝羅傑和Knolleary的迴應。 我在路由器上使用c-client,它將通過互聯網和服務器上的一個python客戶端(代理安裝位置)連接到位於遠程位置的代理。在任何時間點都可以有n個路由器。現在,如果路由器的n/w失效,代理將斷開該客戶端,此時我想告訴路由器的用戶(通過使用谷歌API的電子郵件)他/她的n/w已關閉。希望這給你一些見解,讓我知道你是否需要進一步的細節。 – Dilip

回答

20

你原來的問題,對後續問題的迴應也不能確定您正在使用哪種代理實施方式。因此,您的問題可能會有更高效的答案。

沒有這些信息,讓我們關注一下你在協議本身可以做什麼。

MQTT支持RETAINED消息。這是經紀人將針對每個主題存儲最近保留的消息的地方。當客戶訂閱該主題時,它將收到保留的消息(如果存在)。

還有最後一個遺囑和遺囑(LWT)功能(goetzchr指的是),可以用來代表客戶端發佈消息,如果它異常斷開連接。

結合這兩個功能,您可以在代理上構建一個簡單的狀態服務,所有這些都在協議內部。它的工作原理是這樣的:

  1. 當客戶端連接

    ,它發佈所保持的消息,唯一給它一個主題,例如:

    clients/my_client_id/state

    1有效載荷。 (用my_client_id代替客戶自己的ID。

  2. 它還在連接時將LWT消息設置爲發佈到同一主題,但有效載荷爲0。這也應該是一個RETAINED消息。

  3. 當客戶端斷開乾淨
  4. ,它發佈一個已保留消息的相同話題的0

這允許有效載荷的另一個客戶端訂閱clients/#接收所有指示在客戶機中的改變中的消息'連接狀態(標識客戶端的完整主題以及指示連接狀態的有效負載的值)。

爲了獲得不僅僅是連接狀態的更多信息,客戶可以發佈另一消息保留在連接到另一個話題,如clients/my_client_id/info包含所有你感興趣的信息。

這隻能如果您控制所有連接到您的經紀人的客戶,並能夠讓他們表現得像這樣。

這不是一個理想的方法;希望您的代理實施將提供一些服務器端的方法。

+0

謝謝Knolleary。我正在尋找這樣的東西。所以希望這將符合我的目的。也感謝大家的支持。 – Dilip

6

像Knolleary已經說明這是實現特定的,而不是由MQTT本身提供。

一種解決方案可能是使用HiveMQ MQTT broker。它有一個插件SDK,它允許你通過回調進行定製,這意味着每次客戶端連接,斷開連接,發送消息,訂閱一條消息,你就可以執行自定義代碼,就像發送電子郵件一樣。 編寫自定義代碼時,您可以訪問關於調用回調的客戶端的所有信息。所以實現你的行爲很容易。唯一的是你在哪裏存儲電子郵件地址?它是用戶名嗎?

有關編寫自定義插件HiveMQ更多信息,請參閱getting started guideexample plugin on GitHub

(披露:我的HiveMQ開發商之一)

乾杯, 克里斯

+0

感謝您的建議Goetzchr。 電子郵件地址將存儲在數據庫中,當客戶端與代理成功連接時,它將發佈在代理計算機上運行的所有Python客戶端的詳細信息,以獲取並將其插入到數據庫中。我不確定我們是否想在這個時候進入HiveMQ,因爲我們已經使用MQTT代理進行了相當多的開發。我的主要目標是以某種方式通知Python客戶端何時與特許客戶斷開連接。我們已經有了另一個模塊,負責將電子郵件發送到所需的電子郵件地址。 – Dilip

+1

好的,我認爲可能的解決方案是使用MQTT的遺囑和遺囑功能。這使您能夠在客戶端意外斷開連接時向主題發送消息。主題和消息可以在連接消息中爲每個客戶單獨指定。 –

+0

感謝Goetzchr。我正在尋找這樣的東西。 – Dilip