1、项目根目录build.gradle中添加
allprojects {
repositories {
maven{ url "https://repo.eclipse.org/content/repositories/paho-snapshots/"}
}
}
2、在build.gradle中添加依赖:
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
3、mainfests清单文件中添加权限:
<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_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
4、mainfests中的application中添加应用:
<!-- Mqtt服务 -->
<service android:name="org.eclipse.paho.android.service.MqttService" />
5、为了方便管理,这里定义一个工具类MqttManager.java,相关MQTT的操作放在这里面
import android.content.Context;
import android.util.Log;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
/**
* Mqtt工具
*/
public class MqttManager {
//MQTT相关配置
//服务器地址(协议+地址+端口号)
private final static String HOST = "tcp://111.35.5.201:61613";
//用户名
private final static String USERNAME = "admin";
//密码
private final static String PASSWORD = "password";
//发布主题
public static String PUB_TOPIC = "pub";
//订阅主题
public static String SUB_TOPIC = "sub";
//服务质量,0最多一次,1最少一次,2只一次
private final static int QOS = 0;
private Context mContext;
private static MqttManager mqttManager;
private MqttAndroidClient mqttClient;
private MqttConnectOptions mqttConnectOptions;
/**
* 构造函数
*/
private MqttManager(Context context) {
this.mContext = context;
initMqtt();
}
/**
* 单例模式
*/
public static MqttManager getInstance(Context context) {
if (mqttManager == null) {
mqttManager = new MqttManager(context);
}
return mqttManager;
}
/**
* 初始化
*/
private void initMqtt() {
mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setCleanSession(true); //设置是否清除缓存
mqttConnectOptions.setConnectionTimeout(30); //设置超时时间,单位:秒
mqttConnectOptions.setKeepAliveInterval(60); //设置心跳包发送间隔,单位:秒
mqttConnectOptions.setUserName(USERNAME); //设置用户名
mqttConnectOptions.setPassword(PASSWORD.toCharArray()); //设置密码
}
/**
* MQTT是否连接成功的监听
*/
private IMqttActionListener iMqttActionListener = new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.i("--->mqtt", "连接成功 ");
try {
//订阅主题,参数:主题、服务质量
mqttClient.subscribe(SUB_TOPIC, QOS);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
exception.printStackTrace();
Log.i("--->mqtt", "onFailure 连接失败:" + exception.getMessage());
}
};
/**
* 建立mqtt连接,连接MQTT服务器
*/
public boolean connect(String clientId,MqttCallback mqttCallback) {
//创建Mqtt客户端
mqttClient = new MqttAndroidClient(mContext, HOST, clientId);
mqttClient.setCallback(mqttCallback); //设置订阅消息的回调
//建立连接
try {
if ((mqttClient != null) && (!mqttClient.isConnected())) {
mqttClient.connect(mqttConnectOptions, null, iMqttActionListener);
}
} catch (Exception e) {
Log.e("--->mqtt","connect: " + e.getMessage());
e.printStackTrace();
return false;
}
return true;
}
// 订阅主题
public void subTopic(String topic) {
if (mqttClient != null && mqttClient.isConnected()) {
try {
mqttClient.subscribe(topic, QOS);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 发布消息
*/
public void pubTopic(String topic,String payLoad) {
try {
if (mqttClient != null && mqttClient.isConnected()) {
//参数分别为:主题、消息的字节数组、服务质量、是否在服务器保留断开连接后的最后一条消息
mqttClient.publish(topic,payLoad.getBytes(),QOS,false);
} else {
Log.i("--->mqtt","mqttAndroidClient is Null or is not connected");
}
} catch (Exception e) {
Log.i("--->mqtt","publish MqttException:" + e.getMessage());
e.printStackTrace();
}
}
/**
* 断开链接
*/
public void disconnect() {
try {
if (mqttClient != null) {
mqttClient.unregisterResources();
mqttClient.disconnect();
mqttClient = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
6、在MainActivity中编写代码
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
public class MainActivity extends AppCompatActivity {
private MqttManager mqttManager;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.tv);
mqttManager=MqttManager.getInstance(this);
//自己设备的id,自己的设备连接服务器
mqttManager.connect("123456", new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
Log.i("--->mqtt", "连接断开");
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
dispaly(new String(message.getPayload()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
Log.i("--->mqtt", "deliveryComplete");
}
});
}
private void dispaly(final String message) {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(message);
}
});
}
public void click(View view) {
mqttManager.pubTopic("123","hello");
}
}
通过此程序可以发布消息和接收消息