本篇文章主要讲解MQTT 消息的发布和订阅
MQTT协议介绍:https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html
MQTT使用的是EMQ,官网地址:https://www.emqx.io/cn/products/broker
MQTT协议官方测试工具:http://tools.emqx.io
maven 导入 MQTT依赖
<!--mqtt-->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.1</version>
</dependency>
1. 客户端 Client 与 服务端 Server
在MQTT协议中,并不是发送消息的是客户端,接收消息的是服务端,客户端和服务端都是可以发送消息和接收消息的。
1.1 客户端
客户端总是通过网络连接到服务端
- 发布应用消息给其它相关的客户端。
- 订阅以请求接受相关的应用消息。
- 取消订阅以移除接受应用消息的请求。
- 从服务端断开连接
我们正常用来发送消息的和接收消息的都是属于客户端。
1.2 服务端
作为发送消息的客户端和请求订阅的客户端之间的中介
- 接受来自客户端的网络连接。
- 接受客户端发布的应用消息。
- 处理客户端的订阅和取消订阅请求。
- 转发应用消息给符合条件的已订阅客户端。
服务端我使用的是EMQ Linux 下 EMQ X 服务器部署
2、创建客户端
发布者和订阅者都是属于客户端,服务器是 EMQ Broker。
发布者把消息发送给 Broker,Broker 接收到消息后再把消息发送给订阅者,发布者和订阅者之间实际上是没有直接关系的。
// 全局创建 client 引用
public static MqttClient client = null;
/**
* 创建客户端
*/
public static void createClient(){
if(client != null){
logger.info("MQTT 客户端已存在,不可再重复创建");
return;
}
// 创建客户端, MemoryPersistence 设置 client 的保存方式默认以内存保存
// clientId 是客户端的唯一标识, 相同的 clientId 客户端连接时会导致已连接的客户端断开连接
String clientId = AddressUtils.getLocalMac() + IPPortUtil.getLocalPort(); // 为保证每次连接都是用同一个客户端Id, 我这边是获取机器的MAC地址作为客户端的唯一标识
try {
client = new MqttClient(HOST,clientId,new MemoryPersistence());
} catch (MqttException e) {
e.printStackTrace();
}
// 设置回调函数
client.setCallback(new MqttCallbackExtended(){
@Override
public void connectComplete(boolean reconnect, String serverURI) {
logger.info("[MQTT] 连接已完成...");
isConnect = true;
// 连接完成可以做一些初始化操作(我在这边发送客户端上线通知)
mqttServiceStatic.callBackBusinessProcessing(reconnect,serverURI);
}
@Override
public void connectionLost(Throwable cause) {
logger.info("[MQTT] 连接已断开...");
isConnect = false;
// 不设置断线自动连接时,可在这边自定义重连
mqttServiceStatic.connectionLost(cause);
}
@Override
public void messageArrived

本文深入讲解MQTT消息的发布和订阅机制,包括客户端与服务端角色解析,客户端创建与连接流程,消息服务质量等级分析,主题订阅与取消订阅操作,以及客户端断线重连策略。
最低0.47元/天 解锁文章
1万+





