首页 > 其他分享 >MQTT协议与中间件

MQTT协议与中间件

时间:2024-08-01 19:54:01浏览次数:18  
标签:协议 订阅 中间件 会话 MQTT 消息 连接 客户端

  • 发布订阅模式:消费者(客户端)订阅服务器(作为代理Broker)上的主题,当有生产者(客户端)在主题中发布消息时,消费者可以收到。

  • MQTT:基于发布订阅模式的轻量级通讯协议,可以以极少的代码和有限带宽,为连接远程设备提供实时可靠的消息服务。广泛应用于物联网,小型设备。MQTT传输的消息分为两部分:主题Topic和负载payload 订阅者订阅主题topic后,就会收到该主题的消息内容payload,数据通过MQTT时,MQTT就会把与之相关的Qos服务质量和主题topic相关联, 发送消息的服务质量:保证消息传递的次数。使用了MQTT协议的设备或应用即为MQTT客户端。

  • MQTT协议中的方法

    • Publish:客户端发送消息请求。发送完成后返回应用程序线程。

    • Subscribe:等待完成订阅。

    • Connect:等待与服务器建立连接。

    • Disconnect:等待客户端完成工作,之后断开TCP/IP会话。

  • MQTT QoS种类

    • QoS 0:消息最多传送一次,即发即弃,如果当前客户端不可用-如TCP连接关闭或重置,它将丢失这条消息。 常用于传输高频而不重要的数据 如传感器数据。

    • QoS 1:消息至少传送一次,保证收到消息,但消息可能重复 发送方只有收到接收方的PUBACK报文后才能认为消息投递成功,在此之前,发送方要存储PUBLISH以待重传 原理在PUBLISH报文设置Packet ID 相应报文返回该ID以便发送方删除对应报文 此中如果接收方收到消息而发送PUBACK报文失败,就会重复收到。用于接收端允许消息重复或能处理重复的。

    • QoS 2:消息只传送一次。保证消息不丢失不重复。 QoS等级越高,可靠性越高,复杂度越高。

  • MQTT连接参数

    • 客户端ID Client ID每个客户端要有唯一的ID ,如果重复则把已有的踢下线

    • 用户名和密码

    • 连接超时 Connect Timeout 收到服务器连接确认的等待时间,等待时间内没收到则认为超时

    • 保活周期 Keep Alive 以秒为单位,客户端无报文发送时将按照此时间定时向服务端发送心跳报文以确保连接不会断开,如果服务器在KeepAlive的1.5倍时间内没收到,则会断开连接。

  • MQTT工作流程

    • 客户端使用TCP/IP协议与Broker建立连接,可以选择使用TLS/SSL加密,客户端提供认证信息,指定会话类型。

    • 客户端发布消息,将消息发送给Broker,客户端订阅消息,接收订阅主题的信息。

    • 服务器接收发布的消息,将消息转发给订阅了主题的客户端,其根据Qos确保消息可靠性,根据会话类型为断开连接的客户端存储消息。

      1. 创建连接,设置连接参数

        MqttClient client = new MqqtClient(“tcp://192.168.14.144:1883”)

        MqttConnectOptions options=new MqttConnectOptions()

        options.setConnectionTimeout(60)

        options.setKeepAliveInterval(60)

        client.connect(options)

      2. /发布端 创建消息,设置QoS

        MqttMessage message =new MqttMessage(content.getBytes())

        message.setQos(qos)

        client.publish(topic,message)

      3. /接收端 设置回调

        MqttClient client = new MqqtClient(“tcp://192.168.14.144:1883”)

        MqttConnectOptions options=new MqttConnectOptions()

        options.setConnectionTimeout(60)

        options.setKeepAliveInterval(60)

        client.setCallback(new MqttCallback()){

        public void connectionLost(){连接丢失时被调用}

        public void messageArrived(){接收到消息时被调用}

        public void deliveryComplete()}{消息发送完成时被调用}

        }

        client.connect(options)

        clien.subscribe(topic,qos)

  • MQTT Retain:客户端向服务端发布消息时,可以设置是否保留消息,其存储在消息服务器上,后续订阅该主题的客户端仍然可以收到该消息(只会为主题保留最近的一条保留消息)。

  • MQTT Clean Session :通常客户端离线后无法收到订阅的主题消息,如果客户端连接时设置Clean Session为false 表示创建一个持久会话,断开连接后仍然保存离线消息,直到会话超时注销,为true则表示创建一个新的临时会话,客户端断开时,会话自动销毁。

  • MQTT Last Will:如果异常离线,断开连接前没有向服务器发送disconnect消息,服务器将发布遗嘱信息。

  • MQTT会话:物联网中,设备可能因为网络或电源频繁断开连接,错过离线消息,重连后还要重新订阅,为避免这些问题,MQTT设计了会话机制。以Clean Start和Session Expiry Innterval两个连接字段来控制会话的生命周期。

    • Clean Start:位于CONNECT报文的可变包头,通过此字段指定是否复用存在的会话,0为复用-需要服务器存在连接时关联的Client ID,1为不复用

    • Session Expiry Interval:用以指定会话在网络断开后能够在服务器保留的时间。默认为0,立即结束。大于0,相应秒数过期。

    • 订阅客户端离线后,发布客户端发布消息,会话保留时间内,消息将在服务器上保留,这时如果订阅客户端选择Clean Start 0 ,重新连接,将会收到离线期间缓存的消息。客户端想要复用的话必须使用与之前一致的ClientID。


      2024.7.15

标签:协议,订阅,中间件,会话,MQTT,消息,连接,客户端
From: https://blog.csdn.net/qq676752351/article/details/140847278

相关文章

  • 星塔链startowerchain的跳数网络协议
    星塔链StarTowerChain的跳数网络协议是其技术架构中的一个重要组成部分,它对于提升区块链网络的性能、降低能耗和增强安全性具有重要意义。以下是对星塔链跳数网络协议的详细分析:一、跳数网络协议的基本概念跳数网络协议是星塔链中用于实现节点间数据交换和交易处理的一种机制......
  • MiddlewareMixin--中间件类的便捷基类
    在Django中,MiddlewareMixin是一个用于创建中间件类的便捷基类。中间件是Django框架中的一种强大机制,允许在请求到达视图之前或响应返回客户端之前执行一些预处理或后处理任务。MiddlewareMixin类位于django.utils.deprecation模块中,它为编写中间件提供了一些标准方法和结......
  • 传输层TCP协议
    传输层TCP协议1.TCP协议简介2.TCP特点3.TCP协议段格式4.确认应答(ACK)机制和序列号5.捎带应答6.标志位7.连接管理机制7.1三次握手7.2四次挥手7.3服务端状态转化8.超时重传机制9.流量控制10.滑动窗口11.拥塞控制12.延迟应答13.面向字节流14.粘包问题1......
  • 网络层IP协议,网段划分,NAT转换
    网络层IP协议1.IP协议的基本认识2.IP协议如何进主机定位和报文转发3.IP分片和组装4.IP协议报头格式5.网段划分如何进行网段划分(子网,公网)分类划分法子网掩码特殊的IP地址6.私有IP地址和公网IP地址7.IP地址数量限制问题8.NAT网络地址转换机制NAT简介工作原理......
  • RPC和 HTTP协议
    RPC和HTTP的区别服务发现HTTP,知道服务域名,可以通过DNS解析得到服务的IP地址,从而进行访问RPC需要一个专门的中间服务去保存服务名和IP信息(注册中心,nacos、consul),想要访问某个服务,就得同时注册到中间服务,然后获取需要顶用服务的IP和端口信息底层链接形式HTTP/1.1......
  • 信创简报:2022年服务器国产化中间件替代品信息一览表(转)
    转载https://www.cnblogs.com/ios9/p/17695864.html#_label0*博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。*如有侵权,马上联系我,我立马删除对应链接。*@authorAlan*@[email protected]目录一、JDK/Open......
  • 【动态路由协议】RIP
    一、前导知识       动态路由协议分类:               1.IGP(内部网关协议,位于同一个自治系统内)                       1.1距离矢量路由协议                               RIP(距离矢......
  • 基于 STM32 的 NAS私有云盘搭建:集成LwIP 协议、HTTP/HTTPS、WEB前端技术栈(代码示例)
    项目概述在本项目中,我们将搭建一个基于STM32的NAS(网络附加存储)私盘,通过网络访问存储在外部SATA硬盘上的文件。该项目将使用STM32开发板、外接SATA硬盘、LwIP协议栈以及FATFS文件系统来实现文件的上传、下载和管理,用户可以通过简单的Web界面进行操作。系统设计......
  • 如何设计可扩展的RPC协议
    如何设计可扩展且向后兼容的RPC协议为什么不直接用现成的HTTP协议?RPC的职责是负责应用间的通信,所以性能要求相对更高。而HTTP协议的数据包相对于请求数据本身要大很多,有很多冗余内容(如换行回车等),会影响性能。另外HTTP协议是无状态的协议,每次请求都要重新建立连接。因此对于要......
  • Profibus转EtherCAT协议转化网关(功能与配置)
    如何能够把Profibus和EtherCAT通讯连接起来?这几天有几个客户朋友咨询到这个问题,作者在这里统一为大家回复一下。想要解决这个问题其实也非常简单,只需要用到一个设备,名为JM-DPM-ECT。下面作者为大家详细讲解一下该设备的主要功能及详细配置方法。一,设备主要功能捷米特JM-DPM-......