MQTT协议笔记之订阅

前言

记忆不太好的时候,只能翻看以前的文章/笔记重新温习一遍,但找不到MQTT协议有关订阅部分的描述,好不容易从Evernote中找到贴出来,这样整个MQTT协议笔记,就比较齐全了。

SUBSCRIBE

一般来讲,客户端在成功建立TCP连接之后,发送CONNECT消息,在得到服务器端授权允许建立彼此连接的CONNACK消息之后,客户端会发送SUBSCRIBE消息,订阅感兴趣的Topic主题列表(至少一个主题),一个完整示范如下:

  Description 7 6 5 4 3 2 1 0
Fixed header/固定头部
byte 1   Message Type(8) DUP flag QoS level RETAIN
    1 0 0 0 0 0 1 x
byte 2 Remaining Length
Variable header/可变头部
Message Identifier
byte 1 Message ID MSB (0) 0 0 0 0 0 0 0 0
byte 2 Message ID LSB (10) 0 0 0 0 1 0 1 0
Playload/消息体
Topic name
byte 1 Length MSB (0) 0 0 0 0 0 0 0 0
byte 2 Length LSB (3) 0 0 0 0 0 0 1 1
byte 3 ‘a‘ (0x61) 0 1 1 0 0 0 0 1
byte 4 ‘/‘ (0x2F) 0 0 1 0 1 1 1 1
byte 5 ‘b‘ (0x62) 0 1 1 0 0 0 1 0
Requested QoS
byte 6 Requested QoS (1) x x x x x x 0 1
Topic Name
byte 7 Length MSB (0) 0 0 0 0 0 0 0 0
byte 8 Length LSB (3) 0 0 0 0 0 0 1 1
byte 9 ‘c‘ (0x63) 0 1 1 0 0 0 1 1
byte 10 ‘/‘ (0x2F) 0 0 1 0 1 1 1 1
byte 11 ‘d‘ (0x64) 0 1 1 0 0 1 0 0
Requested QoS
byte 12 Requested QoS (2) x x x x x x 1 0

固定头部

Qos Level,可根据实际情况进行调整为0/1/2等。一般设为0表示最多一次。客户端可设置OoS Level值。 DUP flag,值为0表示第一次发送。

可变头部

因为上面示范QoS level值为1,因此需要客户端传递消息ID,16位,无符号的short类型。

消息体

订阅的主题名称采用修改版UTF-8编码,然后紧跟着对应的QoS值。下面的次序,可能更为形象:

Topic name "a/b"
Requested QoS 1
Topic name "c/d"
Requested QoS 2

订阅者的Topic name支持通配符#和+ :

  1. #支持一个主题内任意级别话题
  2. +只匹配一个主题级别的通配符

eg:

finance/stock/#
finance/sotkc/ibm/+

都是有效,更具体规则,请参阅协议附加部分。

在服务器接收处理时,按照顺序读取即可:

String topicName = readUTF();
int qosVal = read();

服务器可以发送QoS不大于客户端设置OoS的消息,尤其是服务器不提供良好的持久化机制的时候。

SUBACK

服务器会对发出SUBSCRIBE的消息返回一个确认消息。

  Description 7 6 5 4 3 2 1 0
Fixed header/固定头部
byte 1   Message type (9) DUP flag QoS flags RETAIN
    1 0 0 1 x x x x
byte 2   Remaining Length
Variable header/可变头部
Message Identifier
byte 1 Message ID MSB (0) 0 0 0 0 0 0 0 0
byte 2 Message ID LSB (10) 0 0 0 0 1 0 1 0
Playload/消息体
byte 1 Granted QoS (0) x x x x x x 0 0
byte 1 Granted QoS (2) x x x x x x 1 0

可变头部

Message Identifier,服务器需要附加,客户端需要处理。

消息体

QoS,为服务器根据实际情况授予的QoS级别列表,和客户端发送的SUBSCRIBE的订阅Topic Name顺序完全一致。

客户端订阅几个TOPIC,服务器端一一给出各个TOPIC的QoS具体值。

UNSUBSCRIBE

服务器需要支持客户端取消订阅功能,UNSUBSCRIBE消息格式和SUBSCRIBE消息格式差不多,除了消息类型不同,消息体中没有了QoS字节,其它没有区别。

  Description 7 6 5 4 3 2 1 0
Fixed header/固定头部
byte 1   Message Type(10) DUP flag QoS level RETAIN
    1 0 1 0 0 0 1 x
byte 2 Remaining Length
Variable header/可变头部
Message Identifier
byte 1 Message ID MSB (0) 0 0 0 0 0 0 0 0
byte 2 Message ID LSB (10) 0 0 0 0 1 0 1 0
Playload/消息体
Topic name
byte 1 Length MSB (0) 0 0 0 0 0 0 0 0
byte 2 Length LSB (3) 0 0 0 0 0 0 1 1
byte 3 ‘a‘ (0x61) 0 1 1 0 0 0 0 1
byte 4 ‘/‘ (0x2F) 0 0 1 0 1 1 1 1
byte 5 ‘b‘ (0x62) 0 1 1 0 0 0 1 0
Topic Name
byte 6 Length MSB (0) 0 0 0 0 0 0 0 0
byte 7 Length LSB (3) 0 0 0 0 0 0 1 1
byte 8 ‘c‘ (0x63) 0 1 1 0 0 0 1 1
byte 9 ‘/‘ (0x2F) 0 0 1 0 1 1 1 1
byte 10 ‘d‘ (0x64) 0 1 1 0 0 1 0 0

可变头部的消息ID的出现还是由固定头部的QoS Level(1)决定是否存在。

一般来讲,客户端发布退订,服务器端需要返回退订确认。

MQTT没讲是否允许客户端退订所有TOPIC。

UNSUBACK

服务器返回的UNSUBSCRIBE消息UNSUBACK相应很简单,没有消息体。

  Description 7 6 5 4 3 2 1 0
Fixed header/固定头部
byte 1   Message type (9) DUP flag QoS flags RETAIN
    1 0 1 1 x x x x
byte 2   Remaining length (2)
    0 0 0 0 0 0 1 0
Variable header/可变头部
Message Identifier
byte 1 Message ID MSB (0) 0 0 0 0 0 0 0 0
byte 2 Message ID LSB (10) 0 0 0 0 1 0 1 0

小结

订阅部分,共有四个消息,分别一一对应。

命令 响应 备注 建议
SUBSCRIBE SUBACK 协议没有涉及最多运行订阅TOPIC数目,隐藏的隐患 建议至多10个
UNSUBSCRIBE UNSUBACK 是否可以退订所有订阅,不详 建议保留至少一个Topic

时间: 2024-10-02 09:54:27

MQTT协议笔记之订阅的相关文章

MQTT协议笔记之头部信息

前言 记忆不太好的时候,只能翻看以前的文章/笔记重新温习一遍,但找不到MQTT协议有关订阅部分的描述,好不容易从Evernote中找到贴出来,这样整个MQTT协议笔记,就比较齐全了. SUBSCRIBE 一般来讲,客户端在成功建立TCP连接之后,发送CONNECT消息,在得到服务器端授权允许建立彼此连接的CONNACK消息之后,客户端会发送SUBSCRIBE消息,订阅感兴趣的Topic主题列表(至少一个主题),一个完整示范如下:   Description 7 6 5 4 3 2 1 0 Fix

MQTT协议笔记之发布流程

MQTT协议笔记之发布流程 前言 这次要讲到客户端/服务器的发布消息行为,与PUBLISH相关的消息类型,会在这里看到. PUBLISH 客户端发布消息经由服务器分发到所有对应的订阅者那里.一个订阅者可以订阅若干个主题(Topic name),但一个PUBLISH消息只能拥有一个主题. 消息架构一览:   Description 7 6 5 4 3 2 1 0 Fixed header/固定头部 byte 1   Message Type(3) DUP flag QoS level RETAIN

MQTT协议笔记之消息流

前言 前面的笔记已把所有消息类型都过了一遍,这里从消息流的角度尝试解读一下. 网络故障 在任何网络环境下,都会出现一方连接失败,比如离开公司大门那一刻没有了WIFI信号.但持续连接的另一端-服务器可能不能立即知道对方已断开.类似网络异常情况,都有可能在消息发送的过程中出现,消息发送出去,就丢失了. MQTT协议假定客户端和服务器端稳定情况一般,彼此之通信管道不可靠,一旦客户端网络断开,情况就会很严重,很难恢复原状. 但别忘记,很多客户端会有永久性存储设备支持,比如闪存ROM.存储卡等,在通信出现

MQTT协议笔记之mqtt.io项目HTTP协议支持

前言 MQTT协议诞生之初,就未曾考虑通过HTTP传输.这也正常,网络受限.不稳定网络不太适合HTTP(2G/3G网络大家使用WAP不也OK嘛).在网络较为充裕的桌面端而言,虽纯文本对比二进制而言没多大优势,受制于历史遗留和使用习惯,以及一大票传统基础设施方便控制事宜,传统互联网/企业型应用,HTTP协议都是默认最佳选择,安全可控,人机友好.选择HTTP也在情理之中. 虽桌面端日渐式微,但做统一的全平台化消息系统/消息中间件,也是趋势. MQTT OVER HTTP,为WEB环境提供HTTP通道

MQTT协议笔记之mqtt.io项目Websocket协议支持

前言 MQTT协议专注于网络.资源受限环境,建立之初不曾考虑WEB环境,倒也正常.虽然如此,但不代表它不适合HTML5环境. HTML5 Websocket是建立在TCP基础上的双通道通信,和TCP通信方式很类似,适用于WEB浏览器环境.虽然MQTT基因层面选择了TCP作为通信通道,但我们添加个编解码方式,MQTT Over Websocket也可以的. 这样做的好处,MQTT的使用范畴被扩展到HTML5.桌面端浏览器.移动端WebApp.Hybrid等,多了一些想像空间.这样看来,无论是移动端

MQTT协议笔记之连接和心跳

前言 本篇会把连接(CONNECT).心跳(PINGREQ/PINGRESP).确认(CONNACK).断开连接(DISCONNECT)和在一起. CONNECT 像前面所说,MQTT有关字符串部分采用的修改版的UTF-8编码,CONNECT可变头部中协议名称.消息体都是采用修改版的UTF-8编码.前面基本上可变头部内容不多,下面是一个较为完整的CONNECT消息结构:   Description 7 6 5 4 3 2 1 0 Fixed header/固定头部     Message Typ

MQTT协议笔记之mqtt.io项目TCP协议支持

前言 MQTT定义了物联网传输协议,其标准倾向于原始TCP实现.构建于TCP的上层协议堆栈,诸如HTTP等,在空间上多了一些处理路径,稍微耗费了CPU和内存,虽看似微乎其微,但对很多处理能力不足的嵌入式设备而言,选择原始的TCP却是最好的选择. 但单纯TCP不是所有物件联网的最佳选择,提供构建与TCP基础之上的传统的HTTP通信支持,尤其是浏览器.性能富裕的桌面涉及领域,还是企业最 可信赖.最可控的传输方式之一.支持多种多样的连接通道,让目前所有一切皆可联网,除了原始TCP Socket,还要支

MQTT协议-----订阅

MQTT协议笔记之订阅      http://www.blogjava.net/yongboy/archive/2014/04/12/412351.html MQTT - chszs的专栏    http://blog.csdn.net/chszs/article/category/6262440 MQTT的学习研究(十一) IBM MQTT 简单发布订阅实例    http://blog.csdn.net/shayuye/article/details/17590497

MQTT学习笔记——树莓派MQTT客户端 使用Mosquitto和paho-python

0 前言 本文说明如何在树莓派上安装Mosquitto.本文通过两个简单的例子说明树莓派中如何使用MQTT协议实现消息订阅,这些例子包括Mosquitto_sub指令实现消息订阅和paho-python扩展库实现GPIO端口的远程控制.本文中使用了两个工具--Mosquitto paho-python,其中Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的消息通信简单易用:另外,paho-python是一个