首页 > 其他分享 >MQTT协议

MQTT协议

时间:2023-08-31 13:34:09浏览次数:42  
标签:协议 mqtt 默认 MQTT true public 客户端

1.MQTT协议介绍

官网: http://mqtt.p2hp.com/

image-20230830142113093

MQTT

image-20230830142250638

https://blog.csdn.net/weixin_36173034/article/details/112511014

2.MQTT协议原理

3.MQTT协议数据包结构

image-20230830150152818

image-20230830150242838

Byte1:低4位

image-20230830150337891

image-20230830151032791

MQTT消息质量QoS

取决于发布者发布消息的Qos与订阅者订阅消息的Qos,取他们两者Qos最小的,即”木桶原理“中的最短者

image-20230830151421219

image-20230830151644467

  • QoS0消息发布订阅(最多一次)

发布者发布消息后,服务器直接讲消息发送给订阅者,之间是没有消息确认的

  • QoS1消息发布订阅(最少一次)

    image-20230830152037855

  • QoS2消息发布订阅(只有一次)

image-20230830152349563

4.EMQX简介

官网:https://www.emqx.io/zh

image-20230830155404662

1.安装部署

用docker安装部署

docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.0.26
# 端口介绍
# 1883:MQTT 协议端口
# 8084:MQTT/SSL 端口
# 8083:MQTT/WebSocket 端口
# 8080:HTTP API 端口
# 18083:Dashboard 管理控制台端口

部署成功后访问测试:IP:18083

image-20230830161506675

默认登录名:admin ,密码:public

参考文档: https://www.kuangstudy.com/bbs/1401763436836229121

实战项目:https://github.com/xiongsihao/yikekong/tree/master

Java开发MQTT

  1. 试用 mica-mqtt-client-spring-boot-starter进行开发

    1. 添加POM依赖

      <dependency>
          <groupId>net.dreamlu</groupId>
          <artifactId>mica-mqtt-client-spring-boot-starter</artifactId>
          <version>2.1.1</version>
      </dependency>
      
    2. MQTT客户端配置项

      mqtt:
        client:
          enabled: true               # 是否开启客户端,默认:true
          ip: 127.0.0.1               # 连接的服务端 ip ,默认:127.0.0.1
          port: 1883                  # 端口:默认:1883
          name: Mica-Mqtt-Client      # 名称,默认:Mica-Mqtt-Client
          clientId: 000001            # 客户端Id(非常重要,一般为设备 sn,不可重复)
          user-name: mica             # 认证的用户名
          password: 123456            # 认证的密码
          timeout: 5                  # 超时时间,单位:秒,默认:5秒
          reconnect: true             # 是否重连,默认:true
          re-interval: 5000           # 重连时间,默认 5000 毫秒
          version: mqtt_3_1_1         # mqtt 协议版本,可选 MQTT_3_1、mqtt_3_1_1、mqtt_5,默认:mqtt_3_1_1
          read-buffer-size: 8KB       # 接收数据的 buffer size,默认:8k
          max-bytes-in-message: 10MB  # 消息解析最大 bytes 长度,默认:10M
          buffer-allocator: heap      # 堆内存和堆外内存,默认:堆内存
          keep-alive-secs: 60         # keep-alive 时间,单位:秒
          clean-session: true         # mqtt clean session,默认:true
          ssl:
            enabled: false            # 是否开启 ssl 认证,2.1.0 开始支持双向认证
            keystore-path:            # 可选参数:ssl 双向认证 keystore 目录,支持 classpath:/ 路径。
            keystore-pass:            # 可选参数:ssl 双向认证 keystore 密码
            truststore-path:          # 可选参数:ssl 双向认证 truststore 目录,支持 classpath:/ 路径。
            truststore-pass:          # 可选参数:ssl 双向认证 truststore 密码
      

参考文档: https://gitee.com/596392912/mica-mqtt/blob/master/starter/mica-mqtt-client-spring-boot-starter/README.md

  1. 客户端上下线监听

    ```java
    @Service
    @Slf4j
    public class MqttClientConnectListener {
    
        @Autowired
        private MqttClientCreator mqttClientCreator;
    
        @EventListener
        public void onConnected(MqttConnectedEvent event)
        {
            log.info("Mqtt连接上了:{}", event);
        }
        @EventListener
        public void onDisConnected(MqttDisconnectEvent event)
        {
            log.info("Mqtt断开连接:{}",event);
            mqttClientCreator.clientId("newClient" + System.currentTimeMillis());
        }
    }
     ```
    

4.订阅消息服务 MqttClientSubscribeListener

       @Service
       @Slf4j
       public class MqttClientSubscribeListener {
           @Resource
           private MqttClientTemplate client;
       
           public void subQos0() {
               client.subQos0("/test/#",(context, topic, message, payload)->{
                   log.info("context:{},message:{}",context,message);
                   log.info(topic + '\t' + new String(payload.array(), StandardCharsets.UTF_8));
                   //获取到信息后可以进行后续的处理,存数据等
               });
           }
       
       }
  1. 在服务启动时,多线程执行订阅消息

     ```java
    @Component
    @Slf4j
    public class StartRunner implements CommandLineRunner {
        @Autowired
        private MqttClientSubscribeListener subscribeListener;
        @Override
        public void run(String... args) throws Exception {
            new Thread(()->{
                while (true)
                {
                    subscribeListener.subQos0();
                    try {
                        Thread.sleep(1000*1);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }).start();
        }
    }
     ```
    

CommandLineRunner 是一个 Spring Boot 接口,用于编写在应用程序启动时执行的代码。当您的应用程序启动时,Spring Boot 会自动查找并执行实现了 CommandLineRunner 接口的 bean。这样,您可以在应用程序启动时运行一些特定的代码,例如初始化数据、加载配置等。

  1. 使用MQTTX客户端模拟发布者发布消息

    image-20230831131518027

  2. 验证,观察日志中打印出了发布者发布的消息

    image-20230831131613042

连接到EMQX 服务器上有2个客户端,一个是QTTX连接的发布者客户端,一个是java程序连接的订阅者客户端

image-20230831131806354

标签:协议,mqtt,默认,MQTT,true,public,客户端
From: https://www.cnblogs.com/seanRay/p/17669346.html

相关文章

  • 07 网络层协议(IPv4协议)
    网络层在数据封装时,网络层的IP协议会为数据包封装IP头部IP协议为网络层的设备提供逻辑地址,协议规定了IP地址的格式,以及封装时的格式,负责数据包的寻址和转发办法IPv4,IPv6IPv4报文格式Version:4bit,4:表示为IPv4;6:表示为IPv6。HeaderLength:4bit,首部长度,如果不带Option......
  • 传输层协议总结
    传输层就是在信纸的空白上写上新的“收信人”信息。每一所房子【某一个终端】会配备一个管理员(传输层协议)。管理员从邮差手中接过信,会根据“收信人”,将信送给房子中的某个人。使用端口号(portnumber)来识别收信人(某个进程)。传输层协议TCP面向字节流服务面向连接,可靠,......
  • 记一次因HTTP协议版本导致后端服务响应502事故
    一、前言于今天即将下班之际,研发同时突然反馈某项目开发环境调用java后端服务出现502....据悉,就在前几天都是正常,今天发版上线之后就出现这种情况,而且故障出现之后根研发自行调用后端服务接口是没问题的....随即我这边开始展开紧急处理二、排查思路首先对于502错误通常表示服务器作......
  • 视频汇聚/视频监控管理平台EasyCVR接入海康SDK协议后无法播放该如何解决?
    开源EasyDarwin视频监控/安防监控/视频汇聚EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。视频监控汇聚平台EasyCVR支持多种播放......
  • 视频汇聚/视频监控管理平台EasyCVR接入海康SDK协议后无法播放该如何解决?
    开源EasyDarwin视频监控/安防监控/视频汇聚EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。视频监控汇聚平台EasyCVR支持多种播放......
  • 安防视频监控/视频集中存储/云存储平台EasyCVR无法播放HLS协议该如何解决?
    视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集......
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR接入海康SDK协议后无法播放该如何解决?
    开源EasyDarwin视频监控/安防监控/视频汇聚EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。视频监控汇聚平台EasyCVR支持多种播放......
  • 【SPI】SPI总线协议及驱动框架
    SPI通讯协议SPI控制方式SPI采用主-从(master-slave))模式的控制的方式。一个Master设备可以通过提供Clock以及对slave设备进行片选来控制多个Slave设备,SPI协议还规定Slave设备的Clock由Master设备通过SCK管脚提供给Slave设备,Slave设备本身不能产生和控制Clock,没有Clock则Slave设......
  • 编译qt mqtt模块
    0. 环境 win10,qt6.3.11.下载源代码  mqtt:  https://github.com/qt/qtmqtt, 找到对应的tag,比如:6.3.1, 然后下载.zip文件。  perl:   https://strawberryperl.com, 选64位下载。2.安装perl,安装完,在环境变量里加上perl的bin目录。如果不加,有可能qt......
  • 基于MQTT发布/订阅模式的物联网温度监测系统
    MQTT是一种轻量级的消息传输协议,主要用于物联网设备和应用程序之间的通信,是基于发布/订阅模式,具备灵活、安全、易于使用和可扩展等优点的物联网协议。 以下以物联网温度监测系统为例,来说明MQTT的发布/订阅模式。现有一个物联网温度监测系统,现场包括多个温度传感器和一个温度监测平......