MQTT Android客户端的使用介绍
.
简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议。
它是一种
发布/订阅
,极其简单和轻量级的消息传递协议,专为受限设备和低带宽,高延迟或不可靠的网络而设计。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M
)以及物联网环境。相对于XMPP
,MQTT
更加轻量级,并且占用的宽带低。
.
.
MQTT体系结构的介绍
网络连接
由底层传输协议提供给MQTT使用的架构
- 底层传输协议能够连通客户端和服务端
- 底层传输协议提供有序的,可靠的,双向字节流
应用消息
指通过MQTT在网络中传输的应用程序数据。当应用消息通过MQTT传输的时候会附加上质量服务(QoS)和话题名称。
客户端
指使用MQTT的程序或设备。客户端总是去连接服务端。它可以
- 发布其他客户端可能会感兴趣的应用消息
- 订阅自己感兴趣的的应用消息
- 退订应用消息
- 从服务端断开连接
服务端
扮演订阅或发布应用消息的客户端之间的中间人。一个服务端
- 接受客户端的网络连接
- 接受客户端发布的应用消息
- 处理客户端订阅和退订的请求
- 转发匹配客户端订阅的应用消息
订阅
一个订阅由一个话题过滤器和一个最大的QoS组成。一个订阅只能关联一个会话。一个会话可以包含多个订阅。每个订阅都有不同的话题过滤器。
话题名称
指附着于应用消息的标签,服务端用它来匹配订阅。服务端给每个匹配到的客户端发送一份应用信息的拷贝。
话题过滤器
包含在订阅里的一个表达式,来表示一个或多个感兴趣的话题。话题过滤器可以包含通配符。
会话
一个有状态的客户端和服务端的交互。有些会话的存续依赖于网络连接,而其他则可以跨越一个客户端和服务端之间的多个连续的网络连接。
MQTT控制包
通过网络连接发送的包含一定信息的数据包。MQTT规范定义了14个不同类型的控制包,其中一个(PUBLISH包)用来传输应用信息。
.
.
MQTT的优点
.
轻巧高效,最大限度地减少客户端和网络带宽所需的资源
使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合
对负载内容屏蔽的消息传输
使用 TCP/IP 提供网络连接(持久会话)
使用 SSL/TLS 提供网络安全和信任
具有一种“遗嘱”功能,该功能通知订户客户机从 MQTT 服务器异常断开连接
可以指定服务质量 (QoS) 级别以支持消息可靠性
- qos为0: “至多一次”,消息发布完全依赖底层
TCP/IP
网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送- qos为1: “至少一次”,确保消息到达,但消息重复可能会发生。这一级别可用于如下情况,你需要获得每一条消息,并且消息重复发送对你的使用场景无影响
- qos为2: “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果
.
.
MQTT核心参数说明:
.
topic: 中文意思是“话题”。在MQTT中订阅了(
subscribe
)同一话题(topic
)的客户端会同时收到消息推送。直接实现了“群聊”功能clientId: 客户身份唯一标识
qos: 服务质量
retained: 要保留最后的断开连接信息
userName: 连接到
MQTT
服务器的用户名passWord: 连接到
MQTT
服务器的密码
.
.
MQTT最主要方法的介绍:
.
1. connect()方法
作用: 连接
MQTT
服务器参数说明:
options
: 用来携带连接服务器的一系列参数,例如用户名、密码等。userContext
: 可选对象,用于向回调传递上下文。一般传null
即可。callback
: 用来监听MQTT是否连接成功的回调
@Override
public IMqttToken connect(MqttConnectOptions options, Object userContext,
IMqttActionListener callback) throws MqttException {
//...
}
.
2. publish()方法
作用: 发布消息,向服务端推送消息。向某个话题发送消息,之后服务器会推送给所有订阅了此话题的客户
参数说明:
topic
: 发布消息的主题payload
: 消息内容的字节数组qos
: 提供消息的服务质量,可传0、1或2retained
: 是否在服务器保留断开连接后的最后一条消息
@Override
public IMqttDeliveryToken publish(String topic, byte[] payload, int qos,
boolean retained) throws MqttException, MqttPersistenceException {
//...
}
.
3. subscribe()方法
作用: 订阅消息主题
参数说明:
topic
: 订阅消息的主题qos
: 订阅消息的服务质量,可传0、1或2
@Override
public IMqttToken subscribe(String topic, int qos) throws MqttException,
MqttSecurityException {
//...
}
.
.
MQTT安卓客户端的使用介绍
.
在全局的build.gradle
文件中添加
repositories {
maven {
url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
}
}
.
.
在项目build.gradle
文件中添加依赖
dependencies {
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}
.
在 AndroidManifest.xml
添加下面的限权
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
.
在 AndroidManifest.xml
注册Service
服务
<!--MqttService-->
<serv