MQTT 消息推送详解
#MQTT 消息推送详解
MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息协议,专为低带宽、高延迟或不稳定网络环境设计,非常适合物联网设备通信、移动消息推送等场景。
一、MQTT 核心概念
- **Broker(代理/服务器)**:消息的中转中心,负责接收客户端发布的消息并推送给订阅了对应主题的客户端。
- **Publisher(发布者)**:发送消息到某个主题的客户端。
- **Subscriber(订阅者)**:订阅一个或多个主题,接收该主题下的消息。
- **Topic(主题)**:消息的标签,支持层级结构,如 `sensor/temperature/room1`。
- **QoS(服务质量)**:
- **0**:最多一次(可能丢失)
- **1**:至少一次(保证到达,可能重复)
- **2**:恰好一次(保证到达且不重复)
- **Will Message(遗愿消息)**:客户端异常断开时,Broker 自动发布的预设消息。
- **Retained Message(保留消息)**:Broker 为每个主题保留最后一条消息,新订阅者能立即收到。
二、MQTT 在 Android 上的实现(推送)
Android 端作为 MQTT 客户端,可以订阅主题接收实时推送,也可以发布数据到云端。
1. 添加依赖
推荐使用 **Eclipse Paho Android Service**(支持后台长连接、断线重连):
```groovy
dependencies {
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}
```
如果目标 API ≥ 21(Android 5.0+),还需添加 `android:usesCleartextTraffic="true"`(若 broker 未使用 TLS)。
2. 在 AndroidManifest.xml 中声明服务和权限
```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" />
<service android:name="org.eclipse.paho.android.service.MqttService" />
```
3. 初始化 MQTT 客户端并连接
```kotlin
import org.eclipse.paho.android.service.MqttAndroidClient
import org.eclipse.paho.client.mqttv3.*
class MqttPushManager(context: Context, serverUri: String, clientId: String) {
private val mqttClient = MqttAndroidClient(context, serverUri, clientId)
private v
