天天看點

MQTT協定實作Android中的消息收發

MQTT協定實作Android中的消息收發

前言

MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸),基于釋出/訂閱範式的消息協定,是一種極其簡單和輕量級的消息協定,專為受限裝置和低帶寬、高延遲或不可靠的網絡設計。今天主要說明一下MQTT協定在Android中進行消息的收發應用,關于MQTT協定的基礎内容請參考之前介紹的 MQTT協定 相關内容。

效果

使用前先檢視一下簡單的效果圖,MQTT相關的連接配接、訂閱,發送及接收:

使用過程

依賴添加

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'

implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

實際使用中發現,如果僅用第一條依賴也是能夠實作我們所需要的的消息收發功能的,其中MqttClient類實作了MQTT相關的連接配接、訂閱、發送及接收功能,第二條依賴是基于MqttClient針對Android用戶端進行封裝了MqttAndroidClient進行使用,其中實作了Android相關的廣播、服務相關内容。

使用中如果采用的是Androidx開發環境,還需要添加如下依賴,否則MqttAndroidClient服務中會找不到本地廣播服務,導緻無法運作使用。

implementation 'androidx.legacy:legacy-support-v4:1.0.0'

權限添加

服務添加

這裡我們主要介紹MqttClient類實作的MQTT協定消息的收發,而進一步封裝的MqttAndroidClient和其使用過程基本類似,想要檢視其具體使用,可跳轉對應Demo連結擷取詳細内容。

初始化MQTT用戶端内容,代理伺服器broker選用的 HiveMQ公共代理 來實作:

public void initClient() {

try {
    MemoryPersistence persistence = new MemoryPersistence();
    // 設定唯一用戶端ID
    clientId = clientId + System.currentTimeMillis();
    //設定訂閱方訂閱的Topic集合,遵循MQTT的訂閱規則,可以是多級Topic集合
    final String topicFilter = topic;
    //服務品質,對應topicFilter
    final int qos = 0;
    //建立用戶端
    sampleClient = new MqttClient(broker, clientId, persistence);
    //配置回調函數
    sampleClient.setCallback(new MqttCallbackExtended() {
        @Override
        public void connectComplete(boolean reconnect, String serverUri) {
            setTextInfo("connectComplete: " + serverUri);
            try {
                //連接配接成功,需要上傳用戶端所有的訂閱關系
                sampleClient.subscribe(topicFilter, qos);
            } catch (MqttException e) {
                setTextInfo("subscribeException: " + e.getMessage());
            }
        }

        @Override
        public void connectionLost(Throwable cause) {
            setTextInfo("connectionLostException: " + cause.getMessage());
        }

        @Override
        public void messageArrived(String topic, MqttMessage message) {
            setTextInfo("messageArrived:" + new String(message.getPayload()));
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken token) {
            setTextInfo("deliveryComplete");
        }
    });
    //建立連接配接選擇
    MqttConnectOptions connOpts = createConnectOptions(userName, passWord);
    setTextInfo("Connecting to broker: " + broker);
    //建立服務連接配接
    sampleClient.connect(connOpts);
} catch (MqttException me) {
    setTextInfo("initException: " + me.getMessage());
}           

}

建立連接配接選擇如下,可設定使用者名、密碼:

private MqttConnectOptions createConnectOptions(String userName, String passWord) {

MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
connOpts.setUserName(userName);
connOpts.setPassword(passWord.toCharArray());
connOpts.setAutomaticReconnect(true);
// 設定連接配接逾時時間, 機關為秒,預設30
connOpts.setConnectionTimeout(30);
// 設定會話心跳時間,機關為秒,預設20
connOpts.setKeepAliveInterval(20);
return connOpts;           

消息釋出:

public void publishMsg() {

String content = mEtMessage.getText().toString().trim();
if (TextUtils.isEmpty(content)) {
    content = "Hello MQTT ";
}
//此處消息體需要傳入byte數組
MqttMessage message = new MqttMessage(content.getBytes());
//設定品質級别
message.setQos(0);
try {
    if (sampleClient != null && sampleClient.isConnected()) {
        /*
         * 消息發送到某個主題Topic,所有訂閱這個Topic的裝置都能收到這個消息。
         * 遵循MQTT的釋出訂閱規範,Topic也可以是多級Topic。此處設定了發送到一級Topic。
         */
        sampleClient.publish(topic, message);
        setTextInfo("publishMsg: " + message);
    }
} catch (MqttException e) {
    setTextInfo(" publishException: " + e.getMessage());
}           

連接配接斷開:

public void disconnect() {

try {
    sampleClient.disconnect();
} catch (MqttException e) {
    setMqttMessage("disconnectException: " + e.getMessage());
}           

MQTT協定實作Android中的消息收發就到這裡了,内容已上傳至Github開發記錄,歡迎點選查閱及Star,我也會繼續補充其它有用的知識及例子在項目上。

原文位址

https://www.cnblogs.com/jqnl/p/12660824.html

繼續閱讀