这里只是做了一些简单的笔记,这些内容都是通过看一个大神的文章和MQTT协议中文版文档总结的一些笔记:
1.MQTT协议的实现方式:
2.对传输消息有三种服务质量(QoS):
-
Qos0:最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:
-
QoS1:至少一次,这一级别会确保消息到达,但消息可能会重复。即:>=1
-
QoS2:只有一次,确保消息只有一次到达。即:=1。(推送使用的是这一种):
3.客户端和服务端:
和传统的协议不同,MQTT是一个基于客户端和服务端的发布/订阅模式的消息传输协议。
真正的“服务器端”指的是中间的代理部分(broker),发布者和订阅者都属于“客户端”。
客户端 Client
使用MQTT的程序或设备。客户端总是通过网络连接到服务端。它可以
- 发布应用消息给其它相关的客户端。
- 订阅以请求接受相关的应用消息。
- 取消订阅以移除接受应用消息的请求。
- 从服务端断开连接。
服务端 Server
一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。服务端
- 接受来自客户端的网络连接。
- 接受客户端发布的应用消息。
- 处理客户端的订阅和取消订阅请求。
- 转发应用消息给符合条件的已订阅客户端。
4.控制报文的结构:
- Fixed header: 固定报头,所有控制报文都包含 一般为1个字节
- Variable header: 可变报文,部分控制报文包含
- Payload: 有效载荷,部分控制报文包含
5.遗嘱(will flag:
6.关于CleanSession:
这个是eclipse.paho.mqtt.golang里面的一个函数,这个实在看文档的时候发现的一个不太理解问题。然后通过查其他资料解决的。
是用来控制session flags的。
如果cleanSession被置为true那么客户端将不存在持久会话并且在任何情况下连接断开时所有的消息都会被丢弃。当cleanSession被置为false时,持久会话将会被创建,直至客户端再次将cleanSession置为true。如果一个持久会话是可用的,那么消息将会以队列的形式投递给可用的客户端。
在连接之前,您必须设置 cleanSession 方式;在整个会话期间都将保持此方式。要更改此属性的设置,必须将客户机断开连接,然后再重新连接客户机。如果您将cleanSession=false 更改为 cleanSession=true,那么此客户机先前的所有订阅以及尚未接收到的任何发布都将被废弃。
联合使用session flags和wills令你可以处理源于不稳定的网络及自动化服务规模的问题。
7.安全性问题:
这部分东西有点多,没时间详细总结,先放一个链接在这吧......
MQTT协议中文版 第五章 安全
网友评论