2016-08-12 46 views
0

的問題是已經發布,Mqtt How a client can get to know that another client is connected or notHow to Find Connected MQTT Client DetailsMQTT知道,如果一個客戶端訂閱

在我的情況下,如果客戶端X是在通道A已經訂閱,客戶端Y不能SUBCRIBE到通道A,直到X取消提交。我只能在頻道中訂閱一個客戶端

我還可以使用保留消息和LWT的想法嗎?

如果是,我不知道從哪裏開始。從一個簡單的例子開始,看看保留的消息和LWT是如何工作的,這將是一件好事。到目前爲止,我只有在發佈和訂閱方面的經驗,但沒有更多。

請問,請告訴我一些建議可能是一些鏈接或示例或任何有用的信息,所以我可以有一個出發點。

我使用paho在java中進行編程。

預先感謝您!

+0

你爲什麼只想要一個用戶? – hardillb

+0

,因爲客戶想要。這個想法是有不同的溝通類型:一個發佈者/一個客戶端,許多發佈者/許多客戶端。因此,有渠道只能有一個用戶,而且,我可以發佈相同的數據,但在不同的渠道,允許更多的用戶。通道溫度只接受一個用戶,而溫度很多 – andreahg

回答

2

MQTT主要是讓多個客戶端訂閱相同的主題,它是整個發佈/訂閱模式的一部分並共享信息。因此,協議中沒有任何東西可以滿足您的需求。

您可以實現類似下面的:

如果有一個話題說foo/bar而您只需要一個用戶,你可以發佈一個保留信息與用戶的客戶端ID的有效載荷lock/foo/bar 。然後,當您斷開連接並設置LWT以在客戶端死亡的情況下執行相同操作時,您可以向該鎖定主題發佈「免費」。

這樣做的問題是,所有內容都是異步的,所以它爲競爭條件打開了大量的時間窗口。例如說client-1client-2都希望訂閱foo/bar,他們都需要先訂閱lock/foo/bar來檢查它的狀態。他們都在幾乎同一時間這樣做,然後他們必須等待一段時間才能看到他們收到什麼消息(「免費」或客戶端ID)。他們都會得到「免費」,所以他們都假設他們可以發佈他們的客戶id。 client-1首先不久後發佈client-2然後他們都訂閱foo/bar

+0

您好hardillb,是的,你是對的問題。但是,那可能是一個好的選擇?在另一篇文章中,我讀了關於向頻道發送訂閱事件。那麼我想,如果有人想訂閱,他需要知道是否已經訂閱事件 – andreahg

+0

基本上我想說這不可能與MQTT – hardillb

+0

哦不! ...以及我想我唯一的選擇是保留的消息和lwt,但我不知道我將如何克服這個問題,至少避免同時訂閱:/。你知道我在哪裏可以找到使用保留消息的小實現,我在hivemq.com上閱讀,但我找不到 – andreahg