APP下载

智慧路灯远程监控平台的设计与实现

2018-04-18程婷婷胡炜薇崔佳冬

计算机应用与软件 2018年3期
关键词:集中器路灯浏览器

程婷婷 胡炜薇 崔佳冬

(杭州电子科技大学新型电子器件与应用研究所 浙江 杭州 310018)

0 引 言

现在城市规模越来越大,路灯等亮化照明设施越来越多,面对供电的紧张形势带来的资源浪费和人们日常生活的负面影响,远程控制路灯成为未来照明的发展趋势。监控系统较高的用户体验,使用的便捷性以及稳定性被推上了更高的台阶。

监控系统从过去的单机监控发展到当前的网络监控,网络通信技术在远程监控技术中发挥着重要的作用[1]。传统的路灯远程监控系统[2-3],控制方式智能方便,但并不适用于Web高并发访问量的情况。目前,大多数照明管理系统数据存储[4-6]使用的是关系型数据库,而对于高并发和超大规模的动态网站,单一的关系型数据库显得力不从心。在Linux环境下[9]采用Nginx和Redis搭建分布式服务集群[7],能够提升查询的性能[8],有效解决高并发的Web需求。

对于单一的Web 服务器,浏览器的每个连接请求,服务器通常会为其创建一个进程或线程。这种方式存在一个很大的问题,由于创建进程或线程需要消耗大量资源和内存,当连接数太大时,这很容易使得内存占用过大,很难准确及时响应高并发量的访问请求。本文提出了一个基于服务器集群的路灯远程控制管理的设计方案。由于Nginx1.9.0发布后,Nginx开始支持TCP的负载均衡,本文利用Nginx的负载均衡策略[10]分别处理HTTP和TCP高并发请求,用Redis作为Mysql数据库的缓存数据库,以Redis和关系型数据库配合的方式存储数据。当用户查询数据时,服务器先去访问Redis,若Redis没有相关数据返回,服务器则去访问Mysql数据库,并同时把查询结果更新到Redis数据库。

1 系统总体框架

图1中,集中器通过向服务器间隔发送固定心跳包的方式维持长连接。用户通过浏览器客户端登录管理系统,用户登入系统后,通过浏览器可以管控集中器下的路灯。用户将请求提交到Web服务器进行后台处理,Web服务器将命令转发给Socket服务器,再由Socket服务器将命令发送到指定的集中器,最终集中器收到命令执行操作。

图1 系统总体框架图

云服务器使用Nginx作为反向代理来实现服务器负载均衡的功能。通过配置负载均衡可以组建Web服务集群,用户请求通过Nginx反向代理转发给后台服务器集群,分担了服务器的压力。使用Redis存储Nginx负载均衡集群的Session, 解决运行在不同容器里出现的Sesssion不同步或则容易丢失的问题,使云服务器在高并发的情况下能够快速响应用户请求。

2 云服务器的设计与实现

2.1 云服务器功能说明

云服务器的功能模块划分为五个部分,如图2所示。

图2 云服务器功能模块图

(1) 用户管理用户第一次使用时,需要注册账号。短信验证码功能采用第三方短信验证接口,通过比较手机收到的验证码与用户页面填入的验证码是否匹配进行验证。根据用户角色和权限的对应关系设置用户权限。

(2) 实时监控远程登录系统,监测路灯如电压、电流、电量、功率等实时运行参数。实时控制是控制系统的核心模块,包括实时数据与历史数据的查询、实时控制路灯的开关和获取路灯的实时参数信息。用户点击页面按钮,可以单灯控制,也可以批量控制。

(3) 设备档案管理对整个项目监控单元的档案资料进行管理,通过浏览器对设备终端资料进行添加、查询、修改和删除。

(4) 告警管理当某个设备终端出现故障后,系统通过短信告知工作人员故障的地点,工作人员能够及时维修路灯。

(5) 统计分析用统计图和表格展现某一集中器下路灯的工作情况,用户通过选择集中器号和时间点可以查询相对应的电压、电流、用电量等参数。其中统计模块包括日报表、月报表、每小时耗电量。

2.2 Nginx服务器架构

Nginx使用一个主进程来管理多个工作进程,每个工作进程都处于工作状态负责提供互联网服务,工作进程间通过内存共享等进程间通信机制实现Nginx的负载均衡等功能,主进程则主要负责监控管理工作进程。进程间关系如图3所示。

图3 Nginx进程间关系

(1) HTTP负载均衡的配置

http {

upstream live_node {

server ×××;

server ×××;

server ×××;}

#×××这里为Nginx转发的服务器IP地址和端口号

server {

listen 80;#监听HTTP的端口

server_name localhost;

location / {

root html;

index index.html index.htm;

proxy_pass http:#live_node;

}}}

(2) TCP负载均衡的配置

stream {

upstream rtmp {

server ×××;

server ×××;

server ×××; }

# ×××这里为Nginx转发的服务器IP地址和端口号

server {

listen 1935; #需要监听TCP的端口

proxy_timeout 20s;

proxy_pass rtmp;

}}

2.3 通信模块的设计与实现

通信模块为本设计的核心模块。浏览器有操作集中器的指令时,Web服务器将请求转发到Socket服务器,用户通过浏览器下达指令或者查询数据。当发送控制指令时,直接通过Socket服务器转发指令,当查询数据时,直接从数据库中读取。

系统的通信模块流程图如图4所示。

图4 系统的通信模块流程图

2.3.1HTTP通信

用户登录、注册、获取设备信息都是基于HTTP通信主动建立连接。HTTP服务器采用Spring、Strust2 和Mybatis 框架,页面主要是通过表单和AJAX(Asynchronous JavaScript And XML)提交数据,服务器以JSON(JavaScript Object Notation)的数据格式返回。使用Strust2 的ModelDriven 获取封装的对象。

(1) 从浏览器获取灯的对象。

private LampDOO lampdoo = new LampDOO();

public LampDOO getModel() {return lampdoo;}

(2) 参数封装到对象里。

CenterCommand cen = new CenterCommand();

cen.setEquipment(lampdoo.getEquipment()) ;

cen.setCenterId(lampdoo.getCenterId());

(3) 当页面点击页面的Button时,将参数传递到Socket服务器,CallResultDO验证是否成功发送,若成功发送更改网页显示信息。

CallResultDO cr = blockChannel.blockSend

(lampdoo.getCenterId(), cen);

//输出接收到的数据

if ( cr.isSuccess() ){this.request.setAttribute(″result″,

new String(cr.getData()));

this.request.setAttribute(″commit″, ″true″);}

2.3.2TCP通信

集中器和云端的通信是基于TCP/IP的通信。Socket服务器采用MINA(Multipurpose Infrastructure for Network Applications)框架,用户通过调用接口便可以开发高性能、高扩展性的网络通信服务器。当有客户端向Socket服务器发送请求时,客户端的地址和端口与服务端的地址和端口构成一个Session。MINA把Session封装成IoSession接口,服器端通过IoSession能够区分是哪个客户端的请求,从而保持服务器和客户端之间的正常通信。集中器和Socket服务器通信采用应用层定时发送心跳包的方式保持连接的存活,保证通信的可靠性。

(1) 处理接收到的数据集中器向服务器传输的所有二进制信息都存放在IoBuffer中:byte[] data=CommandUtils.ioBufferToByte(message)。

(2) 对数据的粘包和断包进行处理集中器传输到服务器上的通信协议由协议头、数据头、数据体、协议尾组成。其中,协议头、数据头、协议尾是固定值段。为了保证协议头、数据头和协议尾不会出现在长度字段和数据体中,使用扩展技术。数据体由原始数据经过Base64编码得到,长度字段是对占4个字节空间的整形长度进行扩展后得到的。比如对0x1A进行扩展,扩展后占2个字节,值分别为1 和A的ASCII(American Standard Code for Information Interchange)码值0x31和0x41,避免了识别协议头和协议尾的错误,保证了程序的正确性。解析数据时,对符合要求的数据体放入Datas中,对于断包和粘包不完整的数据分别放入bufferData和leftData里,同下一次接收的数据合并处理。

if(leftData!=null){data = CommandUtils.byteMerger

(leftData,data) ;

session.removeAttribute(″leftData″);}

if ( null != buffData )

{data = CommandUtils.byteMerger(buff,data);}

//分析数据包,将对应字段放入对象中

CenterCommand receive = CenterCommand.analyse

Package(data , session);

//解析数据体

CenterCommand center = CenterCommand.

analyseCommand(receive.getDatas());

(3) 对处理后的完整数据包进行命令解析

if( center.getCommand() == 101 ) { //实时通信通道

WebCommand t = WebCommand.analyseCommand

(center);//解析数据

blockChannel.syncput(web.getEquipment(),web.

getData().getBytes());

//数据写入内存

ResultData result = ResultData.createResultData(center.

getVersion(),center.getCommand(), 2);

byte[] redata = result.renderData();

redata = ResultData.renderData(redata);

IoBuffer rib = IoBuffer.allocate(redata.length);

rib.put(redata,0,redata.length);

rib.flip();

session.write(rib);

return;}

//对集中器进行回复

2.4 数据库服务器的设计

数据库使用Mysql和Redis。Redis作为Mysql的缓存数据库,减小了Mysql的压力,在数据量大、高并发的情况下,提高了系统的处理效率。实现负载均衡时,用户每一个请求都有可能被分配到不固定的服务器上,先要解决Session的统一问题,无论用户的请求被转发到哪个服务器上都能保证用户的正常使用,即需要实现Session的共享机制。将Session存到Redis中,以这种方式来同步Session。通过将Session存放到内存级数据库里,加快读取速度,解决用户访问不同服务器时Session的共享问题。数据库架构如图5所示。

图5 数据库架构

修改Redis安装包里conf目录下的content.xml,对Redis进行配置,如下所示:

redissessions.RedisSessionHandlerValue″/>

redissessions.RedissessionManager″

host = ″106.14.9.111″#Redis服务器地址

port = ″6379″#Redis的端口号

database = ″0″#Redis数据库的标志

maxInactiveInterval = ″1 800″/>

#Redis过期时间默认是60秒,Session过期时间为30分钟,这里需要设置为1 800对应30分钟。

2.5 终端实时监控设计

百度地图API提供基本地图展现、搜索、定位等功能,定位精确度高、覆盖率广。本系统调用百度地图的接口将集中器下的路灯的信息通过地图实时显示,红色实心形状代表正在运行的集中器,蓝色表示没有运行的集中器,以不同的颜色和形状表现出来,直观清晰。使用AJAX方法完成前端页面和后台服务器的交互,将集中器的相关信息返回并在页面上显示出来。

//创建标签

var label = new window.BMap.Label(data[i].equipment, {offset: new window.BMap.Size(20, -10) });

marker[i].setLabel(label);

//添加标签

// 创建信息窗口对象

info[i]=new window.BMap.InfoWindow(″

″+data[i].

equipment+″
经度:″+data[i].longitude+″   纬度:″+data[i].latitude +″
连网状态:″+data[i].online +″      集中器号:″+data[i].centerId+″

″); }

3 测试与分析

3.1 服务器性能测试

使用压力测试工具Httperf和Autobench在Linux环境下分别对单一服务器和服务器集群的系统性能进行测试。服务器集群由4台第三方云服务器组成,其中1台服务器作为Nginx负载均衡服务器,其他3台作为Tomcat服务器,4台服务器的系统是Centos6.8,Nginx使用的版本是1.10.3。测试命令如下:

Autobench --single_host --host1=主机地址 --uri1=测试的uri --port1=端口号 --quiet --low_rate=100 --high_rate=500 --rate_step=10 --num_call=1 --num_conn=300 --timeout=10 --file /opt/nginx.tsv

本测试通过在并发连接数相同的情况下,比较单一服务器和集群服务器处理请求的响应时间,测试单一服务器和集群服务器的并发能力。测试结果如表1所示,相应的图如图6所示。

表1 单一服务器和集群服务器响应时间

图6 单一服务器和集群服务器响应时间

从表1和图6可以看出,随着并发连接的增加,单一服务器响应时间变慢;而对于集群服务器,随着并发连接数的增加,响应时间变化很小。单一服务器能够处理并发连接数在300左右,而集群服务器能够处理的并发连接数远远大于单一服务器。很明显,集群服务器提升了系统的性能,适合处理高并发请求。

3.2 界面展示

浏览器客户端具有人机交互,界面友好的用户界面,方便用户管理。用户通过浏览器可以控制设备开关,通过点击页面按钮,将指令下达给网络调试助手,网络调试助手以16进制显示,如图7所示。

图7 设备控制界面

通过地图可以直观地看到路灯安装在哪个位置。点击地图上的标点,能够查看该位置路灯状态等相关信息,如图8所示。

图8 路灯远程监控系统地图显示

使用Hightcharts对路灯的历史数据进行绘图,并用表格的形式展现出来,使用户对路灯参数一目了然,方便查询、管理。路灯历史电量统计如图9所示。

图9 路灯历史电量统计

4 结 语

本文设计并实现了基于服务器集群的路灯远程监

控管理软件。基于Nginx对前端Web高并发访问和设备TCP通信分别实现负载均衡。使用Redis和关系型数据库配合的方式存储数据,实现Session变量的共享,有效解决高并发需求的问题,提高系统的可靠性。用户通过浏览器查看路灯地理位置和向服务器发送控制指令,实现用户随时随地远程监控路灯。

[1] 郑黎明.计算机通信与网络远程控制技术探讨[J].信息通信,2016(10):163-164.

[2] 张卿杰,徐友,薛国庆.基于Web Service的无线路灯远程监控系统[J].现代电子技术,2015(11):5-9.

[3] 季建华.基于物联网的智能家居远程监控系统设计与实现[J].计算机应用与软件,2015,32(11):143-146.

[4] 刘蒙蒙.基于物联网的城市道路照明管理系统设计与开发[D].合肥工业大学,2015.

[5] 陈嘉琪,肖纯,柯志雄.基于Web的路灯智能监测系统[J].工业控制计算机,2016,29(5):123-124.

[6] 余钟源.城市照明智能监控系统的研究[D].北京邮电大学,2015.

[7] 蒲晓阳.基于Nginx和Redis高并发web服务负载均衡的研究[J].内江科技,2016,37(1):40-40.

[8] Wu X,Long X,Wang L.Optimizing Event Polling for Network-Intensive Applications:A Case Study on Redis[C]//International Conference on Parallel and Distributed Systems.IEEE Computer Society,2013:687-692.

[9] 金明哲,郑建立,裴旭明,等.应用于物联网的Linux云端服务器设计[J].信息技术,2015(9):179-183.

[10] Kovalev A,Otrashkevich K,Sidorov E,et al.Effusion-a new sophisticated injector for Nginx web servers[J].Computer Networks,2014,56(12):2800-2807.

猜你喜欢

集中器路灯浏览器
微软发布新Edge浏览器预览版下载换装Chrome内核
反浏览器指纹追踪
低压集中器采集调试和维护问题分析
为什么高速公路上不用路灯照明
傍晚,路灯为什么能自动亮起来?
无线通信网络在阶梯水价智能抄表系统中的研究
浏览器
通过公共网络VPN为专用网实现加密连接