聶永的博客

          記錄工作/學習的點點滴滴。

          MQTT協議筆記之mqtt.io項目Websocket協議支持

          前言

          MQTT協議專注于網絡、資源受限環境,建立之初不曾考慮WEB環境,倒也正常。雖然如此,但不代表它不適合HTML5環境。

          HTML5 Websocket是建立在TCP基礎上的雙通道通信,和TCP通信方式很類似,適用于WEB瀏覽器環境。雖然MQTT基因層面選擇了TCP作為通信通道,但我們添加個編解碼方式,MQTT Over Websocket也可以的。

          這樣做的好處,MQTT的使用范疇被擴展到HTML5、桌面端瀏覽器、移動端WebApp、Hybrid等,多了一些想像空間。這樣看來,無論是移動端,還是WEB端,MQTT都會有自己的使用空間。

          瀏覽器支持

          話說,現代化瀏覽器都已經支持Websocket,這里有一個所有瀏覽器支持列表:

          b84feb4f-ff91-45fc-9798-ce6f44e76af9

          更詳細列表,請直接訪問:http://caniuse.com/websockets

          毫無疑問,火狐和谷歌瀏覽器帶動了現代瀏覽器的發展,對HTML5標準的支持也是如此。支持Websocket的瀏覽器單純從上面數字來講,73.88%的支持率。但實際上還得參考瀏覽器市場占有率:

          1[1]

          上圖數據,來源于: 2014年4月份全球主流瀏覽器市場份額排行榜

          超過60%用戶機器上瀏覽器的支持Websocket,數據很可觀。

          移動hybrid型應用會很歡迎Websocket

          • 內置瀏覽器支持HTML5,Javascript操作Websocket連接MQTT
          • 借助于原生TCP socket通道連接MQTT服務器,暴露JavaScript接口,間接使用

          不支持Websocket的桌面瀏覽器,可以考慮Flash socket來幫忙!

          針對不支持websocker的部分歷史瀏覽器,可以考慮一下Flash socket,雖然使用Flashsocket用以模擬Websocket就很容易理解,但條件如下: - 需要單獨占用一個端口專用于安全跨域訪問策略 - 需要瀏覽器支持二進制Blob 支持二進制操作的瀏覽器現狀:

          xhr2

          來源于:http://caniuse.com/xhr2

          比較一下支持Websocket和XHR2的桌面瀏覽器,重疊率很高,使用Flash Socket用以模擬Websocket必要性不大,在類似于IE平臺上,不如直接使用Flash版本的

          https://github.com/yangboz/as3MQTT/tree/master/MQTTClient_AS3

          不支持Websocket瀏覽器怎么辦

          不是所有瀏覽器都支持Websocket,尤其是阻礙歷史發展的IE6/IE7/IE8/IE9。MQTT協議為二進制協議壓根和HTTP純文本不兼容,尤其瀏覽器端JavaScript處理文本很合適,但二進制就顯得笨手笨角,除非支持XHR2。

          1. 單獨使用Flash MQTT Client,這這方面見解不深,實踐很少,不便多說,您要是很了解,不妨告知一二。
          2. HTTP純文本方式進行二進制對接

          這部分后面專門會講到。

          服務器端支持

          現有一些解決方案可能是后面為MQTT Broker,前面是添加一層代理。比如:例如 mod_websocket ,對應在線示范:http://test.mosquitto.org/ws.html

          表面上看著很解藕的,實際上模仿的還是傳統型的短連接反向代理架構:Nginx/Apache +Java/PHP/Python/Ruby。

          客戶端建立一條連接,服務器端需要使用到至少兩個文件句柄,中間多了一層路徑。優雅的解決方案,可以向socket.io看起。一套服務端程序,同時提供若干種協議供終端選擇。其實,一臺MQTT Broker中間件服務器,可以綁定多個端口,一個面向純TCP的1883端口,一個面向Websocket的80/8080端口,共享基礎邏輯,面向不同協議。

          Websocket協議適配

          服務器添加對Websocket支持,基本不用做多大改動。對比Tcp的附加到單個Channel的處理器列表:

          Websocket對應單個Channel的處理器列表:

          為了支持Websocket協議,僅僅額外增加了:

          小結

          啰啰嗦嗦的講了一大通Websocket,總之對Websocket的支持還算容易。后面有時間寫寫如何使用HTTP協議達到MQTT OVER HTTP的效果。

          posted on 2014-05-26 19:14 nieyong 閱讀(11229) 評論(4)  編輯  收藏 所屬分類: MQTT

          評論

          # re: MQTT協議筆記之mqtt.io項目Websocket協議支持 2014-06-12 20:52 泡菜

          這些內容對于我來說真的是很深,一點頭緒都找不到啊!  回復  更多評論   

          # re: MQTT協議筆記之mqtt.io項目Websocket協議支持 2015-02-04 19:26 allankliu

          您好,我專注于硬件和物聯網。最近發現客戶此類要求越發急迫。

          許多嵌入式設備往往使用基礎的UDP/TCP通訊,客戶不愿意大規模改動,往往使用socketserver,比如Python socketserver/twisted以及相關小規模框架。但是這些框架往往缺乏商業化所必須的RBAC(權限管理)以及其他的必備組件。

          所以,我選用了web2py/Django作為WebAPP框架以實施WebServer。但是這樣,我的框架就變成了socket server,web server的兩個服務器。出于數據庫管理和安全考慮,從web server處引出API給socket server。

          感覺不優雅,可能性能也會有問題。你可能發現我喜歡使用Python,因為我可以使用同一語言在嵌入式,服務器和客戶端。

          在調研過CoAP/MQTT等協議后,也發現了Python相關軟件包。但是看到您提到node.js/socket.io可以實施多種協議,是一個服務器實施多個端口監聽么?

          性能如何?此外,node.js/socket.io是否具備我們常見的服務器框架的必備功能,如路徑管理,RBAC。雖然使用jQuery時使用JS,但是我自認為還不是很合格的JS開發者。不知道使用node.js開發服務器和Python/PHP開發服務器難度上差別如何?  回復  更多評論   

          # re: MQTT協議筆記之mqtt.io項目Websocket協議支持 2015-02-05 14:51 nieyong

          @allankliu
          第一個問題:一個服務器可以綁定多個端口,每一個端口各司其職即可,但需要應用程序支持才行。但可能會造成功能耦合在了一起。
          第二個問題:node.js我不熟,不好回答。

            回復  更多評論   

          # re: MQTT協議筆記之mqtt.io項目Websocket協議支持 2015-03-03 18:39 joeytian

          @allankliu
          很開心看到你做的和我有很大的相似性。我目前還在嘗試用twisted來構建網關服務,主要是看中其異步和多協議支持。希望有機會交流(whatkao#gmail.com)  回復  更多評論   

          公告

          所有文章皆為原創,若轉載請標明出處,謝謝~

          新浪微博,歡迎關注:

          導航

          <2015年2月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          1234567

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 奉新县| 壤塘县| 大洼县| 南平市| 繁昌县| 稻城县| 乐陵市| 桑日县| 定襄县| 南平市| 耒阳市| 康乐县| 隆林| 江城| 馆陶县| 芮城县| 克什克腾旗| 新丰县| 彭山县| 南城县| 莱阳市| 建瓯市| 康平县| 阜康市| 无极县| 涪陵区| 马鞍山市| 牙克石市| 玛多县| 阳春市| 镇沅| 安国市| 南召县| 尉犁县| 石首市| 大理市| 都安| 吕梁市| 滨海县| 文登市| 保靖县|