消息触达能力是物联网(internet ofthings, IOT)的重要支撑,而物联网不少技术都源于移动互联网。本文阐述移动互联网消息推送技术在物联网中的应用和演进。前端
IP互联架构已经是物联网的事实标准(有关物联网TCP/IP层关键技术将另文阐述,敬请关注)。本文所讲的消息推送技术是基于TCP/IP协议的应用层协议技术。web
咱们先进一步抽象基于IP架构的物联网组成,以下图(忽略internet和路由等基础技术):ajax
可见,核心组成就是物联设备things、网关和云端。物联设备分为两类,一类是其自身自然支持TCP/IP而能直接接入物联网,如wifi、GPRS/3G/4G等设备;另外一类是其未能支持IP协议而须要网关(协议转换)来接入物联网,如Zigbee、蓝牙等设备。对于蓝牙设备而言,手机实际上是一个网关。编程
手机经过自身的蓝牙跟外设蓝牙设备通讯,并将消息经过手机的wifi或者3G/4G模块与云服务端通讯。浏览器
从场景的角度来分析,物联网最终是给人类服务的,而手机是人类体验的最直接入口。所以在上图中能够单独添加手机组成部分,并将其与通常意义上的网关区分出来。这样物联网核心组成就是:设备端—网关—云端—手机。服务器
从应用层开发技术的角度来看,物联网应用是基于TCP/IP架构创建,在屏蔽底层的网关协议转换的基础上,物联网应用的组成部分就是:设备端—云端—手机。微信
OK,有了以上的介绍,咱们就从物联网应用的角度来分析设备、云端、手机直接的消息推送技术,它包括云端和设备端的双向通讯技术、手机和云端的双向通讯技术。网络
互联网有B/S和C/S两种通讯模式。在移动互联网领域,APP是以C/S的方式以client的角色跟服务器server进行通讯;而微信是一个超级APP,其是经过内置浏览器让用户进行H5编程以得到操控硬件设备的能力,所以微信硬件平台的通讯模块是B/S模式。架构
移动互联网B/S技术跟传统互联网没有区别,微信内置浏览器支持H5,所以能够得到很好的平台扩展性。咱们近期重点关注基于微信硬件平台的物联网,所以就围绕B/S模式的消息推送技术讲述其演进。框架
HTTP协议是B/S的基础,HTTP有GET和POST两种方式。
浏览器使用HTML文本标记语言,即浏览器经过HTTP协议向服务器发起请求(请求内容包括URL,即咱们常说的网址),服务器将URL对应的HTML内容经过HTTP协议做为响应传送回给浏览器。
1)手机端。微信端由于有内置浏览器,其自然支持前端页面。
2) 云端对手机端推送。云端使用JSP/PHP等技术开发设计前端网页和简单的逻辑便可。
3)设备端。设备端上线时或者访问服务端参数等内容时须要模拟HTTP协议(C语言)向服务器发起请求,而请求的格式通常不使用HTML,而是使用较为简单的XML或者JSON协议格式。
4)云端对设备端推送。云端使用HttpServlet(即便用http协议的servlet)对设备的HTTP请求进行响应,回复XML或者JSON格式的消息。
5)缺点。这种方式通讯方式的特色就是一请求一响应,老是要客户端向服务器发出请求,服务器才给予响应。服务器历来都不会主动给客户端发消息,并且在客户端发出请求后,服务器也只是回复一次。这种HTTP单向通讯方式在互联网领域发挥巨大的做用,就是服务器端能够是无状态的,极大地简化了服务器的服务流程,提升效率。但在物联网领域,咱们要求的是双向的通讯能力。服务端要能主动给设备端或者手机发出消息。
在这种模式下,咱们怎么作双向通讯呢?惟一的作法就是客户端不断地发出请求(或者周期性),服务器不断地给予回复。这种模式下的缺点显而易见:一是网络负载重,服务器每次响应后都会关闭链接,因此每次通讯都得从新握手。HTTP协议的头内容的长度可不小。二是实时性差。通常设备端都是周期性地轮询服务器是否有新的消息,轮询的方式是不能得到好的实时性的。3、浏览器端每次发出请求是以HTML所有内容来响应的,消息长度过大,在这种状况下,会发现浏览器页面不断地刷新。
Ajax技术是浏览器支持的一种JavaScript技术。其可以局部改善用户体验技术,让用户在不察觉浏览器页面刷新的状况向服务器发出请求,并得到响应。其原理是:
1)微信浏览器发出URL页面请求,服务器响应HTML页面内容。
2)HTML页面使用js调用XMLHttpRequest来向服务器发出异步通讯请求。
3)服务器响应XML格式数据给浏览器页面。
4)HTML页面使用DOM模型来动态刷新页面元素。
Ajax技术是微信硬件平台框架中推荐的页面交互技术,但其本质仍是遵照HTTP单向通讯的规则,只是页面交互时不须要刷新整个页面。其双向通讯实时性问题依然未能解决。
Websocket是HTML5支持的一种新的协议,它可以真正支持浏览器和服务器之间进行双向通讯。Tomcat7及以上版本也已经支持Websocket API。
1)为了可以兼容浏览器HTTP协议,Websocket规定在第一次发起请求时依然要发出符合HTTP协议规范的Header,但其Connection域的值是Upgrade,并增长Upgrade域,值是socket,即告知服务器,即将创建的通讯是Websocket双向通讯。服务器若是接受,会返回101给客户端进行协议切换。
2)接下来的通讯将再也不以HTTP做为传输协议,而是使用Websocket规定的数据格式进行通讯,其分为控制帧和数据帧。控制帧是发出心跳帧(ping),而服务器响应pong,还有结束帧;数据帧就是真实数据格式,其格式头只有6个字节(2个字节头和4个字节的掩码),后面就是真实的数据(通过掩码转换)。比HTTP格式头的长度要小多了。
3)客户端和服务器之间是一直保持链接,直到close,当前期间要发发2个字节的3字节的ping帧。
可见Websocket比ajax有了极大的改进。其不只省掉常常要链接握手,还简化的协议的格式,最重要的是实时性获得保证,由于双方是真正的全双工通讯。
微信浏览器客户端支持Websocket,服务器使用Tomcat7以上的WebsocketServlet类,设备端要根据Websocket协议用C语言来模拟通讯。
咱们在用设备端模拟Websocket通讯协议时通常会先看协议,再用HttpWatch等工具来抓包,抓到的头是GET ws://ip:port/path,若是在C语言也是这样模拟发包则会报400 bad request。由于C语言利用socket创建通讯时已经利用了IP和port了,其发的第一个包的头是GET/path便可,不能在其前面加上ws://ip:port/。
以上的分析都是将移动互联网的技术运用到物联网,其都有一个特定就是创建链接时会传送URL地址,由两个角色是客户端和服务器,这种架构咱们通常称为是RESTful架构(另外,还有SOAP 面向应用的web services架构)。RESTful架构在互联网获得愈来愈普遍的运用,但物联网除了互联以外,还有其独有的特征,就是其终端设备的资源有限、低功耗运用场景、网络链接环境差(时不时断开链接)等。用C语言模拟的方式来使用RESTful架构(如Websocket)会使得终端的负荷较重,并且服务器发给终端设备的消息有可能由于断开链接而收不到。
MQTT是IBM针对物联网退出的一种轻量级协议,创建于TCP/IP层协议之上。其是物联网的重要组成部分,可能会成为物联网的事实标准。其具备QoS,可以缓冲消息,并经过重传机制保证终端设备收到消息;其消息格式极其简化,最短是两个字节;其提供订阅和发布模式,高效推送消息。
MQTT有三个角色,包括服务器代理、订阅者和发布者。
1)启动服务器代理。
2)订阅者向服务器代理订阅相关主题。
3)发布者向服务器代理发布主题信息。
4)服务器代理想全部订阅该主题的订阅者推送消息。
MQTT有C/C++语言和JAVA包实现。须要明确的是,MQTT更适用于设备终端和手机APP socket通讯,而不能支持浏览器使用。若是要支持微信浏览器应用,还须要增长相似WebsocketServlet技术给浏览器提供支持,这时MQTT以JS接口进行封装,并被调用完成消息推送。
CoAP是受限制的应用协议(ConstrainedApplication Protocol)的代名词。其基于UDP协议,也就是在设备终端上只须要底层实现UDP协议,而不须要实现较为复杂的TCP协议。这种协议用得比较小。笔者也没有用C语言模拟过,就不展开了。
从开发的角度,无线接入是物联网设备端的核心技术,身份设备管理和消息推送技术是物联网云端的核心技术。而从场景体验的角度,除了前者,还要包括手机的前端开发技术。