SpringBoot 开发之 MQTT 协议的主题消息发布与订阅

本文深入讲解MQTT消息的发布和订阅机制,包括客户端与服务端角色解析,客户端创建与连接流程,消息服务质量等级分析,主题订阅与取消订阅操作,以及客户端断线重连策略。
本篇文章主要讲解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
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值