MQTT协议实现Android中的消息收发

MQTT协议实现Android中的消息收发

前言
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),基于发布/订阅范式的消息协议,是一种极其简单和轻量级的消息协议,专为受限设备和低带宽、高延迟或不可靠的网络设计。今天主要说明一下MQTT协议在Android中进行消息的收发应用,关于MQTT协议的基础内容请参考之前介绍的 MQTT协议 相关内容。

效果
使用前先查看一下简单的效果图,MQTT相关的连接、订阅,发送及接收:

使用过程
依赖添加
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
实际使用中发现,如果仅用第一条依赖也是能够实现我们所需要的的消息收发功能的,其中MqttClient类实现了MQTT相关的连接、订阅、发送及接收功能,第二条依赖是基于MqttClient针对Android客户端进行封装了MqttAndroidClient进行使用,其中实现了Android相关的广播、服务相关内容。

使用中如果采用的是Androidx开发环境,还需要添加如下依赖,否则MqttAndroidClient服务中会找不到本地广播服务,导致无法运行使用。

implementation 'androidx.legacy:legacy-support-v4:1.0.0'
权限添加





服务添加

这里我们主要介绍MqttClient类实现的MQTT协议消息的收发,而进一步封装的MqttAndroidClient和其使用过程基本类似,想要查看其具体使用,可跳转对应Demo链接获取详细内容。

初始化MQTT客户端内容,代理服务器broker选用的 HiveMQ公共代理 来实现:
public void initClient() {

try {
    MemoryPersistence persistence = new MemoryPersistence();
    // 设置唯一客户端ID
    clientId = clientId + System.currentTimeMillis();
    //设置订阅方订阅的Topic集合,遵循MQTT的订阅规则,可以是多级Topic集合
    final String topicFilter = topic;
    //服务质量,对应topicFilter
    final int qos = 0;
    //创建客户端
    sampleClient = new MqttClient(broker, clientId, persistence);
    //配置回调函数
    sampleClient.setCallback(new MqttCallbackExtended() {
        @Override
        public void connectComplete(boolean reconnect, String serverUri) {
            setTextInfo("connectComplete: " + serverUri);
            try {
                //连接成功,需要上传客户端所有的订阅关系
                sampleClient.subscribe(topicFilter, qos);
            } catch (MqttException e) {
                setTextInfo("subscribeException: " + e.getMessage());
            }
        }

        @Override
        public void connectionLost(Throwable cause) {
            setTextInfo("connectionLostException: " + cause.getMessage());
        }

        @Override
        public void messageArrived(String topic, MqttMessage message) {
            setTextInfo("messageArrived:" + new String(message.getPayload()));
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken token) {
            setTextInfo("deliveryComplete");
        }
    });
    //创建连接选择
    MqttConnectOptions connOpts = createConnectOptions(userName, passWord);
    setTextInfo("Connecting to broker: " + broker);
    //创建服务连接
    sampleClient.connect(connOpts);
} catch (MqttException me) {
    setTextInfo("initException: " + me.getMessage());
}

}
创建连接选择如下,可设置用户名、密码:
private MqttConnectOptions createConnectOptions(String userName, String passWord) {

MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
connOpts.setUserName(userName);
connOpts.setPassword(passWord.toCharArray());
connOpts.setAutomaticReconnect(true);
// 设置连接超时时间, 单位为秒,默认30
connOpts.setConnectionTimeout(30);
// 设置会话心跳时间,单位为秒,默认20
connOpts.setKeepAliveInterval(20);
return connOpts;

}
消息发布:
public void publishMsg() {

String content = mEtMessage.getText().toString().trim();
if (TextUtils.isEmpty(content)) {
    content = "Hello MQTT ";
}
//此处消息体需要传入byte数组
MqttMessage message = new MqttMessage(content.getBytes());
//设置质量级别
message.setQos(0);
try {
    if (sampleClient != null && sampleClient.isConnected()) {
        /*
         * 消息发送到某个主题Topic,所有订阅这个Topic的设备都能收到这个消息。
         * 遵循MQTT的发布订阅规范,Topic也可以是多级Topic。此处设置了发送到一级Topic。
         */
        sampleClient.publish(topic, message);
        setTextInfo("publishMsg: " + message);
    }
} catch (MqttException e) {
    setTextInfo(" publishException: " + e.getMessage());
}

}
连接断开:
public void disconnect() {

try {
    sampleClient.disconnect();
} catch (MqttException e) {
    setMqttMessage("disconnectException: " + e.getMessage());
}

}
MQTT协议实现Android中的消息收发就到这里了,内容已上传至Github开发记录,欢迎点击查阅及Star,我也会继续补充其它有用的知识及例子在项目上。

原文地址https://www.cnblogs.com/jqnl/p/12660824.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章