MQTT協議筆記之mqtt.io項目Websocket協議支持
前言
MQTT協議專注于網絡、資源受限環境,建立之初不曾考慮WEB環境,倒也正常。雖然如此,但不代表它不適合HTML5環境。
HTML5 Websocket是建立在TCP基礎上的雙通道通信,和TCP通信方式很類似,適用于WEB瀏覽器環境。雖然MQTT基因層面選擇了TCP作為通信通道,但我們添加個編解碼方式,MQTT Over Websocket也可以的。
這樣做的好處,MQTT的使用范疇被擴展到HTML5、桌面端瀏覽器、移動端WebApp、Hybrid等,多了一些想像空間。這樣看來,無論是移動端,還是WEB端,MQTT都會有自己的使用空間。
瀏覽器支持
話說,現代化瀏覽器都已經支持Websocket,這里有一個所有瀏覽器支持列表:
更詳細列表,請直接訪問:http://caniuse.com/websockets
毫無疑問,火狐和谷歌瀏覽器帶動了現代瀏覽器的發展,對HTML5標準的支持也是如此。支持Websocket的瀏覽器單純從上面數字來講,73.88%的支持率。但實際上還得參考瀏覽器市場占有率:
上圖數據,來源于: 2014年4月份全球主流瀏覽器市場份額排行榜
超過60%用戶機器上瀏覽器的支持Websocket,數據很可觀。
移動hybrid型應用會很歡迎Websocket
- 內置瀏覽器支持HTML5,Javascript操作Websocket連接MQTT
- 借助于原生TCP socket通道連接MQTT服務器,暴露JavaScript接口,間接使用
不支持Websocket的桌面瀏覽器,可以考慮Flash socket來幫忙!
針對不支持websocker的部分歷史瀏覽器,可以考慮一下Flash socket,雖然使用Flashsocket用以模擬Websocket就很容易理解,但條件如下: - 需要單獨占用一個端口專用于安全跨域訪問策略 - 需要瀏覽器支持二進制Blob 支持二進制操作的瀏覽器現狀:
比較一下支持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。
- 單獨使用Flash MQTT Client,這這方面見解不深,實踐很少,不便多說,您要是很了解,不妨告知一二。
- 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