刘 朴, 莫家勤
(桂林大为通信技术有限公司 系统集成部, 广西 桂林 541004)
基于SuperSocket的北斗终端数据接收服务的设计与实现
刘 朴, 莫家勤*
(桂林大为通信技术有限公司 系统集成部, 广西 桂林 541004)
北斗是我国自主研发的卫星导航定位系统,已经被广泛使用于各个领域,城市交通管理的核心是车辆监控,为了实现车辆的智能管理,获取车辆信息是首要任务,基于北斗二代的车载终端能够精确获取车辆信息,因此实现监控管理的前提是对北斗终端定位信息的采集.北斗终端数据接收服务的设计与实现成为车辆监控系统的关键,该服务负责采集车辆定位信息和车辆运行信息,同时负责完成与监控平台的实时信息交互.结合SuperSocket和WebSocket开源技术实现数据采集和实时通信,完成该服务的设计和实现,并通过对比实验分析,证明了该设计的先进性和高效性,解决了车辆监控系统中数据稳定获取和实时交互的关键问题.
数据接收; WebSocket; SuperSocket; 高性能
北斗卫星导航系统是我国自主研发和运行的全球卫星导航系统,它具有定位精度高、可全天候使用、通信快捷和运营价格低廉等特点,可广泛应用于交通、水利、石化和海洋等国民经济领域.我国的北斗二代已具备区域服务能力,并实现GNSS的兼容互操作可交换功能,卫星导航与无线通信进入一体化融合发展,形成集定位、无线通信和互联网于一体的应用,将迅速提高人们对导航与位置服务的认知度和依赖程度.然而由于GPS系统的先发优势,GPS系统的各项设备已占领了全球绝大多数市场.在信息时代,日益突出的信息安全问题要求我们必须拥有自主可控的卫星定位系统,自主知识产权的北斗卫星导航系统的使用能够帮助我国在卫星定位上摆脱了GPS的束缚[1].
近年来,随着社会经济的飞速发展,机动车辆已广泛应用于各行各业,在现代社会中承担着重要的运输角色,城市智能交通的核心任务是对车辆的监控管理,然而目前市场上现有的车辆监控管理系统大多采用GPS定位,一旦美国进行制约,车辆运输将会陷入盲目的状态,因此必须采用自主可控的定位系统.同时现有的车辆监控工作缺乏统一的信息资源规划标准,不能有效满足管理部门的工作衔接要求,为了构建安全、可控、智能、高效的现代交通运输体系、提高交通信息化和智能化水平.需要建立一个基于北斗终端的先进的车辆监控系统以实现车辆信息的智能管理和监控.
在设计车辆监控系统时最重要的是保证系统的高效性、稳定性以及实时性[2],这就要求系统能够快速而精确的获取车辆状态信息和定位信息,同时实现将处理后的信息实时动态地传递到监控中心[3],因此,数据接收和实时传送成为两大关键技术问题.
数据接收服务主要任务是保证车辆信息快速而精确地获取以及信息的实时显示,这涉及到TCP网络数据的接收和前后端通信技术,通过对以往的实现方式的分析和比较,本文提出了解决方案,并对解决方案进行说明.
1.1 TCP数据接收技术
现有的车载终端类型主要有GPS和北斗,因此对于接收车载终端数据的研究主要建立在这两个系统上,而不管是GPS还是北斗,在数据通信上都采用GPRS网络进行传输,要完成数据接收服务其实就是通过采用TCP/IP协议实现对网络数据的有效接收.为了保证连接的可靠性,网络数据的传输普遍都是基于TCP方式实现.目前.NET平台上TCP的服务器实现主要有3类,最为基础的实现是简单的采用Socket监听和接收功能实现接收数据[4],这种方式在处理大数据收发时很难保证数据的实时处理;第2类实现是采用Asynchronous Socket 的方式[5],能够初步解决大数据量的问题,但是系统资源消耗、系统拓展能力和前端交互上存在着不足;第3类实现方式是完成端口模型(IOCP)方式[6],这是一种高效异步 I/O 通信模型,性能上有很大的提高,但是这种方式涉及到IO操作,编程复杂性很高,同时在系统拓展性、灵活性上同样有着一些缺点.为了解决现有的TCP服务器建设方面的不足,考虑使用SuperSocket[7]这个开源框架来实现TCP服务器,确保设计出更高性能的服务器.
SuperSocket简单来说就是一个Socket服务器框架,框架内部实现了对Socket编程操作的封装,该框架提供了丰富的接口,即使对Socket编程原理不是非常了解,也可以很方便的开发出自己的服务器.SuperSocket开发简单但并不代表其功能的欠缺,其在性能上、可拓展性上都有很出色的表现,虽然是用纯C#开发出来,但是同样具有跨平台的功能.该框架在底层的实现上基于SocketAsyncEventArgs和线程池技术.SocketAsyncEventArgs是微软提供的高性能异步Socket实现类,主要为高性能网络服务器应用程序而设计,主要是为了避免在异步套接字 I/O 量非常大时发生重复的对象分配和同步.线程池技术通过采用多个线程处理请求,能够显著的改善服务器程序的性能.
1.2 实时传送技术
在监控系统中,信息被接收和处理后,实时显示是一个关键的问题,系统必须要保证信息实时显示到前台,才能使用户及时看到当前的监控信息.现有的实现方式都是一种折衷方案,最常用的方式为轮询(POLLING)和Comet[8],而 Comet 技术实际上是轮询技术的改进,这些方式都是由客户端通过浏览器先发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,都没能真正实现信息的实时发送,只是通过一定的技术手段间接的实现.因此本文提出了使用最新的实时技术WebSocket来真正解决动态显示的问题.
WebSocket是HTML5标准的一种新协议,是浏览器和服务器之间进行全双工通讯的网络技术[9],它本质上是一个TCP连接,通过JavaScript向服务器发出连接请求,其最大的优势是实现了页面和服务器之间信息的实时同步.WebSocket能实现浏览器和服务器之间的TCP通信,通过握手建立连接后,只要页面不断开,连接就可以一直保持,实现服务器端和客户端通过TCP协议双向发送和接收数据,而且不需要每次都发送请求,这有效的保证了信息的动态显示[10-11].
为了解决TCP数据稳定而高效的接收以及数据实时传送这两个关键问题,本文提出了一个基于SuperSocket和WebSocket的北斗终端数据接收服务设计方案,用于完成车辆监控系统的数据接收和数据交互工作.
本文首先对数据接收服务的设计进行说明,之后通过实验对设计方案进行对比测试.
数据接收服务是车辆监控系统的枢纽,负责网络数据的接收、处理、发送和存储.本文设计的接收服务包含两个子服务器:终端服务器和页面服务器,页面服务器负责与浏览器建立连接并进行信息的互传,实现数据实时同步、命令下发和设备参数配置;终端服务器负责与车载终端直接通信进行数据通信工作.两个服务器分别负责与浏览器和终端的通信,同时为了实现浏览器和终端的信息互通,这两个服务器之间也需要进行数据通信.整个服务器设计如图1所示.
图1 接收服务设计图Fig.1 Design diagram of receiving server
2.1 终端服务器实现
2.1.1 定义连接类 每个TCP连接都对应着一个Session对象,所有基于这个连接的操作都通过这个Session对象实现,框架中还提供了连接接入、连接断开、连接请求处理等方法,可以对一个连接的状态操作进行很好的业务处理.
2.1.2 定义接收过滤器协议 该接收过滤器只接收固定格式的数据信息,北斗车载终端上传数据都是以7e作为开头和结尾标识.通过在自定义类中继承框架中的过滤器模板类,这里是使用的是BeginEndMarkReceiveFilter,用于过滤具有固定开头和结尾的标识数据信息,从而定义自己的过滤器.定义实现方式如下:
class TerminalReceiveFilter: BeginEndMarkReceiveFilter〈BinaryRequestInfo〉
{
private readonly static byte[] BeginMark=
new byte[] {0x7e};
private readonly static byte[] EndMark=
new byte[] {0x7e};
public TerminalReceiveFilter (): base(BeginMark, EndMark)
{}
}
在SuperSocket中,所有的客户端请求都要被实例化为RequestInfo类,该类包含了key属性的定义,根据key属性跳转到具体的命令类中执行后续的业务处理.因此在过滤器中还需要将客户端请求实例化为RequestInfo类型.由于在北斗终端中,消息格式是被严格定义的,每一个消息ID对应着一个唯一的业务处理操作,因此RequestInfo类中的key属性可以和消息ID对应起来,根据消息ID执行不同的操作,同时需要将整个请求信息定义到RequestInfo类中,因此需要添加body属性,这是一个比较好的定义方式,在SuperSocket中,BinaryRequestInfo类继承了RequestInfo,包含了key和body属性,其中key对应了请求类型,body是信息的二进制数据,刚好是符合这种需求的.通过重写ProcessMatchedRequest,并返回BinaryRequestInfo类信息实现请求的实例化.实现方法如下:
protected override BinaryRequestInfo ProcessMatchedRequest(byte[] readBuffer, int offset, int length)
{
return new BinaryRequestInfo(BitConverter.ToString(readBuffer, offset+1, 2), readBuffer.CloneRange(offset+1, length-2));
}2.1.3 定义命令 Command命令用来处理请求信息,每个请求的业务处理操作都在命令类中进行,一个请求对应一个命令类,因此在服务器设计中,需要定义多个命令类.每个命令类在定义时都需要继承CommandBase类,同时实现ExecuteCommand方法.由于车载终端的消息ID都为数字形式,Command类名无法直接使用数字定义,那么就无法实现Command和请求的对应,因此需要对Command类的Name进行重写,将消息ID和命令类型对应,下面的代码是实现终端心跳信息处理的Command类:
public class KeepAlive: CommandBase〈TerminalSession, BinaryRequestInfo〉
{
public override string Name {get {return "00-02";}}
public override void ExecuteCommand(TerminalSessionsession, BinaryRequestInfo requestInfo)
{}
}
2.2 页面服务器实现
基于WebSocket的页面服务器包含服务器端和客户端的设计,客户端负责浏览器与页面服务器的连接建立,以及数据的实时发送和接收工作.客户端的建立相对简单,WebSocket为WEB开发提供了一套基于JavaScript 的接口用于实现客户端的设计,该API中包含的主要方法是send、onopen、 onmessage和 onclose,通过这些方法的调用就可以实现页面请求发送和数据的收发.
WebSocket服务器跟通用TCP服务器区别在于需要处理 WebSocket 握手信息,服务器端根据页面传递的握手信息生成网络字节数组,然后将生成的网络字节数组和客户端提交的头信息里的 [8-byte security key] 合并成一个 16 位字节数组并用 MD5 算法加密,最后将生成的安全密钥作为应答信息返回给客户端,双方的 WebSocekt 连接通道就建立起来了,后续就可以通过这个连接进行通用的数据收发.因此,服务器端实质上是一个TCP服务器,在这里,使用SuperSocket,并在其中加入WebSocket规范,实现对WebSocket的请求处理.
2.3 页面服务器和终端服务器之间的通信
为了实现浏览器和车载终端的信息互通,必须解决页面服务器和终端服务器之间的通信问题,这可以通过服务器之间的信息转发来解决,整个转发流程可以通过图2表现出来.对于终端上传信息到页面这个流程:
1) 定义接口IDespatchServerToPage和转发方法DespatchMessageSTP();
2) 页面服务器类PageServer中实现接口的方法,将信息发送到浏览器中;
3) 终端服务器TerminalServer启动函数OnStarted()执行时将包含PageServer实例信息的接口转换为IDespatchServerToPage接口,赋值给变量m-DespatchServerSTP;
4) TerminalServer中定义DespatchSTP()方法,通过m-DespatchServerSTP调用转发方法DespatchMessageSTP(),实现信息用终端服务器转发到页面服务器,从而到达浏览器.
图2 服务器通信UML图Fig.2 UML diagram of server communication
在完成了页面服务器和终端服务器的设计以及这两者之间的通信工作之后,数据接收服务的设计工作就已经完成了,接下来要做的就是通过实验分析这样的服务器是否具有一定的性能优势.
2.4 实验和分析
为了测试本文设计的数据接收服务BDServer的性能,选取了3个现成的TCP Socket网络调试助手,同时编写了另一个基于异步方式实现的TCP服务器,用这4个服务器与BDServer进行性能对比.
2.4.1 测试方式
1) 采用TcpServer压力测试工具模拟车载终端,通过模拟终端发起连接;
2) 两台PC,一台运行服务器端,另一台运行压力测试工具,在局域网内通过测试工具向服务器端发送连接和数据;
3) 压力测试工具不断增加TCP连接数,同时观察服务器的运行情况,并记录.
2.4.2 结果分析 测试结果通过图3、图4进行呈现.
图3 TCP连接数和有效连接率关系图Fig.3 Diagram between number of TCP connections and the effective connection rate
图4 TCP连接数和CPU占用率关系图Fig.4 Diagram between number of TCP connections and CPU occupancy rate
图3是发起连接数和有效连接率的关系图,正常情况下,客户端发起的连接数都需要被服务器端接收和处理.从图中可以看到,在100个连接时,每个服务器都能完全接收客户端连接,但是随着连接的增加,部分服务器的有效连接率开始下降,当达到600个连接时,只有NetAssist和BDServer能完全接收连接,其他的3个服务器都有明显下降.随着连接数继续增加,部分服务器会出现奔溃现象,其中SocketTool在连接数达到700左右时就崩溃,异步TCP达到2 400时无法再继续进行处理,USER-TCP23虽然没有崩溃,但是效率已经越来越低,NetAssist有效率在2 400之前都是100%,但是再增加后,同样也会崩溃,只有BDServer在7 000时都还能一如既往保持着100%的有效连接率.
图4是服务器接收连接数和CPU使用率的关系图,希望在同等情况下CPU占用率越低越好,从图中可以看出,在3 000连接数处于以下,BDServer占用率都明显低于其他四个服务器.虽然在3 000以上时,BDServer高于其他的服务器,但这是有原因的,测试时发现,当连接数超过3 000时,BDServer的有效连接数是3 000,但是其他服务器都远远达不到这个数,因此CPU占用率肯定会降低.图4还显示了USER-TCP232、SocketTool和NetAssist这3个服务程序的CPU一直占用都是25%,这是这3种服务器设计的不合理,处理能力极度受限,而BDServer不同,只要设备CPU有足够的运算能力,连接可以不断增加,因此在处理大量连接时,只需要增加服务器就可以实现了.
综合上述两个对比试验,可以看出,基于SuperSocket开发的BDServer服务器在服务器资源利用率上更优,同时可以很方便的基于多服务器进行拓展,最大处理能力明显强于其他一些TCP服务器,稳定性和可靠性都能得到保证,因此这是一个经受得住大数据访问的高性能服务器,能绝对满足系统的需求.
2.5 终端服务器和页面服务器应用实现
基于终端服务器和页面服务器的数据收发和实时交互功能,整个车辆监控系统的设计结构变得清晰,图5是整个系统的设计框架图.
由车载终端发送的数据通过终端服务器接收和处理后,直接到达页面服务器和数据库,页面服务器通过主动方式发送到前台,实现前台页面信息的实时更新,完成整个车辆监控中的关键环节的实现.在实际的测试过程中,数据的上传下发过程都能实现实时、准确的传送,可以说明本文提出的数据终端接收方案是具有极大的实际意义的.图6是实现的效果图.
图5 车辆监控系统设计框架图Fig.5 Diagram for the design of the vehicle monitoring system
图6 页面实时信息效果图Fig.6 Effect diagram of real time information on page
本文提出了基于北斗的车辆监控系统的必要性,研究了车辆监控系统中最为关键的功能-数据接收服务的设计与实现,提出了利用SuperSocket框架设计接收服务的方案,同时为了做到系统信息的真正实时显示,将WebSocket技术融入数据接收服务中,解决了车辆信息的获取和显示这两个关键问题,通过实验的对比分析,证明了本文提出的终端服务器在系统可靠性、稳定性、系统资源占用率上与现有的异步TCP服务器和TCP服务器工具相比,都有较明显的优势.页面服务器更是直接解决了现有的轮询方式无法解决的前后端数据实时传输的问题,具有明显的技术优势,因此该方案是具有一定的先进性和技术优越性的.结合了终端服务器和页面接收服务的车辆监控系统完整的实现了数据上传下发和管理功能,在实践中证明了设计方案的可行性.
[1] 孙超奇, 宋秉龙, 贾 斌,等. 基于北斗二代的车辆监控系统研究与应用[J]. 计算机技术与信息发展, 2012(10):77-78.
[2] 薛 津, 叶少珍. 车辆监控系统服务器性能优化与实现[J]. 微型机与应用, 2013, 32(24):59-62.
[3] 李一龙, 卢 军. 车辆远程监控系统的设计与实现[J]. 网络安全技术与应用, 2014, 5(2):39-40.
[4] 刘欣然. 车辆监控管理系统的设计与实现[D]. 西安:西安电子科技大学, 2014.
[5] 李冬波. 基于.NET平台的车辆远程监控管理系统的开发[D]. 秦皇岛:燕山大学, 2013.
[6] 王 肖, 雷 鹏, 李 鹏,等. 基于IOCP的车辆监控系统网络服务器设计与实现[J]. 军事交通学院学报, 2010, 12(6):52-55
[7] 江振宇.SuperSocket,可拓展的Socket服务器框架[EB/OL]. [2013-6-30].http://www.supersocket.net/About.
[8] 周 婷. Comet:基于HTTP长连接的“服务器推”技术[EB/OL]. [2007-8-31].https://www.ibm.com/developerworks/cn/web/wa-lo-comet/.
[9] 黄晓安, 何 亮, 许 宁. 使用 HTML5 WebSocket 构建实时 Web 应用[EB/OL]. [2011-12-15]. http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/.
[10] 肖在昌, 杨文晖, 刘 兵. 基于WebSocket的实时技术[J]. 电脑与电信, 2012, 1(1):40-42.
[11] 郑 玲, 郑晓天. 基于WebSocket的电力系统实时数据更新研究[J]. 计算机与现代化, 2013(1):85-87.
Design and implementation of Beidou terminal data reception service based on SuperSocket
LIU Pu, MO Jiaqin
(System Integration Department, Guilin Dawei Communication Technology Limited Company, Guilin, Guangxi 541004)
Beidou is a satellite navigation and positioning system developed independently by China, which has been widely used in various fields. Vehicle monitoring is the core of city traffic management. In order to reach the intelligent management of vehicle, obtaining vehicle information is the primary task. As vehicle information could be obtained precisely by Beidou second generation car terminal, the premise of monitoring management is collecting Beidou terminal location information. Thus, the implementation of data reception service becomes the key of vehicle monitoring system. The service system is responsible for collecting vehicle location and operation information, as well as the real-time interactions with monitoring platform. Combination of SuperSocket and WebSocket open source technologies completes the service system on data acquisition and real-time communication tasks. Furthermore, the contrast experiment analysis demonstrates that the system is more advanced and highly efficient, which solves the key problems of vehicle monitoring system including stable data acquisition and real-time interaction.
data reception WebSocket; SuperSocket; high-performance
2015-06-18.
广西信息服务业发展专项资金项目([2013]826).
1000-1190(2016)01-0032-06
TP311
A
*通讯联系人. E-mail: 339591260@qq.com.