>
摘要:介绍了基于GPRS的嵌入式远程视频监控系统的总体结构。运用嵌入式技术完成了远程监控终端设计,在GPRS网络中使用socket进行视频数据传输。详细介绍了如何在所搭建的硬件平台上使用VC++和EVC完成系统软件设计,并最终实现了远程视频监控。
关键词:嵌入式;GPRS;套接字;视频监控
前言
在电子与通信技术的发展过程中,视频监控方式大致可分为3种:本地模拟图像监控、基于PC的多媒体监控、基于Web服务器的远程视频监控。伴随着嵌入式技术的发展,产生了一种基于嵌入式Web服务器技术的远程网络视频监控。本研究开发了基于GPRS的嵌入式远程视频监控系统的软件。
系统结构
整个系统主要分为两个部分:监控中心和远程监控终端(ARM9(SAMSUNG S3C2410),极目W718LC视频图像压缩模块,SIEMENS MC55 GPRS MODEM,CCD摄像头)。监控终端与监控中心的通信,使用中国移动的GPRS网络进行。监控终端通过拨号登录GPRS网络,然后通过中国移动的网关服务器接入Internet网。CCD摄像头采集到的视频图像数据输入极目W718LC视频图像压缩模块,W718LC输出JPEG编码帧的子数据帧,将子数据帧在GPRS网络中发送,监控中心收到数据后显示图像。系统中采用的极目W718LC视频图像压缩模块独立完成从模拟视频信号输入到数字压缩码流输出的全过程,可靠性高,并可以方便地为嵌入式设计增加视频图像压缩功能。
图1 系统总体结构图
系统软件设计
鉴于系统的硬件组成以及中心与终端的通信方式,该系统的软件由3部分组成:监控中心管理软件、监控终端获取视频数据软件和网络通信软件。3部分软件各自完成不同的功能,但又互相协调工作,最终完成无线视频监控的功能。监控中心软件采用VC++在WindowsXP系统下编写,监控终端软件采用EVC在WinCE系统下编写。
监控中心管理软件
监控中心软件主要实现系统与用户对话的功能。在这部分软件中,可以检查GPRS网络的状态(网络是否连通),发送初始化终端设备命令,当收到终端发回的“准备就绪”命令反馈后,中心发送数据传输命令,通知终端发送数据到中心,当收到“视频显示”命令反馈后,中心就可以进行图像显示了。整个过程,如图2所示。
图2 监控中心软件流程
由于采用极目W718LC视频图像压缩模块来输出JPEG视频流,按照厂商的规定,每个JPEG编码帧在输出时被分割并重新包装成多个长度不超过255字节的子数据帧,每个编码帧最多可被分割、重包装成不超过65535个子数据帧,编码帧分割后的各部分编码数据被分别依次封装在各个子数据帧的数据域中。另外一些特殊类型的子数据帧被用来向主机报告状态信息。监控中心软件中定义了一个重要的结构体MyVideo_Packet用于帧的处理。处理后,将得到的每一个完整的JPEG图像数据发送到主窗口进行图像显示。
structMyVideo_Packet
{
BYTEPacketBuf[PACKET_MAXLEN];
LONGPacketType; //按照厂商规定不同的值代
//表不同的类型
LONGPacketLen; //子数据帧的长度
LONGPacketIdx; //子数据帧序号
BYTE3FrameBuf; //存储帧的缓冲区
LONGFrameWrPtr; //读取的有效JPEG帧数据
LONGFrameLen; //有效JPEG帧的长度
LONGResult; //不同类型帧处理后对应的
//不同结果
};
监控终端获取视频数据软件
监控终端在整个系统中负责图像数据的采集并对采集得到的数据进行初步处理,获得需要的帧数据。极目W718LC视频图像压缩模块与S3C2410的UART口相连。监控终端在收到监控中心命令后,初始化W718LC视频模块,将模块输出的JPEG编码帧传到监控中心。整个过程,如图3所示。
图3 监控终端软件流程
为了初始化模块,程序中定义了一个W718LC参数结构体:MyVideo_VENCPARAM。设置的参数最终反映在图像的色彩、压缩质量、编码图像宽度和高度、亮度、对比度以及色饱和度上。程序中还包含了另外一个重要的结构体:
MyVideo_STREAM。
structMyVideo_STREAM
{
BYTEStreamBuf[STREAM_MAXLEN];
//串口中读入的数据流
LONGStreamLen; //数据流的长度
LONGStreamRdPtr; //数据流中已检查过的数据
//的长度
BYTEPacketBuf[PACKET_MAXLEN];
//除去厂商规定的数据帧标
//识前缀后的子数据帧
LONGPacketLen; //子数据帧的长度
LONGScanStep; //对数据流的扫描次数,根据
//扫描次数进行数据流的相
//应操作
};
数据流处理主要是寻找数据流中的子数据帧,以及除去厂商规定的数据帧标识前缀(规定子数据帧的前4个字节为0x55,0xaa,0x55,0xaa)。由于采用了极目W718LC视频图像压缩模块,所以能稳定地输出JPEG格式的图像数据流,不但提高了视频图像的质量,而且增加了视频的流畅性。
网络通信软件
监控中心与监控终端使用(套接字)Socket通信。目前通常使用两种套接字,即流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。流式套接字提供了一个面向连接的、可靠的、数据无错的、无重复发送的及按发送顺序接收数据的服务;数据报套接字提供不可靠的、无连接的数据报传输服务。监控中心与监控终端之间使用C/S模型,即客户机/服务器模型。程序中监控中心作为服务器,监控终端作为客户端。由于无线视频监控终端一般都处在工业现场,没有对话界面,所以套接字在程序启动时就要完成创建,而且服务器程序必须先于客户端程序启动。
监控中心与监控终端的网络通信要负责完成两项工作,一项是负责中心与终端之间的命令及命令反馈的传送。程序中使用数据流套接字完成这部分通信工作,这样就能确保命令正确到达终端,终端反馈信息也能正确到达中心。通信过程,如图4所示。
图4 中心与终端之间的命令及命令反馈的传送
中心向终端传送的命令定义以及中心和终端创建的CSocket的继承类声明如下:
#defineGPRSOK 0x1111; //如终端返回同样的命令,
//则说明GPRS已连接好
#defineTERMREADY0x2222; //让终端准备好的命令,
//如终端也返回TERMREADY,
//说明终端已经准备好
#defineENCSTART0x3333; //让终端进行编码操作
#defineCLOSEALL0x4444; //关闭终端已打开的串口
//和新建线程的命令
classCTCPSocket:publicCSocket
//中心CSocket的继承类声明
{
public:
CTCPSocket();
virtual~CTCPSocket();
virtualvoidOnAccept(intnErrorCode);
//接受终端连接
virtualvoidOnReceive(intnIDEvent);
//连接建好后,如终端有数据发
//送到中心则触发此事件,进行
//数据接收
UINTshowstate;//主界面显示状态代码
};
classCTCPSocket:publicCSocket
//终端CSocket的继承类声明
{
public:
CTCPSocket();
virtual~CTCPSocket();
virtual void OnReceive(intnIDEvent);
//连接建好后,中心有数据发送
//到终端就触发此事件,进行数
//据接收
};
监控中心与监控终端的网络通信要完成的另一项重要工作是视频数据的网络传输。在TCP和UDP两种网络协议中,UDP更适合于在网络环境的视频传输。当监控中心接收到数据后,经过处理,最终在主窗口中显示视频图像。
结束语
本研究设计的软件在整个系统中运行稳定、占用的系统资源比较少。软件不但可以应用在无线网络中,而且可以应用在以太网中。经测试,最终得到的图像质量良好。