1. 程式人生 > >Android Studio MQTT功能

Android Studio MQTT功能

使用的Android Studio版本為3.0.1,沒辦法,升級到3.2.1後弄不出來了,又下了個3.0的綠色版,反正自己用又不考慮使用者感受啥的,能實現我想要的功能能在我手機上跑就OK。 首先是APP下build.grdle檔案:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion '26.0.2'
    defaultConfig {
        applicationId "com.example.administrator.kongzhiqi"
minSdkVersion 10 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile
('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' })
compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8' compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1' compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.orhanobut:logger:2.1.1' compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5' testCompile 'junit:junit:4.12' }

然後是專案下的build.grdle檔案

buildscript {
    repositories {
        jcenter()
        maven {
            url "https://repo.eclipse.org/content/repositories/paho-releases/"
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

最後在AndroidManifest.xml中加入許可權:

<!-- 執行許可權 -->
    <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" />

註冊服務(呢嗎,在3.2版本中死活註冊不了):

<!-- Mqtt 服務 -->
        <service android:name="org.eclipse.paho.android.service.MqttService" />

接下來就可以寫邏輯程式碼了,先定義mqtt要用到的配置引數

    private String topic = "訂閱主題";
    private String user = "使用者名稱";
    private String pass = "密碼";
    private String host = "mqtt伺服器地址,tcp://xxx:1883";
    private String clientId = "傳送訊息的ID";
    private String clientId1 = "接收訊息的ID,不要與傳送ID一樣";
    private int qos = 0; //訊息等級

建立MQTT連線傳送訊息

                //訊息快取方式,記憶體快取
                MemoryPersistence persistence = new MemoryPersistence ();
                 try {
                    //建立客戶端
                    MqttClient sampleClient = new MqttClient (broke,clientId,persistence);
                    //連線的配置引數
                    MqttConnectOptions connectOptions = new MqttConnectOptions ();
                    connectOptions.setCleanSession (true);  //不記憶上次會話
                    connectOptions.setUserName (user); //使用者名稱
                    connectOptions.setPassword (pass.toCharArray ()); //密碼
                    connectOptions.setConnectionTimeout(30);  //超時時間
                    connectOptions.setKeepAliveInterval(60); //心跳時間,單位秒
                    connectOptions.setAutomaticReconnect(true);//自動重連
                    System.out.println ("connecting to broker" );
                    //連線伺服器
                    sampleClient.connect (connectOptions);
                    //用Gson框架建立要傳送的json字串
                    esp8266 a1 = new esp8266("0001", "01", "qidong");
                   Gson gson = new Gson();
                   String json = gson.toJson(a1);
                    //建立訊息
                    MqttMessage message = new MqttMessage (json.getBytes ());
                    //設定訊息傳送等級
                    message1.setQos (qos);
                    //釋出訊息
                    sampleClient.publish (topic,message);
                    //斷開連線
                    sampleClient.disconnect ();
                   // System.exit (0);//關閉UI程序
                } catch (MqttException e) {
                    e.printStackTrace ();
                }

MQTT接受訊息

         //訊息快取方式,記憶體快取
          MemoryPersistence persistence = new MemoryPersistence ();
         //clientId1 引數不能與發信端一樣
         MqttAndroidClient androidClient = new MqttAndroidClient(getApplicationContext(), host, clientId1, persistence);
          //連線的配置引數
          MqttConnectOptions options = new MqttConnectOptions();
        options.setAutomaticReconnect(true);
        options.setCleanSession(true);
        options.setUserName(user);
        options.setPassword(pass.toCharArray());
        options.setConnectionTimeout(30);
        options.setKeepAliveInterval(60);
        try {
            //這個程式碼啟動後一直執行
            androidClient.connect(options);
        } catch (MqttException e) {
            e.printStackTrace();
        }
        androidClient.setCallback(new MqttCallbackExtended() {
            @Override
            public void connectComplete(boolean reconnect, String serverURI) {
                //連線成功
                subscribeToTopic();
            }

            @Override
            public void connectionLost(Throwable cause) {
                 //連線中斷
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
               //訊息到達
                startNotification(message);
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                 //接收完成
            }
        });
    }
    private void subscribeToTopic() {
        try {
            androidClient.subscribe("topic", qos, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    //成功收到訊息
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                       //接收訊息失敗
                }
            });
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

     private void startNotification(MqttMessage message) {
        //收到的資訊
        String info = message.toString();
        //把json字串轉為java物件
        Gson gson = new Gson();
        esp8266_shou a2 = gson.fromJson(info, esp8266_shou.class);
       //這裡就寫收到資訊的業務邏輯
    }

這個程式碼能在8.0系統上跑,寫了個控制8266的APP,先就這樣把,等雙11買的繼電器模組和oled屏到了在折騰下,其實,本來是打算整合一下百度的語音控制的,那程式碼有的看不懂,程式碼又多,暫時打退堂鼓了,等閒得無聊的時候在試試。先把弄了的寫在這裡記著,方便以後自己查詢。再次說明,偶是菜鳥,偶是菜鳥,偶是菜鳥!!!