一、MQTT协议简叙
MQTT 有以下特点:
- 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合
- 使用TCP/IP提供网络连接
- 有三种发布消息服务质量
- “至多一次 Qos level=0”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
- “至少一次Qos level=1”,确保消息到达,但消息重复可能会发生。
- “只有一次Qos level=2”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
- 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
- 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。
MQTT 限制:
- MQTT协议传输内容格式目前只支持2中,一个为UTF-8和askii,传输的内容最大为256M
- 目前用的比较多的基于MQTT协议的消息服务器mosquitto socket 最大连接数仅5W左右。
MQTT消息类型(4-7),使用4位二进制表示,可代表16种消息类型:
Mnemonic | Enumeration | Description |
---|---|---|
Reserved | 0 | Reserved |
CONNECT | 1 | Client request to connect to Server |
CONNACK | 2 | Connect Acknowledgment |
PUBLISH | 3 | Publish message |
PUBACK | 4 | Publish Acknowledgment |
PUBREC | 5 | Publish Received (assured delivery part 1) |
PUBREL | 6 | Publish Release (assured delivery part 2) |
PUBCOMP | 7 | Publish Complete (assured delivery part 3) |
SUBSCRIBE | 8 | Client Subscribe request |
SUBACK | 9 | Subscribe Acknowledgment |
UNSUBSCRIBE | 10 | Client Unsubscribe request |
UNSUBACK | 11 | Unsubscribe Acknowledgment |
PINGREQ | 12 | PING Request |
PINGRESP | 13 | PING Response |
DISCONNECT | 14 | Client is Disconnecting |
Reserved | 15 | Reserved |
0->保留 ;1->客户端请求连接到服务器;2->连接确认;3->发布消息;4->发布确认;5->发布收稿(有保证的交付第一部分);
6->出版发行(有保证的交付第二部分);7->发布完整(有保证的交付第三部分);8->客户端订阅请求;9->订阅确认;
10->客户端退订请求;11->退订确认;12->ping请求;13->ping响应;14->客户端端口;15->保留;
三、MQTT消息发布流程
下图是消息的发布和确认等一些流程,主要是跟消息发布者所设定的QoS level有关。
好了,MQTT协议大致介绍了一下,现在进入对源码的分析、
四、目录分析
org.eclipse.paho.client.mqttv3 :主要用于对外提供服务,此包里提供的整个功能。
org.eclipse.paho.client.mqttv3.internal: 提供了对mqttv3 中的接口的实现。
org.eclipse.paho.client.mqttv3.internal.nls: 国际化相关文件。学习中可以忽略
org.eclipse.paho.client.mqttv3.internal.security:MQTT支持SSL加密,这个包内实现了基于TLS协议SSLSocket;
org.eclipse.paho.client.mqttv3.internal.wire : MQTT协议中报文信息,里面包含有心跳包、订阅包、发布包、确认包等
org.eclipse.paho.client.mqttv3.persist:发布信息持久化类,MQTT提供两种保持发布消息的方式,一种是将信息保持到文件中,
一种是直接保持 到 内存中。
org.eclipse.paho.client.mqttv3.util:工具类。
org.eclipse.paho.client.mqttv3.logging:日志包
由此可以看出学习基于MQTT协议的paho,只需要啃下蓝色部分包内的内容,基本上就全部掌握了。