- MQTT通信
- 简介
MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,易于实现。
特点:开放消息协议,简单容易实现
发布订阅模式,一对多消息发布
基于TCP/IP网络连接
1字节固定报头,2字节心跳报文,报文结构紧凑,减少网络流量
消息QoS支持,可靠传输保证
通知机制,异常中断时通知传输双方
MQTT 协议通过网络传输应用数据。应用消息通过MQTT 传输时,它们有关联的服务质量和主题。
MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
- C/S架构
MQTT服务可以分为客户端和服务端两部分
客户端(C)
使用MQTT 的程序或设备。客户端总是通过网络连接到服务端。客户端它可以
发布应用消息给其它相关的客户端。.
订阅以请求接受相关的应用消息
取消订阅以移除接受应用消息的请求。
从服务端断开连接。
服务端(S)
一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。服务端它可以
接受来自客户端的网络连接
接受客户端发布的应用消息
处理客户端的订阅和取消订阅请求。
转发应用消息给符合条件的客户端订阅。
- 实现方式
实现MQTT协议需要:客户端和服务器端
MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分
Topic:可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
Payload:可以理解为消息的内容,是指订阅者具体要使用的内容
MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输。
当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关连。
- MQTT协议中的订阅、主题、会话
订阅(Subscription)
订阅包含主题筛选器(TopicFilter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
会话(Session)
每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
主题名(Topic Name)
连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。
MQTT-Topic 主题通配符
注:单层通配符和多层通配符只能用于订阅(subscribe)消息而不能用于发布(publish)消息,层级分隔符两种情况下均可使用
订阅也许会包含特殊字符,允许一次订阅多个主题
使用顶层分隔符意在主题中引入结构概念,因此能够为达到该目标,在主题内指定。多层通配符与单层通配符可用于订阅但是不能用于消息发布方的主题内。
顶层分隔符:前向/用于分隔主题树内不同层次,为主题空间提供层次化的结构。当订阅者指定主题遇到两个通配符时,使用顶层分隔符是十分重要的。
多层通配符:#号可以匹配主题内任何层次,例如,订阅finance/stock/ibm/#,可以在以下主题上接收到消息:finance/stock/ibm、finance/stock/ibm/closingprice、finance/stock/ibm/currentprice
多层通配符可以代表零或多个层次,因此,finance/#也能够匹配单一finance,其中#代表零层次。顶层分隔符在该上下文环境中是无意义的,因为无层次进行分隔。
可以指定多层通配符仅仅自己或者在顶层分隔符之后。因此,#与finance/#都是有效的,但是finance#无效。多层通配符在主题树内必须是最后一个使用字符,例如finance/#有效,但是finance/#/closingprice无效。
单层通配符:+号仅仅匹配一个主题层次。例如,finance/stock/+匹配finance/stock/ibm与finance/stock/xyz,但是不匹配finance/stock/ibm/closingprice。因为单层次通配符仅仅匹配一个层次,finance/+不匹配finance。
单层次通配符可用于主题树内任何层次,并与多层次通配符一起使用。必须用于在顶层分隔符之后,除了当自己指定时。因此,+和finance/+ 都是有效的,但是finance+无效。单层通配符可用于主题树最后或者在主题树内,例如,finance/+与finance/+/ibm都是有效的。
主题筛选器(TopicFilter)
一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
负载(Payload)
消息订阅者所具体接收的内容。
- MQTT协议中的基本方法
MQTT协议中定义了一些方法(也被称为动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。
Connect:等待与服务器建立连
Disconnect:等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话
Subscribe:等待完成订阅
UnSubscribe:等待服务器取消客户端的一个或多个topics订阅
Publish:MQTT客户端发送消息请求,发送完成后返回应用程序线程