最近在项目加入mqtt,很久没有用过,给自己做个笔记记录一下部分内容,代码可以借鉴使用。

MQTTX软件下载:


1.paho.mqtt.android依赖引入:
XML
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application ...>
<service android:name="org.eclipse.paho.android.service.MqttService" />
</application>
XML
buildscript {
repositories {
google()
mavenCentral()
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url = uri("https://www.jitpack.io") } // 添加这一行
}
}
XML
implementation: 'com.github.hannesa2:paho.mqtt.android:3.6.4'
implementation:'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
implementation:'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
2.创建mqtt管理类:
java
package x; // 建议新建一个包
import android.content.Context;
import android.util.Log;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.DisconnectedBufferOptions;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.greenrobot.eventbus.EventBus;
/**
* mqtt 管理类
* 连接,重试,关闭
*/
public class MqttHelper {
private static final String TAG = "MqttHelper";
private MqttAndroidClient mqttAndroidClient;
private final String serverUri = "tcp://broker.emqx.io:1883"; // 使用免费的 EMQX 测试地址
//private final String clientId = "mqttx_e1d5e998";
private final String clientId = "Android_" + System.currentTimeMillis();
private final String subscriptionTopic = "testtopic/#"; // 替换为你要订阅的主题
// 新增用户名和密码常量(请替换为实际值)
private static final String MQTT_USERNAME = "yemao";
private static final String MQTT_PASSWORD = "123456";
public MqttHelper(Context context) {
// 3.6.4 版本:构造方法只需要 3 个参数,不需要 Ack
mqttAndroidClient = new MqttAndroidClient(context, serverUri, clientId);
mqttAndroidClient.setCallback(new MqttCallbackExtended() {
@Override
public void connectComplete(boolean reconnect, String serverURI) {
Log.d(TAG, "连接成功,是否为重连:" + reconnect);
// 连接成功后订阅主题
subscribeToTopic();
}
@Override
public void connectionLost(Throwable cause) {
Log.e(TAG, "连接丢失", cause);
}
@Override
public void messageArrived(String topic, MqttMessage message) {
String payload = new String(message.getPayload());
Log.d(TAG, "收到消息: " + payload);
// 通过 EventBus 发布消息事件(与 4.x 版本保持一致)
EventBus.getDefault().post(new MqttMessageEvent(topic, payload));
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
// 消息送达确认
}
});
}
public void connect() {
MqttConnectOptions options = new MqttConnectOptions();
options.setAutomaticReconnect(true); // 自动重连
options.setCleanSession(false); // 保持会话,可接收离线消息
// 设置用户名和密码
options.setUserName(MQTT_USERNAME);
options.setPassword(MQTT_PASSWORD.toCharArray());
try {
mqttAndroidClient.connect(options, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.d(TAG, "连接成功回调");
// 配置离线缓冲
DisconnectedBufferOptions bufferOpts = new DisconnectedBufferOptions();
bufferOpts.setBufferEnabled(true);
bufferOpts.setBufferSize(100);
bufferOpts.setDeleteOldestMessages(false);
mqttAndroidClient.setBufferOpts(bufferOpts);
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.e(TAG, "连接失败", exception);
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
private void subscribeToTopic() {
try {
mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.d(TAG, "订阅成功: " + subscriptionTopic);
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.e(TAG, "订阅失败", exception);
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
public void publishMessage(String topic, String message) {
if (mqttAndroidClient != null && mqttAndroidClient.isConnected()) {
try {
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(message.getBytes());
mqttMessage.setQos(1);
mqttAndroidClient.publish(topic, mqttMessage);
Log.d(TAG, "消息发布成功: " + message);
} catch (MqttException e) {
e.printStackTrace();
}
} else {
Log.w(TAG, "客户端未连接,无法发布");
}
}
public void disconnect() {
if (mqttAndroidClient != null) {
try {
mqttAndroidClient.disconnect();
} catch (MqttException e) {
e.printStackTrace();
}
}
}
}
3.事件类:
java
/**
* mqtt事件类
*/
public class MqttMessageEvent {
private String topic;
private String message;
public MqttMessageEvent(String topic, String message) {
this.topic = topic;
this.message = message;
}
public String getTopic() {
return topic;
}
public String getMessage() {
return message;
}
}
4.在Application类初始化:
java
// 全局 MQTT Helper
//private static MqttHelper mqttHelper;
// 初始化 MQTT(在后台线程,避免阻塞主线程)
AppUtils.runOnThread(() -> {
mqttHelper = new MqttHelper(getApplicationContext());
mqttHelper.connect();
Log.i(TAG, "MQTT 初始化并连接 (3.6.4版本)");
});
/**
* 获取全局 MQTT Helper 实例
*/
public static MqttHelper getMqttHelper() {
return mqttHelper;
}
/**
* 关闭 MQTT 连接(可在需要时调用)
*/
public static void closeMqtt() {
if (mqttHelper != null) {
mqttHelper.disconnect();
mqttHelper = null; // 可选:释放引用,帮助 GC
Log.i(TAG, "MQTT 连接已关闭");
}
}
5.acitvity使用
java
// 接收 MQTT 消息事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMqttMessage(MqttMessageEvent event) {
String topic = event.getTopic();
String message = event.getMessage();
// 在这里处理收到的 MQTT 消息,例如更新UI或显示弹窗
//showToast("MQTT 消息 [" + topic + "]: " + message);
Log.i(TAG, "onMqttMessage: "+"MQTT 消息 [" + topic + "]: " + message);
// 你可以根据需要更新界面上的 TextView 等
// 例如:tvMessage.setText("收到: " + message);
}
java
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
// 关闭 MQTT 连接(全局断开)
//DinosaurApplication.closeMqtt();
}