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

1.Android MQTT

使用步骤

1.引入依赖

2.先连接

3.订阅

4.发布

5.取消订阅

6.取消连接

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

2.Android连接mqtt

往build.gradle引入

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


这是使用的是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接口:用于监听与服务的连接状态。当服务连接成功或断开时,系统会分别调用onServiceConnected和onServiceDisconnected方法。

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中添加

<service android:name="org.eclipse.paho.android.service.MqttService"/>

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容