陈纯纯
摘 要:通过对比国内外同类软件,服务端采用Netty+WebSocket技术,客户端采用基于Android平台的JSON解析技术,设计并实现了一款智能小区增值服务软件系统,可以向小区用户分组及时推送重要资讯,向小区周围配套服务系统提供接口。文中主要介绍了该系统推送服务的设计原理。
关键词:Netty;WebSocket;JSON;增值平台
中图分类号:TP393.0 文献标识码:A 文章编号:2095-1302(2016)12-00-03
0 引 言
随着人们逐渐从PC解放,需求开始转移到移动设备的应用上。目前福建地区的小区住户、物业和周边配套服务都还处于离散状态,人们迫切希望有一款基于移动设备的智能社区服务平台,可以通过该系统方便住户随时获取小区的重要资讯,了解住宅的实时情况,监控和控制住宅内的电器设备。而小区周边的其他配套服务系统可以通过该平台提供的接口直接与平台对接,向住户提供服务。
1 系统设计原理图
本系统建立在J2EE平台上,运用 MySQL数据库管理系统将 JSON解析与Netty、 WebSocket等技术相结合,构建更加智能的社区增值服务平台。社区增值服务系统搭建在云平台之上,充分利用现代化信息技术手段实现社区管理及服务的信息化、集约化,依托云平台的理念和优势,将已有的专业系统纳入其中,为社区居民、物业管理、周边服务机构提供便利丰富的终端服务。系统设计原理图如图1所示。
该平台的亮点是信息的分类推送,开发之前对信息推送的两种方式进行分析:
(1)第一种是客户端使用Pull(拉)的方式,即定时到服务器上获取,看是否有更新的信息。
(2)第二种是服务器使用Push(推送)的方式,把最新的信息Push到客户端上。
虽然Pull和Push两种方式都能实现获取服务端更新信息的功能,但Push方式比Pull方式更优越[1,2]。
本文通过对比分析国内现有的移动设备推送解决方案,采用Netty+WebSocket持久连接的方式,实现了消息的实时性推送和分类推送。
2 推送与控制实现
平台可实现系统用户的需求,如查看家中的光照强度、室内温度、空气湿度、烟雾浓度等实时数据,并对家中的家居进行控制操作,对硬件与手机之间的链接通信进行了详细合理的设计。Netty与WebSocket的结合完美解决了此通路问题,为实现平台的实时推送和分类推送奠定了基础。
2.1 推送的设计与实现
平台的服务器分为Netty Server与WebSocket Server两个部分。
(1)Netty Server集成了WebSocket Client,用来实现与各硬件之间的数据传送,Netty Server在初始化时与WebSocket Server建立长链接;
(2)WebSocket Server实现了与集成在Netty服务器中的WebSocket Client之间的数据传送以及与用户手机端(或网页)的交互。
推送和控制详细设计原理图如图2所示。
平台将传感器的数据推送到用户的流程描述:单片机采集各传感器的实时数据,将这些数据通过TCP上传到Netty服务器,当TCP与Netty服务器第一次建立连接时,触发channelActive()方法建立通道,该通道在传感器断开之前一直存在,此后传感器定时发送数据,并直接触发channelRead0()方法接收,接收到的数据由集成在本服务器的WebSocket Client模块处理,通过WebSocketClient.send()方法发送给WebSocket服务器,WebSocket服务器中的WebSocket Server通过onMessage()方法接收,接收到实时数据后,则由client.session.getBasicRemote().sendText(msg)将数据推送给手机或网页终端。
Netty服务器采用多线程服务器,对于每一个连接请求,dispatcher都会为其创建并分配一个线程,该线程负责这个请求的处理,优点是执行粒度是完整的处理流程,处理逻辑清晰,易于开发。但也存在随着处理请求的不断增加,会导致并发执行的线程数量太多等问题。过多的线程数量会导致系统在线程调度和资源争用上的开销过大,从而引起系统性能急剧下降,导致系统处理能力下降。该平台采用了改进措施,引入线程池,系统最多只能创建一定数量的线程,该平台规定最多能创建的线程数量为100。当所有线程都饱和运行时,新到达的处理请求只能等待或者被抛弃。
在实现WebSocket的链接过程中, 客户端和普通的浏览器都通过80或者443端口和服务器进行请求握手,服务器根据http header识别是否是一个WebSocket请求,如果是,则将请求升级为一个WebSocket连接,握手成功后就进入双向长连接的数据传输阶段。WebSocket的数据传输基于帧方式:0x00 表示数据开始, 0xff表示数据结束,数据以utf-8编码。第一次请求客户端发送的是http请求,请求头中包含WebSocket相关的信息,服务器端对请求进行验证,验证成功后,将请求升级为一个WebSocket连接,之后的通信就进入双向长连接的数据传输阶段,通过send和onMessage方法通信。
2.2 分类推送
平台采用WebSocket协议不仅实现了Netty服务器与WebSocket服务器的实时通信,在分类通信上也做了一定尝试,如推送工作,推送给哪一类型的用户,可以根据数据的格式来进行划分,在本平台中只做了初步划分,如数据格式为:{ "from":"SMSG","room":"1201","temperature":"1","humidity":"2.0","smoke?":"3"}(JSON形式),从“room”字段可以知道该数据是准备传送给1201室的用户,目前平台只做了这个分类,平台的下一步工作将在数据的格式上进行进一步细化和分类,如按不同的楼栋,甚至不同的楼层分类,在分类推送上完善平台的功能。