使用 Android 开发 MQTT 客户端
MQTT 代表消息隊列遙測傳輸,它是一種功能強大的消息傳輸協議,主要用于機器對機器 (M2M) 和物聯網 (IoT) 通信上下文。 MQTT 在這些情況下是首選,因為它易于實施,并且非常適合資源有限的設備。
在本文中,我們將開發一個使用 MQTT 協議的 Android 移動應用程序。
MQTT vs HTTP
MQTT 的競爭對手是舊的、但金子般的 HTTP 協議。
但是,為什么要為您的項目選擇 MQTT 協議呢?
下面是一個簡短的比較表,以更好地闡明主要方面:
綜上所述,MQTT 相比 HTTP 更簡單、更小、更安全。
MQTT 簡而言之
MQTT 是一種發布-訂閱客戶端-服務器消息傳輸協議。
讓我們明確一下發布-訂閱和客戶端-服務器架構的含義。
發布訂閱
在發布/訂閱架構中,發送者(發布者)不直接將消息傳輸給特定的接收者(訂閱者),而是將發布的消息分類為“類別”(稱為主題),而不知道可能有哪些訂閱者。
發布者和訂閱者從不直接相互聯系。它們之間的連接由稱為代理的第三個組件處理。
現實生活中發布/訂閱模式的一個實際例子可能是報紙:記者(出版商)在報紙(經紀人)上寫了幾篇文章,但他們不知道有多少讀者(訂閱者)會閱讀那篇文章。
客戶端服務器
在客戶端-服務器架構中,客戶端連接到服務器以使用服務。
在 MQTT 上下文中,MQTT 客戶端是通過網絡連接到 MQTT 代理的設備。 MQTT 代理(服務器)提供的服務是發布和/或訂閱一個或多個主題的可能性。在 MQTT 中,客戶端可以是發布者和訂閱者或兩者兼而有之。
連接
在開始主題上的消息交換之前,客戶端需要通過向代理發送 CONNECT 消息來啟動通信。
通過此消息,客戶端將自己呈現給提供以下主要信息的代理:
-
ClientID
ClientID 是代理用來標識客戶端并存儲有關它的信息(稱為會話)的唯一 ID。
空的 ClientID 意味著“匿名”連接:因此,代理不會記住有關客戶端的任何信息。
-
CleanSession
如果 CleanSession 設置為 false 并且代理存儲了該客戶端的信息,則代理使用現有會話并將先前排隊的消息傳遞給客戶端。
相反,如果該標志設置為 true,則意味著丟棄該客戶端的所有現有會話和消息(如果 ClientId 為空,則為必需)。
-
KeepAlive
此間隔以秒為單位表示,定義了代理和客戶端可以在不發送消息的情況下保持聯系的最長時間。 客戶端需要在 KeepAlive 期間定期向代理發送 PING 消息以保持連接處于活動狀態。
-
Username and Password(可選)
客戶端可以發送用戶名和密碼以提高通信安全性。
-
WillMessage (可選)
客戶端可以以 MQTT 消息和主題的形式指定其最后的遺囑消息。當客戶端“嚴重”斷開連接時,代理將代表客戶端發送此消息。
主題
如前所述,MQTT 代理使用主題來決定哪個訂閱者接收哪個消息。
客戶端在使用主題之前不會創建主題。服務器接受每個有效主題而無需任何初始化。
主題是具有以下特征的字符串:
- 長度至少為 1 個字符
- 區分大小寫
- 由一個或多個以“/”分隔的級別組成
假設您的房子周圍散布著溫度傳感器。這些傳感器使用 MQTT 與恒溫器通信,恒溫器使用此信息來調節家庭供暖系統。
每個傳感器(發布者)通過發布特定的 MQTT 主題來傳達其溫度,恒溫器(訂閱者)通過檢查這些主題來監控溫度;下面是主題結構的示例:
發布
訂閱
退訂
Android 開發MQTT
示例/簡單的 MQTT Android 應用程序
連接到 MQTT 代理
向代理發布主題
從代理訂閱主題
斷開連接
源代碼
詳情參閱 - 亞圖跨際
總結
以上是生活随笔為你收集整理的使用 Android 开发 MQTT 客户端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP幂等性概念和应用
- 下一篇: 获取Android手机短信中心号码