前言
MQTT訊息佇列遙測傳輸 (Message Queuing Telemetry Transport) 是一種建構在TCP/IP協議上,且基於發布/訂閱 (Publish/Subscribe) 模式的輕量級通訊協議,基於硬體效能低下的遠端裝置以及網路狀況糟糕的情況下而設計的發佈/訂閱型訊息協定。目前Amazon Web Services(AWS)在AWS IoT Core平台上支援HTTP、MQTT以及WebSocket通訊協定,AWS IoT Device SDK可讓裝置透過MQTT與AWS IoT Core平台進行連線、驗證和交換訊息,並且也能將資料透過Publish的方式傳送給手機端。
本文主要教導如何透過MQTT(基於客戶端和服務器之間的發佈/訂閱傳輸協議)作為資料傳遞的橋樑,將資料透過Publish的方式推播至手機端(圖一)。
(圖一) MQTT架構 |
介紹Android MQTT需要的參數
接下來介紹實作Android MQTT需要用到的參數,範例程式中使用的包含以下幾點:
- Topic:設定訂閱的主題名稱。
- Sever URI:MQTT Server的網址。
- Client ID:客戶端ID (Device ID)。
- Username & Password (Optional):用戶帳號及密碼,這部分在使用一些免費的MQTT Broker時不需要用到。
添加依賴、聲明權限以及開啟服務
- 添加依賴
開啟app目錄下“build.gradle (:app)”檔案,在dependencies中加入 “pahoMQTT”相關的依賴項目:
- 聲明權限
開啟“AndroidManifest.xml”檔案,並在檔案內加入MQTT相關權限:
- 開啟服務
“AndroidManifest.xml”檔案內加入下方圖片中MQTT Service的資訊,並且開啟服務:
介紹免費MQTT Broker
專案程式碼講解與說明
範例專案內將MQTT檔案分為Client端和Service端。
設定Client端的程式碼:
MQTT Client檔案內最主要的部分就是設定MQTT Client回調接口以及訂閱的功能。
宣告一個TAG,方便開發者在Logcat中觀看。設定MqttConnectOptions以及DisconnectedBufferOptions的屬性。
MqttConnectOptions中主要設定的屬性包含:
- isAutomaticReconnect():當client與server連線中斷時,是否要嘗試自動連線。
- isCleanSession():是否要在重新連線時清空session。
- connectionTimeout():設定連線超時的數值。
- keepAliveInterval():設定“保持喚醒”的間隔。
DisconnectedBufferOptions中主要設定的屬性包含:
- isBufferEnabled():是否開啟緩衝配置。
- bufferSize():離線後最多緩存100個單位。
- isPersistBuffer():是否要繼續留存。
- isDeleteOldestMessages():是否刪除舊訊息。
將連線及斷線的參數設定完成後,接下來設定MQTT Client回調接口以及訂閱的功能,而這幾項功能會在MQTTMessageService內調用:
MQTT Client回調接口:
回調接口需要使用到的參數包含“Context”、“Server URI”以及“Client ID”。
訂閱:
主要包括參數包含“Client”、“Topic”以及“QoS”。QoS為“Quality of Service”的縮寫,發送與接收端的一種保證交付訊息的協議,QoS分為三種等級,最多一次(0)、最少一次(1)以及只一次(2)。
介紹完MQTT Client的設定方式後,接下來介紹MQTT Message Service檔案。
先實現一個Service()的類別,並且宣告“MQTT Broker的網址”、“MqttClient”、“MqttAndroidClient”以及TAG。
接下來將connect的功能分為兩張圖片顯示:
透過調用MqttClient()中“getMqttClient”的功能,並且將“applicationContext”、“MQTT Broker網址”以及“Device ID”放入,再透過“.setCallBack”的功能設定監聽並且接收訊息以及調用“.subscribe”的功能訂閱MQTT的主題(主題名稱設定為“MQTT Test”,且將QoS設為0)。
而connect功能中最重要的一項功能為接收訊息,訂閱Topic後,透過MQTTLens(下一個章節會做介紹)做Publish的動作即可收到訊息,而“setMessageNotification”的功能主要是針對訊息彈出的功能。
其他設定程式碼:
要將所收到的訊息彈出需要用到以下功能:
其中比較需要注意的部分為“NotificationManager.IMPORTANCE_HIGH”的部分,下圖提供NONE、MIN、LOW、DEFAULT以及HIGH的個別功能,而此功能還包含設定彈出視窗的一些參數設定。
Google Chrome MQTTLens使用介紹與測試
MQTT 客戶端工具常用於建立與MQTT Broker 的連接,進行主題訂閱、消息收發等操作,客戶端工具如:Mqtt.fx、MQTTLens、MQTTX及mqtt-spy,我們選用MQTTLens工具與本文中的範例程式做驗證,範例程式使用的MQTT Broker為Mosquitto免費Broker,使用網址:“test.mosquitto.org”。
步驟一:
開啟Chrome線上應用程式商店,於「搜尋店內商品」中輸入MQTTLens,並且安裝下載。安裝完成後開啟MQTTLens,下方為MQTTLens介面:
步驟二:
按下左上角Connections的“+”按鈕,即會跳出下方畫面,並且在Connection name以及Hostname輸入“test.mosquitto.org”、Port的地方輸入“1883”,輸入完後按下CREATE CONNECTION按鈕即設定成功。
步驟三:
成功建立連線後,畫面會顯示出下方畫面。在Subscribe topic中輸入“MQTT Test”並且按下SUBSCIRBE按鈕即可完成訂閱動作。Publish topic中一樣輸入“MQTT Test”,於Message欄中輸入想要的訊息,按下PUBLISH按鈕後,手機即可收到通知(測試的過程將會呈現在影片中)。
小結
以實際產品應用案例「基於Qualcomm QCA4024的雙模全自動智能門鎖Turnkey 方案」來看,當智能門鎖開/關或被入侵,Gateway傳送資訊到雲端,雲端可透過MQTT傳輸方式通知手機端,如此當智能門鎖發生任何動作時,用戶能隨時收到門鎖最新狀況。
透過以上的教學,相信讀者對於MQTT已經有初步了解,Android MQTT開發教學以及配合MQTT Lens的使用即可測試Publish Notification的功能,影片會示範如何進行測試以及App開發成果,歡迎大家前往收看!
參考資料
MQTT維基百科:
https://zh.wikipedia.org/wiki/MQTT
MQTT Introduction:
https://ithelp.ithome.com.tw/m/articles/10198250
基於Qualcomm QCA4024 的雙模全自動智能門鎖Turnkey:https://www.wpgdadatong.com/IotNewsDetail?PID=5235
AWS MQTT:https://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/mqtt.html
MQTTLens - Chrome 線上應用程式商店- Google Chrome:
評論