mqtt

这是自己搜罗网上文章整理的,用来让自己快速记忆。

 

  • mqtt是什么:

是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,
MQTT 协议定义了两种网络实体:消息代理(message broker)与客户端(client)。其中,消息代理用于接收来自客户端的消息并转发至目标客户端。MQTT 客户端可以是任何运行有 MQTT 库并通过网络连接至消息代理的设备,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

信息的传输是通过主题(topic)管理的。发布者有需要分发的数据时,其向连接的消息代理发送携带有数据的控制消息。代理会向订阅此主题的客户端分发此数据。发布者不需要知道订阅者的数据和具体位置;同样,订阅者不需要配置发布者的相关信息。
MQTT 控制消息最小只有 2 字节的数据。最多可以承载 256 Mb 的数据。有 14 种预定义的消息类型用于:连接客户端与代理、断开连接、发布数据、确认数据接收、监督客户端与代理的连接。

MQTT 基于 TCP 协议,用于数据传输。变体 MQTT-SN 用于在蓝牙上传输,基于 UDP。

MQTT协议规定Broker在没有收到Client的DISCONNECT数据包之前都应该和Client保持连接。只有当Broker 在Keep Alive的时间间隔内,没有收到Client的任何MQTT数据包的时候会主动关闭连接。

 

 

  • 优势

MQTT 相较于HTTP, 能节省更多的资源,带来较少的传输负担
提供心跳机制、遗嘱消息、QoS 质量等级+离线消息、主题和安全管理等全面的物联网应用特性。
MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

 

 

  • MQTT 数据包结构

     固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识
     可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容
    消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容
Payload消息体位MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:
        ○ CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
        ○ SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
        ○ SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
        ○ UNSUBSCRIBE,消息体内容是要订阅的主题。

 

  • mqtt代理服务器保留信息与删除信息。

发布订阅模式虽然让消息的发布者与订阅者充分解耦,但也出现了一个隐含的问题,即订阅者无法主动向发布者请求消息,订阅者何时收到消息完全依赖于发布者何时发布消息,这在某些场景中就产生了不便。例如,某设备定期发布自身 GPS 坐标,但对于订阅者而言,从它发起订阅到第一次收到数据可能需要几秒钟,也可能需要十几分钟甚至更多,这样并不友好。因此?MQTT?引入了保留消息。
保留消息
通常,如果发布者向主题发布消息,并且没有人订阅该主题,则该消息将被代理放弃。
但是,发布者可以通过设置保留的消息标志(retained message)来告诉代理保留该主题的最后一条消息。
重要的是要理解每个主题只保留一条消息。在该主题上发布的下一条消息将替换该主题的最后一条保留消息


主动清除代理服务器上的(RETAIN=TRUE的)消息
我们将消息设置为空白,并将retain标志设置为true,以清除保留的消息。

如果我订阅主题并收到保留的消息,那么代理/服务器会删除该消息吗?
答 -不会。(自己理解:有人订阅收到了保留的消息,难道后面就没有人再订阅了吗。保留的消息会一直保留,跟有没有人订阅,有多少人订阅没关系。他是一中机制,保证任何人来订阅,都能得到最后一条消息。)

如何删除或清除Mosquitto上所有保留的消息?
A-如果您没有使用持久性数据库,那么最简单的方法是停止并重新启动mosquitto。否则,您需要订阅所有主题以检查并清除保留的消息。

何时使用保留的消息
通常,当消息包含持久数据时,您将发布带有保留标志的消息。
例如,传感器可以发布关于其自身的信息,例如固件版本号,IP地址,当前状态。
此信息不太可能更改,因此您只需使用retain标志发布一次,任何新客户端都可以检索该信息。

当服务端收到 Retain 标志为 1 的 PUBLISH 报文时,它将进行以下操作:
1. 如果存在匹配此主题名的订阅者,则按正常逻辑进行转发,并在转发前清除 Retain 标志。MQTT v3.1.1 协议中 Retain 标志必须被清除,而 MQTT v5.0 协议则在订阅选项中新增了一个 Retain As Publish 字段,由客户端自行指示服务端在转发前是否需要清除 Retain 标志。
2. 如果 Payload 非空,存储此应用消息,如果此主题名下已经存在保留消息则进行替换。如果 Payload 为空,服务端不会存储此应用消息,同时清除此主题名下已经存在的保留消息。
而每当有订阅者建立订阅时,服务端就会查找是否存在匹配该订阅的保留消息,如果保留消息存在,就会立即转发给订阅者。当保留消息在这种情况下被转发给订阅者时,它的 Retain 标志必须保持为 1。相比 MQTT v3.1.1,MQTT v5.0 对于订阅建立时是否发送保留消息做了更细致的划分,并在订阅选项中提供了 Retain Handling 字段。例如某些客户端可能仅希望在首次订阅时接收保留消息,又或者不希望在订阅建立时接收保留消息,都可以通过 Retain Handling 选项调整。
保留消息虽然存储在服务端中,但它并不属于会话的一部分。也就是说,即便发布这个保留消息的会话终结,保留消息也不会被删除。删除保留消息只有两种方式:
3. 前文已经提到过的,客户端往某个主题发送一个 Payload 为空的保留消息,服务端就会删除这个主题下的保留消息。
4. 消息过期间隔属性在保留消息中同样适用,如果客户端设置了这一属性,那么保留消息在服务端存储超过过期时间后就会被删除。
借助保留消息,新的订阅者能够立即获取最近的状态,而不需要等待无法预期的时间,这在很多场景下很非常重要的。

 

  • 订阅者是长连接还是短连接

订阅者长连接。(自己认为:发布端与代理服务器应该不需要保持长连接,发布消息的时候连接即可。)

 

  • 使用Last Will和Testament特性通知有关各方客户端异常中断的机制。

Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。
Testament:遗嘱机制,功能类似于Last Will。

 

  • 默认消息

当发布客户端首次与代理连接时,客户端可以设置一个默认消息。当代理发现发布者意外断开,其会向订阅者发送此预设的消息

 

  • 服务质量(QoS):

0:最多一次传送 (只负责传送,发送过后就不管数据的传送情况)
1:至少一次传送 (确认数据交付)(自己:订阅端会有应答,在应答之前可能多次发送消息,订阅端就要自己去重。)
2:正好一次传送 (保证数据交付成功)(自己:两次数据发送和回复。确保接收方已经收到消息,并且发送方知道接收方接受到了消息。发送方知道接收方已经收到消息。接收端和发送端都需要判重)。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。

 

 

  • 我们用的什么实现组件:M2mqtt

我们用的什么qos:1,至少一次传送。
什么场景用mqtt:项目内部消息发送。一些后端操作需要通知前端的时候(此时用户可能没有登录系统,需要下次登录系统的时候收到消息。玩家端未读提醒等,如果客户度或浏览器端要获取未读提醒,就需要不断请求后台刷新,使用mqtt这种发布订阅模式之后,只需要在未读状态发生变更的时候发布消息即可。)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值