開始
MQTT協(xié)議的開發(fā)公司,誕生時間等信息台囱,可以通過google先生去查淡溯,這里就省略了。只說以下幾個信息簿训。
- 最新版本3.1.1
- 協(xié)議的詳細內(nèi)容咱娶,有各個語言版本的說明米间。中文版鏈接
- linux上最常用的是mosquitto
優(yōu)點
- 十分輕量,最小可以做到2byte膘侮。處理速度快屈糊,占用帶寬小。特別適合在M2M場景下使用琼了。
- 可以做到一對一逻锐,一對多,雙向通信
- 實際上也是基于TCP/IP的
- 消息可控可處理雕薪。采用pub/sub的方式昧诱,pub端發(fā)送某一主題的消息給服務(wù)器,sub訂閱某些主題所袁。中間的服務(wù)器可以進行很多處理盏档,然后分發(fā)消息給sub。
主題管理
sub只能接收訂閱的主題燥爷。主題可以使用[/]來設(shè)定成階層的構(gòu)造蜈亩。
比如sub端想接收某一個服務(wù)器(或者是數(shù)據(jù)中心)的溫度濕度消息。
/datacenter/abc/tokyo/floor/01/temperature
/datacenter/abc/tokyo/floor/01/humidity
/datacenter/abc/osaka/floor/01/temperature
/datacenter/abc/osaka/floor/01/humidity
/datacenter/xyz/tokyo/floor/05/temperature
/datacenter/xyz/tokyo/floor/05/humidity
/datacenter/xyz/nagoya/floor/12/temperature
/datacenter/xyz/nagoya/floor/12/humidity
sub端可以使用一些符號前翎,模糊訂閱一批主題稚配。
- 準確訂閱
/datacenter/abc/tokyo/floor/01/temperature
ABC數(shù)據(jù)中心的tokyo的1層的溫度
- 前方一致訂閱
/datacenter/xyz/nagoya/#
使用[#]獲取 xyz數(shù)據(jù)中心的nagoya的所有階層的溫度和濕度
- 部分一致訂閱
/datacenter/+/tokyo/floor/+/humidity
使用[+]獲取所有數(shù)據(jù)中心的tokyo的所有階層的濕度
[#]和[+]可以組合使用。
** 有意思的是sub可以使用通配符訂閱鱼填,pub端卻不能使用药有,必須發(fā)布完整的主題名 **
QoS
pub 發(fā)布消息到達sub端,可以指定以下三種品質(zhì)等級
QoS0 : 就發(fā)送一次苹丸,sub收到收不到都不再重新發(fā)愤惰。
**QoS1 **: 保證至少sub端收到一次。但是有可能多次接到赘理。
- pub發(fā)送出去后宦言,需要sub返回一個【已收到】的回信。如果pub在一定時間未收到回信商模,會重復發(fā)送同一個消息奠旺,直到收到sub的回信。
QoS2 : 保證至少且只有一次sub端接到消息施流。
- 這個屬于比較有意思的一項响疚。需要來回兩次,每次攜帶的狀態(tài)碼都不一樣瞪醋。在成功前忿晕,會一直重復發(fā)送。直到最終成功银受。
遺言機制
協(xié)議有專門設(shè)定遺言的標志: Will Flag践盼。同時會影響另外兩個位(Will Qos和Will Retain)是否有效鸦采。
Will Flag
就是pub客戶端預先定義好,在自己跟MQTT服務(wù)器異常斷開的情況下咕幻,所留下的最后遺愿(Last Will)渔伯,也稱之為遺囑(Testament)阅爽。 這個遺囑就是一個由客戶端預先定義好的主題和對應(yīng)消息敏簿,附加在CONNECT的可變頭部中,在客戶端連接出現(xiàn)異常的情況下杖玲,由服務(wù)器主動發(fā)布此消息绷耍。
只有在Will Flag位為1時吐限,Will Qos和Will Retain才會被讀取,此時消息體Playload中要出現(xiàn)Will Topic和Will Message具體內(nèi)容褂始,否則诸典,Will QoS和Will Retain值會被忽略掉。
Will Qos
兩位表示崎苗,和PUBLISH消息固定頭部的QoS level含義一樣狐粱。
若標識了Will Flag值為1,那么Will QoS就會生效胆数,否則會被忽略掉肌蜻。
Will RETAIN
如果設(shè)置Will Flag,Will Retain標志就是有效的必尼,否則它將被忽略蒋搜。
當客戶端意外斷開服務(wù)器發(fā)布其Will Message之后,服務(wù)器是否應(yīng)該繼續(xù)保存判莉。這個屬性和PUBLISH固定頭部的RETAIN標志含義一樣豆挽。
PUBLISH固定頭部的RETAIN
定義MQTT服務(wù)器是否保留最后一次pub傳遞過來的消息。如果保留的話券盅,當下一次消息發(fā)布前帮哈,如果有心的sub端加入,那么就把MQTT上保留的消息發(fā)送給新追加的sub端锰镀。
比如:一個小時或者一天才發(fā)布一次娘侍,新的消息接收端(sub端)卻隨時會追加的場景,就適合設(shè)定設(shè)定RETAIN泳炉。