MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的通信协议,常用于物联网设备之间的通信。它具有以下特点:
MQTT协议的消息格式如下:
[
固定头部可变头部有效载荷固定长度可变长度长度可变
]
其中,固定头部包含控制报文类型、标志位和剩余长度字段;可变头部包含协议名称、协议版本、连接标志位等信息;有效载荷包含实际的消息内容。
MQTT协议适合在资源受限的设备和网络环境中进行可靠的通信。
MQTT适用于需要轻量级、可靠、实时通信的各种物联网和实时数据传输场景。
MQTT控制报文格式
MQTT数据包类型:
每种数据包类型都有特定的格式和用途,用于在MQTT协议中进行通信和消息传递。
MQTT报文标志位:
一个PUBLISH报文的格式如下:
| 固定报头 | 可变报头 | 有效载荷 |
其中,固定报头包含报文类型和标志位,可变报头包含主题名和报文标识符,有效载荷包含实际的消息内容。
导入依赖:
repositories {
maven {
url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
}
}
dependencies {
compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}
创建客户端并发布消息(服务端需搭建MQTT服务):
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
public class MqttJavaExample {
public static void main(String[] args) {
String broker = "tcp://iot.eclipse.org:1883";
String clientId = "JavaExample";
try {
MqttClient client = new MqttClient(broker, clientId);
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
System.out.println("Connecting to broker: " + broker);
client.connect(connOpts);
System.out.println("Connected");
String topic = "iot/topic";
String content = "Hello, MQTT!";
int qos = 2;
MqttMessage message = new MqttMessage(content.getBytes());
message.setQos(qos);
System.out.println("Publishing message: " + content);
client.publish(topic, message);
System.out.println("Message published");
client.disconnect();
System.out.println("Disconnected");
System.exit(0);
} catch (MqttException me) {
System.out.println("reason " + me.getReasonCode());
System.out.println("msg " + me.getMessage());
System.out.println("loc " + me.getLocalizedMessage());
System.out.println("cause " + me.getCause());
System.out.println("excep " + me);
me.printStackTrace();
}
}
}
这是一个简单的使用 Eclipse Paho MQTT Java 客户端库的例子。
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class MqttClientExample {
public static void main(String[] args) {
String broker = "tcp://iot.eclipse.org:1883";
String clientId = "JavaSample";
MemoryPersistence persistence = new MemoryPersistence();
try {
MqttClient client = new MqttClient(broker, clientId, persistence);
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
System.out.println("Connecting to broker: " + broker);
client.connect(connOpts);
System.out.println("Connected");
String topic = "iot/topic";
int qos = 2;
client.subscribe(topic, qos);
System.out.println("Subscribed to topic: " + topic);
String content = "Hello, MQTT!";
MqttMessage message = new MqttMessage(content.getBytes());
message.setQos(qos);
client.publish(topic, message);
System.out.println("Message published");
client.disconnect();
System.out.println("Disconnected");
System.exit(0);
} catch (MqttException me) {
System.out.println("reason " + me.getReasonCode());
System.out.println("msg " + me.getMessage());
System.out.println("loc " + me.getLocalizedMessage());
System.out.println("cause " + me.getCause());
System.out.println("excep " + me);
me.printStackTrace();
}
}
}
这是一个简单的使用 Eclipse Paho MQTT Java 客户端的示例。在这个示例中,我们创建了一个 MQTT 客户端并连接到指定的 MQTT 代理,然后订阅了一个主题并发布了一条消息。
优点
缺点