下载
org.eclipse.paho.client.mqttv3.jar 下载地址
https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/
选则一个
简单使用(客户端)
0.变量
MqttClient mqttClient;
EditText editText;
static String HOST="tcp://192.168.0.204:1883";//服务端地址,端口
static String CLIENT_ID="androidd",TAG="TAG";//CLIENT_ID 服务端标识 TAG 打印日志信息
MqttConnectOptions mqttConnectOptions;
1.初始化
private void init() {
try {
mqttClient=new MqttClient(HOST,CLIENT_ID,new MemoryPersistence());
mqttConnectOptions=new MqttConnectOptions();
} catch (MqttException e) {
e.printStackTrace();
}
}
2.连接服务端
mqttClient.connect(mqttConnectOptions);
3.订阅和取消订阅 editText.getText().toString().trim() 获取要订阅的 标题(可以看成一个订阅的id标识)
public void oncick(View view) {
if (editText.getText().toString().trim().equals("")||editText.getText().toString().trim()==null)return;
switch (view.getId()){
case R.id.button2://订阅
try {
Log.i(TAG, "oncick: "+editText.getText().toString().trim());
// mqttClient.subscribe(editText.getText().toString().trim(),1);
// 1 表示一级订阅 服务器只发 2 表示二级订阅 客户端会响应一个信息告诉服务器 3. 表示三级订阅 三次握手 和tcp一样
mqttClient.subscribe(editText.getText().toString().trim(),1);
} catch (MqttException e) {
e.printStackTrace();
}
break;
case R.id.button3://取消订阅
try {
mqttClient.unsubscribe(editText.getText().toString().trim());
} catch (MqttException e) {
e.printStackTrace();
}
break;
case R.id.button4://连接
try {
mqttClient.connect(mqttConnectOptions);
dy();
} catch (MqttException e) {
e.printStackTrace();
}
break;
}
}
4.获取订阅内容
扫描二维码关注公众号,回复:
15848231 查看本文章
private void dy() {
new Thread(new Runnable() {
@Override
public void run() {
mqttClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable throwable) {
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
String data="订阅标题:"+s+" -- 级别:"+mqttMessage.getQos()+" -- 订阅内容:"+ new String(mqttMessage.getPayload(),"utf-8");
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
Log.i(TAG, "deliveryComplete: "+"222222");
}
});
while (true){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
注意点(报错)
1.要重复接收订阅数据,要阻塞方法。(解决只能接收一次订阅信息的方法)
private void dy() {
new Thread(new Runnable() {
@Override
public void run() {
mqttClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable throwable) {
Log.i(TAG, "deliveryComplete: "+"0000000");
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
String data="订阅标题:"+s+" -- 级别:"+mqttMessage.getQos()+" -- 订阅内容:"+ new String(mqttMessage.getPayload(),"utf-8");
Log.i(TAG, "messageArrived: "+"1111111111");
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
Log.i(TAG, "deliveryComplete: "+"222222");
}
});
while (true){
//阻塞方法
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
2.接收的数据是byte类型
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
String data="订阅标题:"+s+" -- 级别:"+mqttMessage.getQos()+" -- 订阅内容:"+ new String(mqttMessage.getPayload(),"utf-8");
}
3.报错URL地址格式不对
//正确的格式 tcp://xxxx:xxx
static String HOST="tcp://192.168.0.204:1883";
完整的代码(Android 客户端 简单的)
package com.example.lzz.mqttclient;
import android.media.TimedText;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class MainActivity extends AppCompatActivity {
MqttClient mqttClient;
EditText editText;
static String HOST="tcp://192.168.0.204:1883";
static String CLIENT_ID="androidd",TAG="TAG";
MqttConnectOptions mqttConnectOptions;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.textView6);
editText=findViewById(R.id.editText2);
init();
}
private void init() {
try {
mqttClient=new MqttClient(HOST,CLIENT_ID,new MemoryPersistence());
mqttConnectOptions=new MqttConnectOptions();
} catch (MqttException e) {
e.printStackTrace();
}
}
private void dy() {
new Thread(new Runnable() {
@Override
public void run() {
mqttClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable throwable) {
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
String data="订阅标题:"+s+" -- 级别:"+mqttMessage.getQos()+" -- 订阅内容:"+ new String(mqttMessage.getPayload(),"utf-8");
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
while (true){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
public void oncick(View view) {
if (editText.getText().toString().trim().equals("")||editText.getText().toString().trim()==null)return;
switch (view.getId()){
case R.id.button2:
try {
Log.i(TAG, "oncick: "+editText.getText().toString().trim());
mqttClient.subscribe(editText.getText().toString().trim(),1);
} catch (MqttException e) {
e.printStackTrace();
}
break;
case R.id.button3:
try {
mqttClient.unsubscribe(editText.getText().toString().trim());
} catch (MqttException e) {
e.printStackTrace();
}
break;
case R.id.button4:
try {
mqttClient.connect(mqttConnectOptions);
dy();
} catch (MqttException e) {
e.printStackTrace();
}
break;
}
}
}