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 完整的 ...
随机推荐
- Python之接口测试(一)
前言 之前我们已经学会了利用JMeter工具进行接口测试,今天我们学习一下如何利用python进行接口测试. 一:发送get请求 import requests,json url = 'http:// ...
- 教你高效使用数据可视化BI软件创建医院卫生耗材运营监控大屏
灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件. 本文以医院卫生耗材运营监控大屏 ...
- 《深入理解 Java 虚拟机》读书笔记:虚拟机字节码执行引擎
正文 执行引擎是 Java 虚拟机最核心的组成部分之一.在不同的虚拟机实现里,执行引擎在执行 Java 代码时可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也 ...
- C++ 指针实现字符串倒序排列
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <coni ...
- 解决idea的pom.xml文件不自动导包问题
在用pom添加新项目的包时,突然发现pom文件不能自动导包,找了半天发现用以下两个步骤就能解决: 一:打开setting 二:找到maven
- vue中v-slot使用
vue中v-slot使用 1,v-slot的使用步骤 <!-- slot.vue--> <!-- 通过name属性指定具名插槽,没有name属性的为默认插槽--> <sl ...
- 通过xshell远程部署
Xshell 和 Xftp5 操作linux系统的机器 ------------------------------------------------------------------------ ...
- Python习题集(一)
每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! 题目 有一个数据list of dict如下 a = [ {"}, {"}, {"}, ] 写入到本 ...
- 【Weiss】【第03章】练习3.20:中缀表达式转后缀表达式
[练习3.20] a.编写一个程序将中缀表达式转换为后缀表达式,该中缀表达式含括号及四则运算. b.把幂操作符添加到你的指令系统中去. c.编写一个程序将后缀表达式转化为中缀表达式. Answer: ...
- 【股票盯盘软件】01_程序员炒股之开发一款极简风格的股票盯盘软件StockDog_V1.0.0.1
1.前言 话说最近一段时间受疫情的影响,股市各种妖魔横行.本人作为一个入股市不满三年的小韭菜,就有幸见证了好几次历史,也是满心惊喜,就权当是接受资本市场的再教育了吧. 小韭菜的炒股方法其实很简单,这两 ...