1. 程式人生 > >Android網路開發回顧之旅 ① 在Android手機整合使用MQTT協議 ,實現搞掂移動控制硬體端。(附帶Demo)

Android網路開發回顧之旅 ① 在Android手機整合使用MQTT協議 ,實現搞掂移動控制硬體端。(附帶Demo)

一、認識MQTT協議。

如果你對MQTT協議的連線過程不熟悉,那沒關係;請看我前面的8266硬體上介紹的MQTT介紹 ,其實也沒啥難,這個MQTT的好處是短小,資訊傳遞快捷 ,適合在有限的空間的硬體的開發,比如8266 , 或者其他通訊模組。

描述MQTT

二、新建Android專案,整合MQTT的架包。

  • 我是用AndroidStudio工具開發的,所以整合比較簡單,我也強烈推薦大家去使用AS 。
  • 第一步:找到eclipse下開源的專案GitHub地址 ,因為AS是grdle來編譯的,所以在您新建的工程下的build.gradle下的目錄加進以下程式碼:
repositories {
    maven {
        url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
    }
}

這裡寫圖片描述

  • 第二步:在你的APP的模組下的build.gradle ,新增依賴 ,目前最新版3.1.1:
    compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
    compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

這裡寫圖片描述

  • 第三步:在你的清單檔案加上,MQTT所依賴的服務和許可權:

  <!-- Permissions the Application Requires -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
/>
<!--<uses-permission android:name="android.permission.READ_PHONE_STATE" />--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <service android:name="org.eclipse.paho.android.service.MqttService"/>

這裡寫圖片描述

三、開始你的程式碼。

注意必須要初始化客戶端,才可以訂閱主題和釋出訊息操作!否則異常 !

  • ① 初始化客戶端和連線選項。MqttAndroidClient 類是整個連線的核心 , 而MqttConnectOptions 是連線的選項配置。
    //客戶端
     private MqttAndroidClient client;

    //連線選項
    private MqttConnectOptions mqttConnectOptions;


 //第一個引數上下文,第二個伺服器地址,注意下面的格式!!!! 第三個是 客戶端ID,注意 必須唯一,如果存在此ID連線了伺服器。那麼連線失敗!
       client = new MqttAndroidClient(this, "tcp://iot.eclipse.org:1883", "androidID");

        //配置連線資訊
         mqttConnectOptions=new MqttConnectOptions();
        //是否清除快取
        mqttConnectOptions.setCleanSession(true);
        //是否重連
        mqttConnectOptions.setAutomaticReconnect(true);
        //設定心跳,30s
        mqttConnectOptions.setKeepAliveInterval(30);
        //登陸的名字,根據伺服器要求,一般不用寫
        mqttConnectOptions.setUserName("xuhong");
        //登陸的密碼,
        mqttConnectOptions.setPassword("123545".toCharArray());
        //超時時間
        mqttConnectOptions.setConnectionTimeout(30);
        //監聽伺服器發來的 資訊
        client.setCallback(new MqttCallback() {
            @Override
            public void connectionLost(Throwable cause) {
                //連線丟失異常
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                //收到伺服器的資訊

            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {

            }
        });
  • ② 開始連線伺服器,當然你可以不用監聽,如果不丟擲異常,也是連線成功啦!

如果您的伺服器是沒有賬號密碼登陸的話,那麼可以不用第二個引數;
如果你的伺服器是有賬號密碼的,請參考以下方法,中間傳個 null ,切記切記 !本工程的下載的Demo是沒有的!

   //開始連線伺服器
        try {
            client.connect(mqttConnectOptions, null , new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                       //連線成功
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                     //連線失敗
                }
            });

        } catch (MqttException e) {
            e.printStackTrace();
            //連線失敗
        }
  • ③ 訂閱資訊!,主題是 /xuhong , 質量是0 。
      try {
            client.subscribe("/xuhong", 0, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    tvShow.setText("訂閱成功!");
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    tvShow.setText("訂閱失敗!" + exception);
                }
            });
        } catch (MqttException e) {
            e.printStackTrace();
        }
  • ④ 釋出資訊,主題是 /xuhong ,質量是0資訊是 hello xuhong 。
    MqttMessage mqttMessage = new MqttMessage();
        mqttMessage.setPayload("hello xuhong".getBytes());

        try {
            client.publish("/xuhong", mqttMessage, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    tvShow.setText("釋出訊息成功");
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    tvShow.setText("釋出訊息失敗");
                }
            });
        } catch (MqttException e) {
            e.printStackTrace();
            tvShow.setText("釋出訊息失敗");
        }

這裡寫圖片描述