Android MQTT开源库paho.mqtt.android+MQTTX软件使用记录

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

MQTTX软件下载:

官方地址:https://mqttx.app/zh/web

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();
       
    }
相关推荐
6+h2 小时前
【java IO】字节流详解
java·开发语言·python
Mem0rin2 小时前
[Java面向对象]接口的声明和实现继承
java·开发语言
毕设源码-邱学长2 小时前
【开题答辩全过程】以 基于Android的仓库管理系统的设计与实现为例,包含答辩的问题和答案
android
jing-ya2 小时前
day 53 图论part5
java·数据结构·算法·图论
aricvvang2 小时前
从踩坑到造轮子:基于node-snap7封装生产级S7 PLC通信库
javascript·后端·开源
haokan_Jia2 小时前
postgresql实现数据动态地图切片服务
java·服务器·前端
014-code2 小时前
Spring Boot 自动配置原理深度解析
java·spring boot·后端·spring
康小庄2 小时前
JVM学习——Gc Roots
java·jvm·spring boot·学习·spring
sdanss2 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端