Android Studio MQTT功能
阿新 • • 發佈:2018-12-21
使用的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屏到了在折騰下,其實,本來是打算整合一下百度的語音控制的,那程式碼有的看不懂,程式碼又多,暫時打退堂鼓了,等閒得無聊的時候在試試。先把弄了的寫在這裡記著,方便以後自己查詢。再次說明,偶是菜鳥,偶是菜鳥,偶是菜鳥!!!