徐佳健
(浙江工业大学信息工程学院,浙江杭州310023)
随着网络通信和多媒体技术的快速发展,视频监控技术也得到了飞速发展,视频监控进入到了网络时代,网络监控系统已成为了主流。网络监控系统是一个集多媒体信息的综合性、通信的分布性和监控的实时性等于一体的综合系统。网络监控系统的基本原理是:视频采集前端对采集的数据压缩转换并发送到网上,一个专门的服务器对视频资源和用户操作进行管理,客户端通过网络连接到服务器可以观看视频和控制操作[1]。网络视频监控系统传输的数据根据数据特点可分成两类:控制类数据和音视频数据。控制数据主要包括操作控制指令、用户状态查询数据等,数据对传输可靠性要求比较高,数据传输量也比较少。监控系统作为通信系统的一种,需要采用相应的控制信令使系统内的所有设备协同工作,使系统正常运行。控制信令是通信中必不可少的重要组成部分,客户端和服务器相互交换各自状态信息和提出对其他设备的控制要求,使网络系统作为一个整体运行。目前对控制信令的要求主要有良好的可扩展性,简单性,互操作和可重用性等。可扩展性满足了系统升级扩容的需求,简单性和可重用性满足易用,方便调试等需求[2]。针对系统要求,不同厂商也制定了相应协议,在实现上也有各自独特方式[3]。本文将根据监控系统对传输命令的要求,分析传输层协议特点,提出传输方案:选取TCP协议,确定命令格式,用Socket实现控制命令的发送、接收和解析。将实现利用现有网络资源,简单准确可靠地传输命令,提高网络监控系统的效率。
虽然不同的网络监控系统采用的系统结构和实现方式等有所不同,但一般都包括监控客户端和远程服务器,采用C/S(客户/服务器)模式。服务器与客户端之间的通信网络是普通TCP/IP网络,由文献4得到网络在传输层提供了面向连接的TCP和无连接的UDP两种协议。TCP可以提供可靠的字节流服务,保证传输报文不会出错、丢失、顺序错落等,适用与可靠性要求高的场合。而UDP没有TCP的建立连接、拥塞控制等复杂机制,传输的数据可能出错、丢失、混乱等,如果要保证可靠数据传输,需要在上层处理这些意外情况。
在选择通信协议时,从几方面考虑:实时性、可靠性、数据传输量等。考虑到控制命令数据可靠性要求高,数据传输量少等特点,因此传输层控制命令可以有两种方式:一种是采用TCP协议实现准确可靠发送;另一种是采用UDP协议数据报,针对可能发生的数据报丢失,可以采用多次重发来保证数据传输的准确性。采用TCP协议容易实现,而采用UDP则要求数据的基本格式中增加传输控制信息,并在通信的两端做必要的处理,以保证其传输的准确。同时对于多次重发的相同控制命令,要求接收端能够识别并忽略重发的同一控制命令[4]。对两种协议进行比较,从简单可靠等方面考虑,确定在传输层采用TCP适应传输要求。
为了使服务器和客户端软件之间相互配合完成视频监控系统的各项功能,需要有一个统一的应用层协议,考虑控制命令根据服务不同可分为几种情况:(1)连接、登录请求:用户使用客户端向服务器发出登录请求,在登录请求数据包中包括用户名、密码及客户端所在网络地址等。服务器对用户身份确定,向用户返回登录的确认信息。如果登录成功,同时得到监控设备信息列表;(2)视频监控和设备操作请求:客户端从监控设备列表中选择监控设备,发送视频监控请求。服务器确认视频信息,对监控设备采集的视频数据转发。客户端发出对设备具体操作控制命令,服务器执行操作返回结果。
针对控制命令内容的特点和系统的简单性和可扩展性要求,在借鉴已有协议的基础上如图1所示定义以下传输命令格式。
图1 控制命令传输格式
消息长度:2字节,标识此字段以后有效数据的长度,按字节计数。数据类型:1字节,标识数据为何种类型数据。客户端标示:4字节,客户端方的唯一身份标识。服务器标示:4字节,服务器方的身份标示。消息体:实际数据以字符串的形式存储,根据需求分成几个字段,每个字段以空格分隔。
这种格式传输方法的优点是比较简洁地实现了传输,简化了命令数据的接收端解析和发送端生成,同时保证了传输的可靠,减少了字节开销,提高传输效率。但同时无法与其他系统进行互通,依赖专用监控系统。
在确定了传输协议后,给出控制命令传输的总体设计,如图2所示。采用Socket编程实现,分成发送和接收两部分。发送端根据消息格式生成要发送的数据结构,通过Socket发送。接收端接收时对接收数据重组处理,组成完整消息再进行解析得到实际命令数据。
图2 控制命令传输总体设计
在网络编程中,可以不必考虑TCP/IP的实现细节,只需利用协议的网络编程接口Socket(套接字)即可。在Windows中,网络编程接口是Windows Socket,它包含提供了几种类型套接字,流式套接字、数据报套接字和原始套接字,基于TCP的编程是采用流式套接字。
套接字又有阻塞和非阻塞模式,在阻塞模式下,调用函数只有在完成操作后才返回,在单线程下整个进程都会阻塞没有响应。而在非阻塞模式下,函数立即返回。考虑到有时候接收的数据比较大,用非阻塞接收到的一个包可能不完整,只有前面部分数据,再接收接下来的包不太好处理。所以采用阻塞模式加多线程实现[5]。
为了利用面向对象技术编程的抽象封装等特点,本文自定义了一个叫CComm的新类,封装了一些函数,如CreateSocket、ConnectToServer、SendMsg、Recv等,这些函数屏蔽了面向连接的通信程序的实现细节,如创建、连接、发送和接收等,在这些函数里,动态创建辅助线程。可以在主程序里建立一个CComm的对象,通过调用成员函数来实现通信功能。
发送的消息头是按照固定字节字节的,可以通过定义一个结构体来表示。由于结构体对象在内存中分配的空间都是连续的,所以可以将整个结构体直接按二进制发送。而在定义过程中要注意结构体内存字节对齐,为了提高存取速度编译器可能会自动填充字节满足对齐[6]。结构体实际占用的值并不是其中各元素所占字节相加。为了实现数据头按定义的固定长度发送,在结构体定义时设置使用#pragma pack设置字节对齐方式。#pragma pack(1)将对齐方式设为1字节对齐,那么结构体内元素就不会填充字节,实现数据准确发送。
数据的接收实现是在建立连接后建立新线程进行接收处理。在接收线程中通过无限循环接收,当程序退出时循环线程也自动退出。由参考文献4得到TCP是一种流协议,是以字节流的形式传送给接收者的,没有固定的报文或报文边界概念。所以接收时如果对方发送过快,可能同时发送过来的好几个消息都在一个TCP数据包中。或者发送方发送的消息太大,分成几个TCP包发送。为了确定消息边界,所以在消息头中加入数据长度,接收时先接收固定字节数据,确定接下来的消息长度,再根据这个长度接收完整个消息。通过实际接收的长度与在包头定义的长度比较,判断消息是否完整,如果不完整继续接收下一个包接在已有消息后面[7]。
当消息接收完整以后,按照定义的格式转换成特定的数据类型和结构体,通过对消息头里数据的校验,对不同类型的消息做不同处理。具体消息内容在消息体里以字符串的形式存储。通过对字符串的分割查找等处理后最后得到需要的数据,在主程序中显示。解析分成几层,第一层:跟据固定头长度分割为消息头与消息体两部分;第二层:解析出消息体中的回车换行符,并以此为界将消息头和消息体分割成一行行的字段;第三层:根据格式解析各行的字段名,按照不同的字段名调用不同的解析函数,最终解析出各个头字段中的参数值。
本文在分析和比较传输层协议基础上,根据监控系统对控制命令的要求,提出了网络监控系统控制命令的传输方案。采用Socket编程实现,对发送接收和解析部分,介绍了解决办法。
[1] 余腊生,刘勇.基于网络的智能视频监控系统的设计与实现[J].计算机工程与设计,2009,30(16):3 879-3 880.
[2] 王艳艳,房子河,郅晨,等.基于数字网络视频监控的SIP信令系统设计[J].电视技术,2008,32(5):77-78.
[3] 郭洪娜.网络化数字视频监控系统的研究与开发[D].武汉:武汉理工大学,2004.
[4] Stevens W Richard.TCP/IP Illustrated,Volume 1:The Protocols[M].北京:人民邮电出版社,2010:215 -220.
[5] 李洪,彪廖,玲俐,等.基于Socket的远程无线监控系统设计及应用[J].自动化与仪器仪表,2009,(3):19-21.
[6] 郭政慧,王岩.内存对齐对网络通信程序的影响[J].实验室研究与探索,2010,29(5):68-70.
[7] 王宏伟..NET中数据加密与网络安全传输问题[J].网络安全技术与应用,2005,(2):12-14.