Android網路開發回顧之旅 ① 在Android手機整合使用MQTT協議 ,實現搞掂移動控制硬體端。(附帶Demo)
阿新 • • 發佈:2019-01-05
一、認識MQTT協議。
如果你對MQTT協議的連線過程不熟悉,那沒關係;請看我前面的8266硬體上介紹的MQTT介紹 ,其實也沒啥難,這個MQTT的好處是短小,資訊傳遞快捷 ,適合在有限的空間的硬體的開發,比如8266 , 或者其他通訊模組。
二、新建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("釋出訊息失敗");
}