序
在MQTT協(xié)議中养渴,最重要的就是發(fā)布/訂閱,下面重點分析下消息訂閱争群。
SUBSCRIBE
一般來講,客戶端在成功建立TCP連接之后大年,發(fā)送CONNECT消息换薄,在得到服務器端授權允許建立彼此連接的CONNACK消息之后,客戶端會發(fā)送SUBSCRIBE消息翔试,訂閱感興趣的Topic主題列表(至少一個主題)轻要,一個完整示范如下:
固定頭部
Qos Level,可根據(jù)實際情況進行調整為0/1/2等垦缅。一般設為0表示最多一次冲泥。客戶端可設置OoS Level值壁涎。 DUP flag凡恍,值為0表示第一次發(fā)送。
可變頭部
因為上面示范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支持通配符#和+ :
- #支持一個主題內任意級別話題
- +只匹配一個主題級別的通配符
eg:
finance/stock/#
finance/sotkc/ibm/+
都是有效涎跨,更具體規(guī)則,請參閱協(xié)議附加部分崭歧。
在服務器接收處理時隅很,按照順序讀取即可:
String topicName = readUTF();
int qosVal = read();
服務器可以發(fā)送QoS不大于客戶端設置OoS的消息,尤其是服務器不提供良好的持久化機制的時候驾荣。
SUBACK
服務器會對發(fā)出SUBSCRIBE的消息返回一個確認消息外构。
可變頭部
Message Identifier,服務器需要附加播掷,客戶端需要處理审编。
消息體
QoS,為服務器根據(jù)實際情況授予的QoS級別列表歧匈,和客戶端發(fā)送的SUBSCRIBE的訂閱Topic Name順序完全一致垒酬。
客戶端訂閱幾個TOPIC,服務器端一一給出各個TOPIC的QoS具體值。
UNSUBSCRIBE
服務器需要支持客戶端取消訂閱功能勘究,UNSUBSCRIBE消息格式和SUBSCRIBE消息格式差不多矮湘,除了消息類型不同,消息體中沒有了QoS字節(jié)口糕,其它沒有區(qū)別缅阳。
可變頭部的消息ID的出現(xiàn)還是由固定頭部的QoS Level(1)決定是否存在。
一般來講景描,客戶端發(fā)布退訂十办,服務器端需要返回退訂確認。
MQTT沒講是否允許客戶端退訂所有TOPIC超棺。
UNSUBACK
服務器返回的UNSUBSCRIBE消息UNSUBACK相應很簡單向族,沒有消息體。
小結
訂閱部分棠绘,共有四個消息件相,分別一一對應。
命令 | 響應 | 備注 | 建議 |
---|---|---|---|
SUBSCRIBE | SUBACK | 協(xié)議沒有涉及最多運行訂閱TOPIC數(shù)目氧苍,隱藏的隱患 | 建議至多10個 |
UNSUBSCRIBE | UNSUBACK | 是否可以退訂所有訂閱夜矗,不詳 | 建議保留至少一個Topic |