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'
- 权限添加
<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" />
- 服务添加
<service android:name="org.eclipse.paho.android.service.MqttService"/>
这里我们主要介绍
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,我也会继续补充其它有用的知识及例子在项目上。
欢迎点赞/评论,你们的赞同和鼓励是我写作的最大动力!
关注公众号:几圈年轮,查看更多有趣的技术、工具、闲言、资源。

MQTT协议实现Android中的消息收发的更多相关文章
- 浅析Android中的消息机制(转)
原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: public class ...
- 浅析Android中的消息机制(转)
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
- 浅析Android中的消息机制-解决:Only the original thread that created a view hierarchy can touch its views.
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
- 浅析Android中的消息机制
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
- 重温Android中的消息机制
引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ...
- 谈谈对Android中的消息机制的理解
Android中的消息机制主要由Handler.MessageQueue.Looper三个类组成,他们的主要作用是 Handler负责发送.处理Message MessageQueue负责维护Mess ...
- Android中的消息机制
在分析Android消息机制之前.我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
- 采用MQTT协议实现android消息推送(4)选fusesource-mqtt-client为客户端
1.简介 一个java写的mqtt客户端.项目地址: https://github.com/fusesource/mqtt-client 2.引入fusesource-mqtt-client库 Fil ...
- 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表
1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...
随机推荐
- 前端面试题(HTML、CSS部分)
HTML.CSS部分: 一.html5有哪些新特性.移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5? 新特性: HTML5 现在已经不是 SGML 的 ...
- 使用nestjs集成grpc具体操作
两个程序中, 提供grpc服务的称为服务端, 调用grpc服务的为客户端, 以下是grpc服务端和客户端的代码编写 1. 创建两个nestjs项目demo1(端口: 3000)和demo2(端 ...
- vmware企业虚拟化平台vSphere管理与配置
├─1-CCIE-DC课程介绍.avi ├─2-vSphere-简介.avi ├─3-vSphere-新功能介绍.avi ├─4-vSphere-授权介绍.avi ├─5-vSphere-课程拓扑介绍 ...
- startUML5.0中的tools下怎么没有java、c等选项
这也是帮一个直系学妹弄得,哈哈~~~ 具体做法如下: 进入到StartUML\modules目录下,里面有很多文件夹,比如startuml-cpp.startuml-csharp等等, 进入到每个文件 ...
- Javascript中String()和new String()的区别——JS的包装对象
最近在看Symbol不能使用new操作符,然后类比到Number,String,Boolean,因为它们同属于基本类型,但是有有所差异:Number,String,Boolean是可以使用new操作符 ...
- aireplay包注入攻击
reaver爆破WPS PIN码: airodump-ng wlan0 reaver -i wlan0 -b D0:76:E7:51:2A:78 -vv macchanger更改MAC地址: ma ...
- 6.前台项目vue环境、创建、目录重构、CSS、JS配置
目录 前台 vue环境 创建项目 重构项目目录 文件修订:目录中非配置文件的多余文件可以移除 App.vue router/index.js Home.vue 全局配置:全局样式.配置文件 globa ...
- 《自拍教程45》Python_adb实时监控Logcat日志
接上一篇:adb命令_一键截取logcat日志, 有一天, 系统稳定性开发负责人找到我,希望我能在跑android 系统monkey的时候, 实时监控logcat的输出,如果一旦发现"jav ...
- 【Python】2.17学习笔记 移位运算符,逻辑运算符
移位运算符 左移运算符 \(<<\),将对应的二进制数末尾补一颗零,高位自然溢出(遁入虚无 print( 5 << 2 ) 把\(5\)的二进制数左移两位 即把\(101\)变 ...
- python code practice(二):KMP算法、二分搜索的实现、哈希表
1.替换空格 题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 分析: 将长度为 ...