一、简介
MQTT 是一种基于发布订阅模型的即时通讯协议,它被设计为一个极其轻量级的发布/订阅消息传输协议。主要用于物联网和移动设备等资源有限的场景中。
优点
1、是一种低带宽占用的即时通讯协议,在低带宽和不稳定的网络环境中也能较好地工作。
2、针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。
3、简单轻量,相比于其他传输协议,其代码占用内存少,对硬件要求低,适用于受限环境和低带宽网络。
4、通过发布-订阅架构,实现了实时可靠的消息服务,并且具有 QoS 服务质量,能够保证消息的可靠传输。
MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)
。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和载荷(payload)两部分:
Topic(主题)
:消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);它是消息的标识符,用于指定消息的类型或者位置。主题是一个由层级结构组成的字符串,使用斜杠(/)作为分隔符。例如,home/bedroom/temperature 是一个主题,用于表示卧室的温度数据。在MQTT中,发布者发布消息到特定的主题,而订阅者通过订阅主题来接收相关消息。
Payload(载荷)
:是实际的消息内容。它可以是任何类型的数据,例如文本、JSON、二进制数据等。发布者将消息发送到特定的主题时,将携带一个载荷,订阅者接收到消息后,可以从载荷中提取所需的数据。
当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关连。
QoS(服务质量)
:是MQTT中消息传输的可靠性等级,由低到高分别是:
QoS0:最多一次。消息尽力发送一次,但不保证一定会被接收。
QoS1:至少一次。消息至少发送一次,但可能会被接收多次。
QoS2:有且仅有一次。消息只发送一次,且只会被接收一次。
二、使用步骤
dependencies {
// ... 其他依赖 ...
// 添加本地jar作为依赖
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.4'
}
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttCallback;
public class MqttManager {
private static final String MQTT_BROKER_URL = "tcp://your.broker.com:1883";
private static final String CLIENT_ID = "AndroidClient";
private MqttClient mqttClient;
public void connect() {
try {
//初始化Mqtt
mqttClient = new MqttClient(MQTT_BROKER_URL, CLIENT_ID);
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
// 设置用户名和密码
// connOpts.setUserName("username");
// connOpts.setPassword("password".toCharArray());
mqttClient.connect(connOpts);//建立连接
mqttClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
// 连接丢失处理
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
// 接收到消息处理
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
// 消息发送成功处理
}
});
// 订阅主题
mqttClient.subscribe("your/topic");
} catch (Exception e) {
e.printStackTrace();
}
}
//断开连接
public void disconnect() {
try {
if (mqttClient != null && mqttClient.isConnected()) {
mqttClient.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//发布主题
public void publish(String topic, String message) {
try {
if (mqttClient != null && mqttClient.isConnected()) {
MqttMessage mqttMessage = new MqttMessage(message.getBytes());
mqttClient.publish(topic, mqttMessage);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}