Android MQTT的使用以及一些常见的问题

2,283 阅读4分钟

 1.Android MQTT

使用步骤

  1. 引入依赖
  2. 先连接
  3. 订阅
  4. 发布
  5. 取消订阅
  6. 取消连接

首先,确保你的**AndroidManifest.xml**文件中声明了这些权限

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2.Android连接mqtt

往build.gradle引入

Android开发mqtt客户端主流使用的是eclipse提供的paho.mqtt

  implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
  implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3-1.1.0'

这是使用的是Android12(api30)  

1.MQTTService类

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
 
import org.eclipse.paho.android.service.MqttAndroidClient;
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.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
 
import java.util.Date;
 
// MQTT服务类,继承自Service
public class MQTTService extends Service {
 
    // MQTT服务器地址
    public static String host = "tcp://192.168.**";
    // 订阅的主题
    public static String topic = "order";
    // MQTT客户端实例
    private MqttAndroidClient client;
    // MQTT连接选项
    private MqttConnectOptions mqttConnectOptions;
 
    // 构造方法,通常用于初始化成员变量(这里为空)
    public MQTTService() {
    }
 
    // onBind方法,当其他组件(如Activity)绑定到此服务时调用
    @Override
    public IBinder onBind(Intent intent) {
        // 返回一个CustomBinder实例,允许客户端与服务进行通信
        return new CustomBinder();
    }
 
    // onCreate方法,当服务创建时调用
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("tag", "服务启动成功");
        try {
            // 初始化MQTT客户端和连接
            init();
        } catch (MqttException e) {
            // 打印异常堆栈信息
            e.printStackTrace();
        }
    }
 
    // 自定义Binder类,用于客户端与服务之间的通信
    public class CustomBinder extends Binder {
        // 获取MQTTService实例的方法
        public MQTTService getService() {
            return MQTTService.this;
        }
    }
 
    // 初始化MQTT客户端的方法
    public void init() throws MqttException {
        // 创建MqttAndroidClient实例,传入上下文、服务器地址、客户端ID和自动确认消息模式
        client = new MqttAndroidClient(this, host, String.valueOf(new Date().getTime()), MqttAndroidClient.Ack.AUTO_ACK);
        // 设置MQTT回调
        client.setCallback(mqttCallback);
        // 创建MqttConnectOptions实例
        mqttConnectOptions = new MqttConnectOptions();
        // 如果客户端未连接,则尝试连接
        if (!client.isConnected()) {
            client.connect(mqttConnectOptions, null, iMqttActionListener);
        }
    }
 
    // MQTT连接操作的监听器
    IMqttActionListener iMqttActionListener = new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken iMqttToken) {
            try {
                // 连接成功后订阅指定主题
                client.subscribe(topic, 1); // QoS等级为1
            } catch (MqttException e) {
                // 打印异常堆栈信息
                e.printStackTrace();
            }
        }
 
        @Override
        public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
            // 连接失败时打印异常堆栈信息
            throwable.printStackTrace();
        }
    };
 
    // MQTT回调接口的实现,用于处理连接丢失、消息到达和消息发送完成事件
    MqttCallback mqttCallback = new MqttCallback() {
        @Override
        public void connectionLost(Throwable throwable) {
            // 连接丢失时的处理(此处为空)
        }
 
        @Override
        public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
            // 当消息到达时打印消息内容、主题、QoS等级和保留标志
            Log.d("string", mqttMessage.getPayload().toString());
     
        }
 
        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
            // 消息发送完成时的处理(此处为空)
        }
    };
}

2.MqttCerviceConn类

import android.content.ComponentName; 
import android.content.ServiceConnection;
import android.os.IBinder; 

// MqttCerviceConn类实现了ServiceConnection接口,用于处理MQTT服务的连接和断开
public class MqttCerviceConn implements ServiceConnection {
    // MQTTService类的实例,用于与服务进行交互
    public MQTTService mqttService;

    // 当服务成功连接时调用此方法
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // 将IBinder转换为MQTTService中定义的CustomBinder类型,并获取MQTTService的实例
        // 这里假设MQTTService有一个名为CustomBinder的内部类,它实现了IBinder接口,并有一个getService()方法返回MQTTService的实例
        mqttService = ((MQTTService.CustomBinder)service).getService();
        //你可以在这里实现其他业务功能 比如 aidl接口
    }

    // 当服务断开连接时调用此方法
    @Override
    public void onServiceDisconnected(ComponentName name) {
        // 在这里可以处理服务断开连接的逻辑,比如清理资源或更新UI
        // 当前方法体为空,表示没有特定的断开连接处理逻辑
    }
}

  • ServiceConnection接口:用于监听与服务的连接状态。当服务连接成功或断开时,系统会分别调用onServiceConnectedonServiceDisconnected方法。
  • IBinder接口:服务通过它与客户端(如Activity或其他组件)进行通信。在onServiceConnected方法中,你可以通过传递给你的IBinder对象来获取服务的实例。
  • MQTTService:假设这是一个自定义的服务类,用于处理MQTT相关的操作。它有一个为CustomBinder的单独的Binder类,该类实现了IBinder接口,并提供了一个方法来获取MQTTService的实例。

这个类通常用于在Activity或其他组件中,当需要与服务进行交互时,通过绑定服务来使用。绑定服务后,你可以通过mqttService实例来调用服务中定义的方法。

在MainActivity启动Mqtt服务

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    // 创建MqttCerviceConn的实例,这个类实现了ServiceConnection接口,用于处理服务连接和断开的回调
    MqttCerviceConn mqttCerviceConn = new MqttCerviceConn();
    
    // 创建一个Intent,用于指定要绑定的服务。这里指定的是MQTTService类
    Intent intent = new Intent(this, MQTTService.class);
    
    // 绑定服务。这个方法会异步地尝试连接到指定的服务
    // 第一个参数是Intent,用于指定要绑定的服务
    // 第二个参数是ServiceConnection的实例,用于接收服务连接和断开的回调
    // 第三个参数是一个标志,这里使用的是Context.BIND_AUTO_CREATE,表示如果服务尚未创建,则自动创建它
    bindService(intent, mqttCerviceConn, Context.BIND_AUTO_CREATE);
}

3.常见的报错

1. 在连接的时候 千万别忘记tcp:// 否则会连接失败。

2.如果报cannot start service org.eclipse.paho.android.service.MqttService​编辑

你需要在AndroidManifest.xml中添加