MQTT協(xié)議及應(yīng)用場景

背景

近來公司需要做一個即時通訊工具秆吵,選型用MQTT協(xié)議來做。于是仔細(xì)搜集MQTT相關(guān)的了一些資料五慈,并分享出來供大家參考纳寂。

MQTT簡介

MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測傳輸)是IBM開發(fā)的一個即時通訊協(xié)議泻拦,它是一種輕量級的毙芜、基于代理的“發(fā)布/訂閱”模式的消息傳輸協(xié)議。其具有協(xié)議簡潔争拐、小巧腋粥、可擴(kuò)展性強(qiáng)晦雨、省流量、省電等優(yōu)點(diǎn)隘冲,而且已經(jīng)有PHP闹瞧,JAVA,Python展辞,C奥邮,C#,Go等多個語言版本罗珍,基本可以使用在任何平臺上洽腺,幾乎可以把所有聯(lián)網(wǎng)物品和外部連接起來,所以特別適合用來當(dāng)做物聯(lián)網(wǎng)的通信協(xié)議覆旱。

MQTT特點(diǎn)

MQTT協(xié)議是為大量計(jì)算能力有限蘸朋,且工作在低帶寬、不可靠的網(wǎng)絡(luò)的遠(yuǎn)程傳感器和控制設(shè)備通訊而設(shè)計(jì)的協(xié)議扣唱,它具有以下主要的幾項(xiàng)特性:

  1. 使用發(fā)布/訂閱消息模式藕坯,提供一對多的消息發(fā)布,解除應(yīng)用程序耦合画舌;
  • 對負(fù)載內(nèi)容屏蔽的消息傳輸堕担;
  • 使用 TCP/IP 提供網(wǎng)絡(luò)連接;
  • 有三種消息發(fā)布服務(wù)質(zhì)量:
    • “至多一次”曲聂,消息發(fā)布完全依賴底層 TCP/IP 網(wǎng)絡(luò)。會發(fā)生消息丟失或重復(fù)佑惠。這一級別可用于如下情況朋腋,環(huán)境傳感器數(shù)據(jù),丟失一次讀記錄無所謂膜楷,因?yàn)椴痪煤筮€會有第二次發(fā)送旭咽。
    • “至少一次”,確保消息到達(dá)赌厅,但消息重復(fù)可能會發(fā)生穷绵。
    • “只有一次”,確保消息到達(dá)一次特愿。這一級別可用于如下情況仲墨,在計(jì)費(fèi)系統(tǒng)中,消息重復(fù)或丟失會導(dǎo)致不正確的結(jié)果揍障。
  • 小型傳輸目养,開銷很小(固定長度的頭部是 2 字節(jié))毒嫡,協(xié)議交換最小化癌蚁,以降低網(wǎng)絡(luò)流量;
  • 使用 Last Will 和 Testament 特性通知有關(guān)各方客戶端異常中斷的機(jī)制;

MQTT協(xié)議特征

  1. 消息模型
      MQTT是一種基于代理的發(fā)布/訂閱的消息協(xié)議努释。提供一對多的消息分發(fā)碘梢,解除應(yīng)用程序耦合。一個發(fā)布者可以對應(yīng)多個訂閱者伐蒂,當(dāng)發(fā)布者發(fā)生變化的時候煞躬,他可以將消息一一通知給所有的訂閱者。這種模式提供了更大的網(wǎng)絡(luò)擴(kuò)展性和更動態(tài)的網(wǎng)絡(luò)拓?fù)洹?br>
    MQTT 消息傳輸模型
  • 消息質(zhì)量
    MQTT提供三種質(zhì)量的服務(wù):
    1. 至多一次饿自,可能會出現(xiàn)丟包的現(xiàn)象汰翠。使用在對實(shí)時性要求不高的情況。這一級別可應(yīng)用于如下情景昭雌,如環(huán)境傳感器數(shù)據(jù)复唤,丟失一次讀記錄無所謂,因?yàn)楹芸煜乱淮巫x記錄就會產(chǎn)生烛卧。
    • 至少一次佛纫,保證包會到達(dá)目的地,但是可能出現(xiàn)重包总放。
    • 正好一次呈宇,保證包會到達(dá)目的地,且不會出現(xiàn)重包的現(xiàn)象局雄。這一級別可用于如計(jì)費(fèi)系統(tǒng)等場景甥啄,在計(jì)費(fèi)系統(tǒng)中,消息丟失或重復(fù)可能會導(dǎo)致生成錯誤的費(fèi)用炬搭。
  • 主題名稱
      主題名稱(Topic name)用來標(biāo)識已發(fā)布消息的信息的渠道蜈漓。訂閱者用它來確定接收到所關(guān)心的信息。它是一個分層的結(jié)構(gòu)宫盔,用斜線“/”作為分隔符融虽。有兩種通配符可以在主題發(fā)布、訂閱時使用:“#”和“+”灼芭。前者可以通配多層結(jié)構(gòu)有额,而后者只能通配一層結(jié)構(gòu)。例如一個topic : “a/b/c”,則“a/+/c”和“a/#”都可以和它相等彼绷。發(fā)布不支持模糊匹配巍佑,必須是確定的主題。
  • 遺屬
      當(dāng)一個客戶端斷開連接的時候苛预,它希望客戶端可以發(fā)送它指定的消息句狼。該消息和普通消息的結(jié)構(gòu)相同。通過設(shè)置該位并填入和信息相關(guān)的內(nèi)容即可热某。
  • 消息類型
消息類型 類型編碼 說明
reserved 0 保留
connect 1 客戶端到服務(wù)端的連接請求
connACK 2 服務(wù)端對連接請求的響應(yīng)
publish 3 發(fā)布消息
puback 4 對發(fā)布消息的回應(yīng)
pubRec 5 收到發(fā)布消息(保證傳輸part1)
pubRel 6 釋放發(fā)布消息(保證傳輸part2)
pubComp 7 完成發(fā)布消息(保證傳輸part3)
subscribe 8 客戶端訂閱請求
subBack 9 訂閱請求的回應(yīng)
unsubscribe 10 停止訂閱請求
unsubBack 11 停止訂閱請求響應(yīng)
pingReq 12 Ping請求(保持連接)
pingResp 13 Ping響應(yīng)
disconnect 14 客戶端正在斷開
reserved 15 保留

開發(fā)一個MQTT庫需要提供如下命令:
Connect :當(dāng)一個TCP/IP套接字在服務(wù)器端和客戶端連接建立時需要使用的命令腻菇。
publish : 是由客戶端向服務(wù)端發(fā)送胳螟,告訴服務(wù)器端自己感興趣的Topic。每一個publishMessage 都會與一個Topic的名字聯(lián)系在一起筹吐。
pubRec: 是publish命令的響應(yīng)糖耸,只不過使用了2級QoS協(xié)議。它是2級QoS協(xié)議的第二條消息
pubRel: 是2級QoS協(xié)議的第三條消息
publComp: 是2級QoS協(xié)議的第四條消息
subscribe: 允許一個客戶端注冊自已感興趣的Topic 名字丘薛,發(fā)布到這些Topic的消息會以publish Message的形式由服務(wù)器端發(fā)送給客戶端嘉竟。
unsubscribe: 從客戶端到服務(wù)器端,退訂一個Topic洋侨。
Ping: 有客戶端向服務(wù)器端發(fā)送的“are you alive”的消息舍扰。
disconnect:斷開這個TCP/IP協(xié)議。

MQTT服務(wù)端和客戶端

MQTT協(xié)議服務(wù)端:https://github.com/mqtt/mqtt.github.io/wiki/servers
MQTT協(xié)議類庫:https://github.com/mqtt/mqtt.github.io/wiki/libraries
MQTT協(xié)議官網(wǎng):http://mqtt.org/

應(yīng)用場景

推送

再給大家普及下“推送”這個概念希坚,推送這個詞大部分人都會有印象的边苹。比如PC端的推送廣告,比如安卓的推送服務(wù)裁僧,還有一些即時通信軟件如微信个束、易信等也是采用的推送技術(shù)。
  現(xiàn)在的推送實(shí)現(xiàn)的方式已經(jīng)非常多了聊疲,主流的有C2DM服務(wù)(Google Cloud Messaging)茬底,基于XML協(xié)議的通訊協(xié)議XMPP協(xié)議(Openfire + Spark + Smack), 輕量級的、基于代理的“發(fā)布/訂閱”模式的消息傳輸協(xié)議MQTT協(xié)議获洲,還可以通過嵌入SDK使用第三方提供的推送服務(wù)阱表,如百度云推送極光推送贡珊、智游推送捶枢、騰訊信鴿等。
  推送利用的也是類似于上面提到的代理技術(shù)飞崖,從而將數(shù)據(jù)源源不斷地推向客戶機(jī)。筆者對其它協(xié)議了解不多所以也不敢多做妄言谨胞,但是現(xiàn)在國內(nèi)很多企業(yè)都已經(jīng)廣泛使用MQTT作為Android手機(jī)客戶端與服務(wù)器端推送消息的協(xié)議固歪。其中Sohu,Cmstop手機(jī)客戶端中均有使用到MQTT作為消息推送消息胯努。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牢裳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叶沛,更是在濱河造成了極大的恐慌蒲讯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灰署,死亡現(xiàn)場離奇詭異判帮,居然都是意外死亡局嘁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門晦墙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悦昵,“玉大人,你說我怎么就攤上這事晌畅〉福” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵抗楔,是天一觀的道長棋凳。 經(jīng)常有香客問我,道長连躏,這世上最難降的妖魔是什么剩岳? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮反粥,結(jié)果婚禮上卢肃,老公的妹妹穿的比我還像新娘。我一直安慰自己才顿,他們只是感情好莫湘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著郑气,像睡著了一般幅垮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尾组,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天忙芒,我揣著相機(jī)與錄音,去河邊找鬼讳侨。 笑死呵萨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的跨跨。 我是一名探鬼主播潮峦,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勇婴!你這毒婦竟也來了忱嘹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤耕渴,失蹤者是張志新(化名)和其女友劉穎拘悦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橱脸,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡础米,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年分苇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭盏。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡组砚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掏颊,到底是詐尸還是另有隱情糟红,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布乌叶,位于F島的核電站盆偿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏准浴。R本人自食惡果不足惜事扭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乐横。 院中可真熱鬧求橄,春花似錦、人聲如沸葡公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽催什。三九已至涵亏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒲凶,已是汗流浹背气筋。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旋圆,地道東北人宠默。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像灵巧,于是被迫代替她去往敵國和親光稼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理孩等,服務(wù)發(fā)現(xiàn),斷路器采够,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 最近項(xiàng)目需要做到網(wǎng)絡(luò)環(huán)境復(fù)雜 網(wǎng)絡(luò)環(huán)境差的情況下 實(shí)時刷新終端(凈化器)狀態(tài)肄方,客戶端數(shù)據(jù),相比較于htt...
    Mr_不靠譜_先森閱讀 2,200評論 0 4
  • MQTT Protocol MQTT協(xié)議特性 一句話總結(jié):MQTT是一個簡單蹬癌,輕量的消息發(fā)布/訂閱協(xié)議权她。 MQTT...
    负绮瑁克斯記閱讀 7,247評論 0 9
  • http://www.atool.org/ios_logo.phphttps://icon.wuruihong.com/
    稻草人12138閱讀 1,001評論 0 0
  • 注: 效果:水彩邊界 筆刷:水彩及其他 FIN
    拾壹曰11閱讀 270評論 0 2