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