青岛文明网:MQTT协议实现Android中的新闻收发

admin 1个月前 (09-27) 科技 55 1

前言

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

效果

使用前先查看一下简朴的效果图,MQTT相关的毗邻、订阅,发送及吸收:

使用历程

  1. 依赖添加
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'
  1. 权限添加
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
  1. 服务添加
<service android:name="org.eclipse.paho.android.service.MqttService"/>

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

  1. 初始化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());
    }
}
  1. 建立毗邻选择如下,可设置用户名、密码:
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;
}
  1. 新闻公布:
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());
    }
}
  1. 毗邻断开:
public void disconnect() {
    try {
        sampleClient.disconnect();
    } catch (MqttException e) {
        setMqttMessage("disconnectException: " + e.getMessage());
    }
}

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

迎接点赞/谈论,你们的赞许和激励是我写作的最大动力!

关注民众号:几圈年轮,查看更多有趣的手艺、工具、闲言、资源。

,

皇冠会员APP

皇冠体育APP是一个开放皇冠代理APP下载、皇冠会员APP下载、皇冠线路APP下载、皇冠登录APP下载的平台,皇冠体育APP上最新登录线路、新2皇冠网址更新最快,皇冠体育APP开放皇冠会员注册、皇冠代理开户等业务。

皇冠体育声明:该文看法仅代表作者自己,与本平台无关。转载请注明:青岛文明网:MQTT协议实现Android中的新闻收发

网友评论

  • (*)

最新评论

  • AllbetGmaing代理 2020-09-27 00:06:30 回复

    少儿保险少儿保险:少儿是祖国的花朵,未来的栋梁,更是必须给予保护的对象。而少儿保险刚好是针对未成年的婴儿,青少年儿童年龄段的健康、出行等所设计的险种。特点是对少儿的保障高,费用小,投保年龄越小保费越便宜,对于有孩子的家庭来说是非常不错的选择。更新蛮勤,适合消遣

    1

文章归档

站点信息

  • 文章总数:755
  • 页面总数:0
  • 分类总数:8
  • 标签总数:1285
  • 评论总数:395
  • 浏览总数:23318