Android Q 接入 MQTT
首先在APP 下引入mqtt的庫
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'
創建一個MQTT連接的實體類
package com.example.iot.bean;
/**
* @TODO MQTT 連接實體類
* @Create by: wjw
* @Create time: 2020/2/8 11:26
*/
public class MQTTentity {
//以下請自己配置否則MainActivity中button_login的監聽會有問題
private String host;
private String userName;
private String passWord;
private String[] timeTopic;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String[] getTimeTopic() {
return timeTopic;
}
public void setTimeTopic(String[] timeTopic) {
this.timeTopic = timeTopic;
}
public MQTTentity() {
}
public MQTTentity(String host, String userName, String passWord, String[] timeTopic) {
this.host = host;
this.userName = userName;
this.passWord = passWord;
this.timeTopic = timeTopic;
}
@Override
public String toString() {
return "MQTTentity{" +
"host='" + host + '\'' +
", userName='" + userName + '\'' +
", passWord='" + passWord + '\'' +
", timeTopic='" + timeTopic + '\'' +
'}';
}
}
然后在activity中寫主邏輯
//我們自己新建的MQTT實體類
private MQTTentity mqttentity;
private MqttClient client;
private MqttConnectOptions options;
//以下兩個聲明目的是為了實現MQTT消息在testview刷新
private ScheduledExecutorService scheduler;
private Handler handler;
在onCreate方法中
handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg.what == 1) {
Toast.makeText(MonitorAct.this, (String) msg.obj, Toast.LENGTH_SHORT).show();
} else if (msg.what == 2) {
MqttToast.setVisibility(View.GONE);
try {
client.subscribe(mqttentity.getTimeTopic()); //訂閱主題“timeTopic”
Toast.makeText(MonitorAct.this, "場景已成功接入服務器", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
} else if (msg.what == 3) {
MqttToast.setVisibility(View.VISIBLE);
Toast.makeText(MonitorAct.this, "接入服務器失敗,務必確保網絡正常,系統正在重連,請稍后...", Toast.LENGTH_LONG).show();
}
return false;
}
});
mqtt連接
// MQTT 訂閱主題
String[] topics = new String[1];
topics[0] = "/wjw";
mqttentity = new MQTTentity("tcp://127.0.0.1:1888", "admin", "admin", topics);
initMQTT(mqttentity);
startReconnect();
/**
* @TODO 獲取手機imei
* @Create by: wjw
* @Create time: 2020/2/8 11:27
*/
public static String getIMEI(Context context, int slotId) {
try {
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Method method = manager.getClass().getMethod("getImei", int.class);
String imei = (String) method.invoke(manager, slotId);
return imei;
} catch (Exception e) {
return "";
}
}
/**
* @TODO MQTT初始化
* @Create by: wjw
* @Create time: 2020/2/8 12:08
*/
private void initMQTT(MQTTentity mqtTentity) {
// 獲取手機IMEI作為clientId
String imei = getIMEI(MonitorAct.this, 0);
// HOST為主機名
try {
client = new MqttClient(mqtTentity.getHost(), imei, new MemoryPersistence());
} catch (MqttException e) {
e.printStackTrace();
}
// MQTT連接設置
options = new MqttConnectOptions();
// 設置是否清空session,如果是false則表示服務器保留客戶端連接記錄
options.setCleanSession(true);
// 設置連接的用戶名
options.setUserName(mqtTentity.getUserName());
// 設置連接的密碼
options.setPassword(mqtTentity.getPassWord().toCharArray());
// 設置超時時間,單位為秒
options.setConnectionTimeout(10);
// 設置會話間心跳時間,單位為秒,服務器每隔1.5*20向客戶端發消息確認
options.setKeepAliveInterval(20);
// 設置回調
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
// 連接丟失后,一般在這里進行重連
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
// subscribe后,得到的消息會執行到這里
Message msg = new Message();
msg.what = 1;
msg.obj = message.toString();
handler.sendMessage(msg);
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
// publish后,會執行這里
}
});
}
/**
* @TODO MQTT建立連接及重連
* @Create by: wjw
* @Create time: 2020/2/8 11:48
*/
private void startReconnect() {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if (!client.isConnected()) {
connect();
}
}
}, 0, 10 * 1000, TimeUnit.MILLISECONDS);
}
/**
* @TODO MQTT連接狀態鑒別
* @Create by: wjw
* @Create time: 2020/2/8 11:51
*/
private void connect() {
new Thread(new Runnable() {
@Override
public void run() {
try {
client.connect(options);
Message msg = new Message();
msg.what = 2;
handler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
Message msg = new Message();
msg.what = 3;
handler.sendMessage(msg);
}
}
}).start();
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
scheduler.shutdown();
client.disconnect();
} catch (MqttException e) {
e.printStackTrace();
}
}