一、简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),是轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接。
MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,协议具有许多不同的功能:
- 是一种发布/订阅的消息传输协议。
- 通过 TCP/IP 运行,TCP/IP 可以提供基本网络连接。
- 是一种管理网络中消息流的经济方式。 例如,固定长度的标题仅 2 个字节长度,并且协议交换可最大程度地减少网络流量。
- 针对消息传送提供三种服务质量:
“最多分发一次”
消息根据底层因特网协议网络尽最大努力进行传递。 可能会丢失消息。 对于是否丢失个别读取或是否稍后立即发布新的读取并不重要。
“至少分发一次”
保证消息抵达,但可能会出现重复。
“仅分发一次”
确保只收到一次消息。
MQTT Android github:https://github.com/eclipse/paho.mqtt.android
二、基本使用
2.1 添加依赖
在app的build.gradle中添加如下依赖:
dependencies {
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'
}
2.2 添加权限
<!-- 使用paho必须要使用的3个权限,sPermissions the Application Requires -->
<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.INTERNET" />
2.3 注册Service
<!-- Mqtt Service -->
<service android:name="org.eclipse.paho.android.service.MqttService"/>
三、代码实现
class MQTTService : Service() {
private val TAG = MQTTService::class.java.simpleName
companion object {
//服务器地址(协议+地址+端口号)
private const val HOST = "tcp://iotav-admin.itc-pa.cn:1883"
//用户名
private const val USERNAME = "admin"
//密码
private const val PASSWORD = "123456"
//客户端标识
private val appId = AppClientIdUtil.getClientId()
private var mqttAndroidClient: MqttAndroidClient? = null
/**
* 发布
* @param topic String 主题
* @param message String 消息
*/
fun sendData(topic: String, message: String) {
val qos = 2
val retained = false
try {
//参数分别为:主题、消息的字节数组、服务质量、是否在服务器保留断开连接后的最后一条消息
mqttAndroidClient?.publish(topic, message.toByteArray(), qos, retained)
} catch (e: MqttException) {
e.printStackTrace()
}
}
}
private var mMqttConnectOptions: MqttConnectOptions? = null
private var mScheduledExecutorService: ScheduledExecutorService? = null
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
mScheduledExecutorService = Executors.newSingleThreadScheduledExecutor()
initMQTT()
return START_REDELIVER_INTENT
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
/**
* 初始化
*/
private fun initMQTT() {
val serverURI = HOST //服务器地址(协议+地址+端口号)
mqttAndroidClient = MqttAndroidClient(applicationContext, serverURI,