聂永的博客

记录工作/学习的点点滴滴。

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 阅读(11204) 评论(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)

个人收藏

最新随笔

搜索

最新评论

阅读排行榜

评论排行榜