Android 如何接收 MQTT 订阅消息

引言

MQTT(Message Queue Telemetry Transport)是一种轻量级的消息传输协议,适用于各种物联网设备和移动应用程序。在 Android 平台上,我们可以使用 Eclipse Paho 提供的 MQTT 客户端库来实现 MQTT 的订阅和发布功能。本文将介绍如何在 Android 应用程序中接收 MQTT 订阅消息,并提供一个示例来解决实际问题。

准备工作

在开始之前,我们需要在 Android 项目中添加 Paho MQTT 客户端库的依赖。可以通过在 app 模块的 build.gradle 文件中添加以下代码来引入库:

dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.5'
}

创建 MQTT 客户端

首先,我们需要创建一个 MQTT 客户端对象,并设置其连接参数。以下代码展示了如何创建一个 MQTT 客户端并设置连接参数:

import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;

String serverUri = "tcp://mqtt.example.com:1883";
String clientId = MqttClient.generateClientId();
MqttAndroidClient mqttAndroidClient = new MqttAndroidClient(context, serverUri, clientId);

MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
mqttConnectOptions.setCleanSession(true);
mqttConnectOptions.setAutomaticReconnect(true);
mqttConnectOptions.setKeepAliveInterval(60);
mqttConnectOptions.setUserName("myUsername");
mqttConnectOptions.setPassword("myPassword".toCharArray());

try {
    IMqttToken token = mqttAndroidClient.connect(mqttConnectOptions);
    token.setActionCallback(new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken asyncActionToken) {
            // 连接成功
        }

        @Override
        public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            // 连接失败
        }
    });
} catch (MqttException e) {
    e.printStackTrace();
}

在上述代码中,我们创建了一个 MQTT Android 客户端实例,并设置了连接参数。其中,serverUri 是 MQTT 服务器的地址和端口,可以修改为实际的服务器地址和端口。clientId 是客户端的唯一标识符,可以使用 MqttClient.generateClientId() 自动生成。

在连接参数中,我们可以设置一些选项,例如是否自动重连、保持连接的时间间隔以及用户名和密码等。

订阅主题

接下来,我们需要订阅一个或多个主题,以接收服务器发送的消息。以下代码演示了如何订阅一个主题:

String topic = "myTopic";
int qos = 1;

try {
    IMqttToken token = mqttAndroidClient.subscribe(topic, qos);
    token.setActionCallback(new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken asyncActionToken) {
            // 订阅成功
        }

        @Override
        public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            // 订阅失败
        }
    });
} catch (MqttException e) {
    e.printStackTrace();
}

在上述代码中,我们订阅了名为 "myTopic" 的主题,并指定了消息的质量控制等级(QoS)。QoS 可以是 0、1 或 2,分别表示最多一次、至少一次和只有一次的传递保证。

接收消息

当我们订阅的主题有新消息到达时,我们需要在 MQTT 客户端上注册一个回调函数来处理消息。以下代码展示了如何注册回调函数:

mqttAndroidClient.setCallback(new MqttCallbackExtended() {
    @Override
    public void connectComplete(boolean reconnect, String serverURI) {
        // 连接完成
    }

    @Override
    public void connectionLost(Throwable cause) {
        // 连接丢失
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // 收到新消息
        String payload = new String(message.getPayload());
        // TODO: 处理消息
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        // 消息发送完成
    }
});

在上述代码中,我们通过 mqttAndroidClient.setCallback()