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 完整的 ...
随机推荐
- Java8 新特性2——强大的Stream API
强大的Stream API Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.简而言之,Stream API 提供 ...
- js 面向对象 模拟日历
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- failed to open directory
解决方法: 解决方案的路径不要包含中文!
- 再说scss
1. CSS预处理器 定义了一种新的专门的编程语言,编译后成正常的CSS文件.为CSS增加一些编程的特性,无需考虑浏览器的兼容问题,让CSS更加简洁,适应性更强,可读性更佳,更易于代码的维护等诸多好处 ...
- (转)浅析epoll-为何多路复用I/O要使用epoll
原文地址:http://www.cppfans.org/1417.html 浅析epoll-为何多路复用I/O要使用epoll 现如今,网络通讯中用epoll(linux)和IOCP(windows) ...
- 两个div,高度都是100% 用 display:flex; 和 min-height 一边撑高了,另一边自动走 (不加flex不自动撑开)
两个div,高度都是100% 用 display:flex; 和 min-height 一边撑高了,另一边自动走
- 使用vue-router+vuex进行导航守卫(转)
前言:想要实现登录后才能进入主页等其他页面,不然都会跳转到登录页.但是Vuex有个不够完美的地方,一旦刷新页面就会没了,所以还要用到localStorage. 一.router.js: import ...
- System.Text.Json 序列化对所有 JSON 属性名称使用 camel 大小写
asp.net core3.x 新增的序列号接口System.Text.Json 序列化时,如果要对所有 JSON 属性名称使用 camel 大小写 将 JsonSerializerOptions.P ...
- C++技法杂记
C++ 技法杂技杂记 1. 枚举 1.1 枚举继承(Enum Inheritance) struct Enum{ enum{ One = 1, Two, Last }; }; struct EnumD ...
- 关于Web2.0
前言:本来是想写HTML的,发现没什么好写的,就简单写一下Web2.0好了 什么是Web 2.0: "Web 2.0 is the business revolution in the co ...