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,我也会继续补充其它有用的知识及例子在项目上。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
直播搭建中Android service两种启动方式的区别
直播搭建中的Android service服务不能自己运行,需要通过调用Context.start Service或者Context.bindService方法启动服务。两种方法都可以启动Service,但是它们的适用场合有所不同。使用startService方法启用服务,调用者与服务之间没有关联,即使调用者退出,服务仍然运行。使用bindService 方法启用服务,调用者与服务绑定在一起,调用者一旦退出,服务也就终止。 Context.startService启动在服务未被创建之前,系统会先调用服务的onCreate方法,接着调用onStart 方法,如果调用startService方法前服务已被创建,多次调用startService方法并不会导致多次创建服务,但会导致多次调用onStart方法。采用startService方法启动的服务,只能调用Context.stopService方法结束服务,服务结束时会调用onDestroy方法。 Context.bindService方法启动在服务未被创建时,系统会先调用服务的onCreate方法,接着调用onBind方法。这个时候调用者...
- 下一篇
Android开发8年,阿里、百度一面惨被吊打!我是否应该转行了?
背景 2020年1月5号,朋友辞去了北京一家小创公司Android开发的工作,准备春节过后寻找新的工作的时候,突然遇到了新冠疫情的爆发,至今赋闲在家。昨天接到同行好友的电话,要和我聊聊天。告诉我再找不到工作就考虑转行了! 话语间无不感叹安卓有点强弩之末的味道!聊天过程中,朋友也顺带分享了一波阿里饿了么、百度Android岗的面经。我也帮他内推了几份工作岗位,却因为技术欠缺和经验不足等问题被友好的回绝了! 饿了么Android岗一面1:双亲委托机制?2:插件化原理?3:垃圾回收机制及其优缺点?4:PathClassLoader和DexClassLoader区别?5:说下Binder?6:Android旋转屏幕后Activity生命周期,Bundle是存储在哪儿的?7:事件分发机制?8:Handler实现?9:Java内存?10:OkHttp设计模式?11:算法。 Http和Https的区别 HashMap的具体实施原理,HashMap和Hashset的区别 Java的垃圾回收机制 JVM的原理及线上调优 string,stringbulider,stringbuffer的区别 Java的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装