https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html
物联网平台下的一些名称解释
产品
设备的集合,通常指一组具有相同功能的设备。物联网平台为每个产品颁发全局唯一的ProductKey。每个产品下最多可以包含50万给设备。
设备
归属于某个产品下的具体设备。物联网平台为设备颁发产品内唯一的证书DeviceName。设备可以直接连接物联网平台,也可以作为子设备通过网关连接物联网平台。
Topic
Topic是UTF-8字符串,是发布(pub)/订阅(sub)消息的传输中介。可以向Topic发布或订阅消息。
Topic类
同一产品下不同设备的Topic集合。用 p r o d u c t k e y 和 {productkey}和 productkey和{deviceName}通配一个唯一的设备,一个Topic类对一个ProductKey下所有的设备通用。
MQTT协议特性
- 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
- 有三种消息发布服务质量(QoS0、QoS1、QoS2):
- “最多一次”,消息发布完全依赖于底层的TCP/IP网络,会发生消息丢失或者重复,这一级别可用于对采集数据要求不严格的情况;
- “至少一次”,确保消息到达,但是消息可能会重复发生;
- “只有一次”,确保消息只到达一次,这一级别可用于要求严格如涉及计费系统的情况,消息重复或者丢失都是不允许的。
- 小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量;
- 使用 Last Will和Testrament特性通知有关各方客户端异常中断的机制;
- 允许用户动态创建主题,零运维成本;把低带宽、高延迟、不稳定的网络因素考虑在内;
- 假设数据不可知,不强求传输数据的类型与格式,保持灵活性;
- 官网:http://mqtt.org/
MQTT协议的中心是MQTT服务器或者代理(broker)
用户可以使用MQTT构建一个传感器网络,其中各种传感器都能够以其传感器独有的消息形式发布传感器值,订阅程序能够订阅不同的消息,以据此采取措施,MQTT代理将处理从发布程序到订阅程序的转发消息。MQTT服务器除了收集转发数据,还可以进行数据处理和存储,例如,实时存储共享单车车辆运行位置、电池用量、状态信息等数据,以及对总体的车辆进行计算和统筹管理,甚至为一些聊天工具提供平台的服务。
CONNECT控制报文详解
客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是 CONNECT 报文。
在一个网络连接上,客户端只能发送一次 CONNECT报文。服务端必须将客户端发送的第二个 CONNECT 报文当作协议违规处理并断开客户端的连接。
固定报头+可变报头+有效载荷
固定报头
必须存在,用于描述报文信息。里面指出是什么类型的报文,报文的等级。
可变报头
不一定存在。主要是看什么类型的报文,共十个字节,基本固定。
协议名
协议级别
连接标志
保持连接
有效载荷部分
这是内容。也是通信信息存放的地方。有时候还会存放一些额外的信息,如:客户ID。
有效载荷包含一个或多个编码字段。包括客户端的唯一标识符,will主题,will消息,用户名和密码。除了客户端标识外,其他的字段都是可选的,基于标志位来决定可变报头中是否需要包含这些字段。
*:设备名字
#:ProductKey
在线加密解密网站:http://encode.chahuo.com/
服务质量QOS
报文在发送的过程中可能存在丢失的情况,解决方式是重新发送。
服务质量就是在表示报文要分送几次
- QOS 0:最多分发一次
- QOS 1:至少分发一次
- QOS 2:只分发一次
使用QOS 0 的情况较多
MQTT客户端
一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:
- 发起和服务器的连接
- 发布其他客户端可能会订阅的信息; //发布消息
- 订阅其它客户端发布的消息; //订阅消息
- 退订或删除应用程序的消息; //退订消息
- 断开与服务器连接。 //断开,连接服务器
MQTT服务器
MQTT服务器以称为**“消息代理”(Broker)**,可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:
- 接受来自客户的网络连接; //接受客户端连接
- 接受客户发布的应用信息; //接收客户端发布的消息
- 处理来自客户端的订阅和退订请求; //处理消息的订阅及退订
- 向订阅的客户转发应用程序消息。 //推送消息
MQTT协议中的订阅、主题、会话
MQTT主题模式:
-
MQTT是通过主题对消息进行分类的
-
主题的本质就是一个UTF-8的字符串
-
主题可以通过反斜杠标识多层级关系
-
主题不需要创建,直接使用就可以了
-
主题还可以通过通配符进行过滤
-
+可以过滤一个层级
-
只能够出现在主题最后表示过滤任意级别的层级 举个例子:
- building-b/floor-5:代表B楼5层的设备
- *+/floor-5:表示任意一个楼层的5层的设备
- building-b/:代表B楼所有的设备
MQTT中有3个角色
- 发布者 Publisher
- 订阅者 Subscriber
- 代理 Broker
MQTT这种结构替代了传统的客户端/服务器模型,可以实现以下解耦:
- 空间解耦,发布者和订阅者不需要知道对方
- 时间解耦,发布者和订阅者不需要同时运行(离线消息)
- 同步解耦,发布和接收都是异步通讯,无需停止任何处理
订阅(Subscription)
订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
会话(Session)
每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
主题名(Topic Name)
事件名称,根据订阅主题名称来匹配是否往客户端发送消息
连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。
主题筛选器(Topic Filter)
一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
负载(Payload)–消息体
消息订阅者所具体接收的内容。