物联网协议
- MQTT协议(消息队列遥感传输协议)
- 协议简介:
- MQTT协议是基于Tcp/IP协议栈构建的异步通信消息协议,是一种轻量级的发布、订阅信息传输协议
- 专门针对低带宽和不稳定网络环境的物联网应用而设计(低带宽,低开销)
- 协议特点:
- 低带宽,低开销
- 发布/订阅消息模式
- 支持Qos服务质量等级
- 支持心跳机制,will遗嘱机制
- 与Http的对比
- Mqtt的最小报文仅为2个字节,比Http占用更少的网络开销
- Mqtt与Http都能使用Tcp连接,并实现稳定、可靠的网络连接
- Mqtt基于发布订阅模型,Http基于请求响应,因此Mqtt支持双向通信
- Mqtt可实时推送消息,但Http需要通过轮询获取数据更新
- Mqtt是有状态的,但Http是无状态的
- Mqtt可从连接异常断开中恢复,Http无法实现
- 协议知识点
- 发布/订阅消息模式,提供一对多的消息发布
- 发布者
- 负责将消息发布到主题上,发布者一次只能向一个主题发送数据,发布者发布消息时无需关心订阅者是否在线
- 订阅者
- 订阅者接收发布者的信息,且可一次订阅多个主题,Mqtt支持通过共享订阅的方式在多个订阅者之间实现订阅的负载均衡
- 代理
- 负责接收发布者的消息,并将消息转发至符合条件的订阅者,也负责处理客户端发起的连接,断开连接,订阅,取消订阅等请求
- 主题(Topic)
- 主题是Mqtt进行消息路由的基础,类似Url路径,使用斜杠/进行分层,一个主题可以有多个订阅者,代理会将该主题下的消息转发给所有的订阅者,一个主题也可以有多个发布者,代理将按照消息到达的顺序转发
- Mqtt还支持订阅者使用主题通配符一次订阅多个主题(通配符只能用于订阅,不能用于发布)
- 单层通配符 +
+
是用于单个主题层次匹配的通配符,在使用单层通配符必须占据整个层级- 例如:
sensor/+ 有效 sensor/+/temperature 有效 sensor+ 无效(没有占据整个层级)
- 多层通配符 #
#
是用于匹配主题中任意层级的通配符。多层通配符表示它的父级和任意数量的子层级,在使用多层通配符时,它必须占据整个层级并且必须是主题的最后一个字符- 例如:
sensor/# 有效 sensor/bedroom# 无效(没有占据整个层级) sensor/#/temperature 无效(不是主题最后一个字符)
- 注意:
- 建议主题层级为7个以内,使用较短的主题名称和较少的主题层级意味着较少的资源消耗
- 不建议使用
#
订阅所有的主题 - 不建议主题以
/
开头或结尾,例如/chat或chat/ - 不建议在主题里添加空格及非ASCII特殊字符
- 同一主题层级内建议使用下划线
_
或横杆-
连接单词 - 使用通配符时,将唯一值的主题层(例如设备号) 越靠近第一层越好。例如
device/00000001/command/#
比device/command/00000001/#
更好
- 单层通配符 +
- 发布者
- 消除会话(Clean Session)
- 持久会话能被恢复的前提是客户端使用固定的client Id再次连接,如果是动态的则无效
- 对于那些想要在重新连接后,收到离线期间错过的消息的客户端,可在连接时设置关闭消除会话,此时服务端将会为客户端存储订阅关系与离线消息,并在客户端再次上线后发送给客户端
- 支持Qos服务质量等级,根据消息的重要性不同设置不同的服务质量等级
- Qos0:消息最多传递一次
- 如果当前客户端不可用,则会丢失该消息,发布者发送一条消息之后,就不再关心有没有发送到对方,也不设置任何重发机制
- 如果当前客户端不可用,则会丢失该消息,发布者发送一条消息之后,就不再关心有没有发送到对方,也不设置任何重发机制
- Qos1:消息传输至少一次
- 包含了简单的重发机制,发布者发送消息之后等待接收者的Ack,如果没有接收到Ack则重新发送消息。这种模式能保证消息至少能到达一次,但无法保证消息重复
- 包含了简单的重发机制,发布者发送消息之后等待接收者的Ack,如果没有接收到Ack则重新发送消息。这种模式能保证消息至少能到达一次,但无法保证消息重复
- Qos2:消息仅传送一次
- 设计了重发和重复消息发现机制,保证消息到达对方并且严格只到达一次
- 设计了重发和重复消息发现机制,保证消息到达对方并且严格只到达一次
- Qos0:消息最多传递一次
- 基于Topic发布/订阅消息,对负载内容屏蔽的消息传输
- 使用will遗嘱机制来通知客户端异常断线
- 遗嘱消息时Mqtt为那些可能出现意外断线的设备提供的将遗嘱优雅的发送给第三方的功能
- 可以看作一个简化版的Publish消息,也包含Topic,Payload,Qos等字段。遗嘱消息会在设备与服务端连接时,通过Connect报文指定,然后在设备意外断线时由服务端将该遗嘱消息发布到连接时指定的遗嘱主题上。
- 支持心跳机制
- Keep Alive机制
- 发布/订阅消息模式,提供一对多的消息发布
- 协议简介: