跟着网络技能和嵌入式技能的迅猛开展,经过网络来完结视频监控现已得到了广泛的运用,3G网络以其高带宽使得传输流通的视频信息成为可能,本文在选用3G技能的基础上规划了一款依据嵌入式Linux的无线终端,在数据处理部分选用了Linux的Netfilter架构,经过挂载钩子函数来完结数据包在内核态的获取及高效转发,而且经过在Linux内核拓荒一片缓冲区,处理了视频服务器与3G模块拨号延时而形成的速率不匹配的问题,减少了数据丢包。合作Netfilter用户态办理东西iptables的运用,可完结包过滤防火墙,及NAT等功用,然后便于本体系对流经其数据包的办理。
另一方面临嵌入式Linux的视频收集程序的规划进行了具体的介绍,并将其实践运用到了本体系的数据收集模块中去,完结了数据的收集作业,一起针对现在市场上对与3G模块一般只供给Windows CE下的驱动这一状况,开发了嵌入式Linux体系下的3G模块驱动程序,在软件规划上充分发挥了开源软件的优势,选用高效的Xvidcore编解码库,来完结视频的编码,以及运用PPP源码来编译拨号上网东西,本钱低价而且缩短了体系的开发周期,使得本体系具有较强的工程实用价值。
1 、体系硬件结构
硬件上选用“ARM+3G模块”体系架构。ARM与3G模块选用别离模块的规划办法,经过USB线相连,较全体规划而言具有更好的灵活性,使得一些现有的以ARM为主处理器的体系能够很好地扩展3G功用,便于产品的过渡。本体系的中心处理器是S3C2440A,S3C2440A是一款由SamSu-ng半导体公司推出的依据ARM920T内核的16/32位RISC微处理器。内部带有全功用的MMU(内存处理单元),主频为400MHz最大可抵达533MHz,供给了一个数字摄像头接口(Camera Interface)。具有高功用、低功耗、接口丰厚和体积小等优秀特性。而3G模块中心部件选用的是MC8630模块,该模块具有语音、短信和高速数据业务等功用,能够广泛运用于高速数据传输、安防、无线媒体、直放站监控、铁路终端和车载监控等范畴。
体系硬件结构如图1所示。
2 、体系软件规划
体系首要由视频收集模块、数据处理模块、网络转发模块组成。
2.1 视频收集模块规划
依据项意图实践需求,在本体系中视频数据来历首要有两个方面:
1)体系与可供给自动上传功用的视频服务器经过RJ45网线直接相接 首要用于完结多路视频图画收集。视频服务器的首要功用是将摄像头收集的数据完结编码紧缩,而且将紧缩的数据以IP包的办法发送给接纳端,因为该类视频服务器一般是在局域网内运用,现在还很罕见关于3G网络的支撑,跟着3G技能在国内开展的不断深入,将在很大程度上替代有线网络。所以本体系可作为现有视频服务器的3G功用扩展。针对在外接视频服务器时只需对收到的数据包进行转发而无需对IP数据自身做剖析处理的问题,而且在体系发动到3G模块拨号成功取得IP地址之间会有必定的推迟,在本体系中提出了选用Linux的Netfilter架构的办法以及缓冲机制,经过在数据流经TCP/IP协议栈时挂载钩子函数,完结IP数据在内核态的获取,而且经过在内核拓荒一块足够大的环形缓冲区来存储数据。因为体系需求频频对缓冲区进行读写,为防止发生内存碎片,在本体系中选用了环形行列的数据结构。在3G模块取得IP地址后,再经过驱动读取缓冲区中的数据,由3G网络完结转发,然后下降丢包率而且进步数据包的转发功率。因为传统的办法是选用socket API来进行网络编程,其对数据的拜访一般发生在用户态,关于Linux操作体系来说,用户进程的优先级和所占用的CPU时刻要远远小于内核线程,一起内核进程具有较高的履行优先度,故在网络布局答应取得IP数据包的条件下,将用户态的数据包获取功用载入内核态,可进一步进步体系的处理才能,添加体系的有用带宽,本办法还可用于其他对IP数据自身进行处理而且对处理功率有严苛要求的体系中,例如:本办法在本实验室与某航空院合作开发的IP-TS协议转化器上也得到了成功的运用,具有必定的通用性。Netfilter是Linux 2.6.x系列内核供给的一套数据包过滤结构,依据该结构的软件能够完结如数据包过滤、网络地址转化(NAT)等功用。要运用Netfilter,在内核编译时设置“Network Packet Fihering”选项。Netfilter供给了一个笼统、通用化的结构,作为中间件,为每种网络协议(IPv4、IPv6等)界说一套钩子函数。关于Ipv4协议界说了5个钩子函数,这些钩子函数在数据报流过协议栈的5个要害点被调用,Netfilter能够在经过TCP/IP协议栈的途径中的几个界说杰出的点上捕获数据包,IPv4中的一个数据包经过netfilter体系的进程如图2所示。
NF_IP_PRE_ROUTING
在对数据包进行初始正确性查看(校验和等)后,截获该数据包。
NF_IP_LOCAL_IN
假如数据包即将抵达本地主机,则捕获该数据包。
NF_IP_FORWARD
假如数据包即将抵达某些其他主机,则捕获该数据包。
NF_IP_LOCAL_OUT
在本地捕获其意图地是外部的已创立的数据包。
NF_IP_POST_ROUTING
这是最终的钩子,在此之后将传输数据包。
内核netfilter结构在/usr/src/inelude/linux/netfilter.h中界说,相似如下:
参数是:
list
Netfilter自身是一个钩子链;它指向netfilter钩子的头部,一般设置为{NULL,NULL}。
hook
该函数在数据包碰到钩子点时被调用。该函数与前面描绘的函数相同,它有必要回来NF_ACCEPT、NF_DROP或NF_QUEUE。假如回来NF_ACCEPT,则下一个钩子将被附加到即将调用的点。假如回来NF_DROP,则数据包被丢掉。假如回来NF_QUEUE,则对数据包进行排队。sK_buff指针被传递到该函数中,并用数据包信息如IP报头、TCP报头号进行填充,能够运用sk_buff结构指针来操作或删去数据包(要删去数据包,只需将skb指针设置为空即可)。
pf
协议簇;例如,适用于IPv4的PF_INET。
hooknum
钩子的挂载点,因为本体系不需求在本地对数据包进行任何处理,因而挑选的挂在点为NF_IP_PRE_ROUTING,在对数据包进行正确性校验后就调用钩子函数处理数据包。Priority标明钩子的优先级,在本体系中选用高优先级处理NF_IP_PRI_FIRST。
内核数据处理的要害是钩子函数的编写,此函数规矩了数据包在抵达时需求进行的处理进程。
钩子函数结构如下:
能够将现已注册入内核的钩子函数撤销,此刻,接纳到数据包将依照内核的默许规矩来进行处理。流程如图3所示。
2)直接选用CMOS摄像头作为视频收集设备 该视频收集模块在硬件上S3C2440带有CMOS摄像头接口,在开发板上经过称为CAMERA的接口引出,而且带有camera操控器,在本体系中运用了OmniVision公司的OV9650摄像头。S3C2440支撑ITU-R BT601/656格局的数字图画输入,支撑2个通道的DMA,Preview通道和Codec通道,参见图4。
Preview通道能够将YCbCr4:2:2格局的图画转化为RGB(16bit或24bit)格局的数据,并存放于为PreviewDMA分配的内存中,最大分辨率为640×480。首要用于本地液晶屏显现,Codec通道能够输出YCbCr4:2:0或YCbCr4:2:2格局到为Codec DMA分配的内存中。最大分辨率为4 096×4 096,首要用于图画的编解码处理。在本体系中运用的是Codec通道。
视频收集模块的规划选用的是V4L2(Video for Linux Two)V4L2,它是Linux下开发视频收集设备驱动程序的一套规范,该规范选用分层的办法给驱动程序的开发供给了明晰的模型和共同的接口,而且正对视频设备的运用程序编程也供给了一系列接口函数。其间运用程序处于最上层,V4L2处于中间层,而实践的硬件设备则处于基层,其自身包含两层驱动结构,上层是videodev模块,基层为V4L2驱动程序。video-dev经过V4L2驱动程序的成员函数来调用V4L2驱动。在V4L2驱动的驱动程序初始化进程中,它首要枚举它即将处理的体系中的设备,为每个设备填充struct v412_device结构,而且将指向该结构的指针传递给v412_register_device()函数,该函数调用v4L2_deviee结构体中的初始化函数对设备进行初始化。当v412驱动程序初始化完结后,v412经过传递一个包含驱动程序成员函数,次设备号以及相关信息的结构给videod-ev,然后完结它即将处理设备在videodev的注册作业,当运用程序经过体系调用触发了某个驱动程序时,操控权首要传递给videodev中的函数,videodev将运用程序传递的文件或i节点结构指针转化为相应的v412结构指针,并调用v412中的处理函数。以本体系以OV9650摄像头为例,其驱动结构如图5所示。
视频收集进程如下,运用程序首要翻开视频设备文件,摄像头在体系中对应的设备文件为/dev/camera,经过体系调用“open(“/ dev/camera”,O_RDWR)”函数翻开该设备,取得一个文件描绘符fd,运用ioctl(fd,VIDIOCGPICT,&capability)函数获取摄像头的相关信息,例如设备称号、支撑的最大最小分辨率、信号源信息等,填充在结构体video_capability中,经过调用ioctl(fd,VIDIOCGPICT,&pict-ure)获取图画的相关信息如收集图画的对比度、亮度、调色板等特点,而且填充在video_picture结构体中,在获取这类信息后,可依据实践需求来对其从头赋值,具体做法是将需求设置的值赋给相应结构体,然后经过体系调用ioctl(fd,VIDIOCSPICT,&)函数写入设备。在图画获取办法上运用mmap()体系调用来完结内存映射抵达各进程同享内层的意图,运用同享内存通讯的一个清楚明了的优点是功率高,因为进程能够直接读写内存,而不需求任何数据的复制。运用mmap办法获取图画数据,需求首要设置图画帧的缓冲区结构,即struct video_mmap,如每次收集帧数,图画高度、宽度,图画调色板格局等等。然后调用ioctl(fd,VIDIOCMCAPTURE,&grab_buf)发动捕获进程。调用iotcl(fd,VI-DIOCSYNC,&frame)等候收集完结,若该函数成功回来则表明收集结束,收集到的图画将放在经过mmap()映射的内存区域内,读取该内存数据即可取得图画数据,其间frame为当时截取的帧数,V4L2答应一次收集多帧数据,可经过设置grab buf.frame来完结。调用close(fd)函数封闭设备文件,停止图画收集。
2.2 视频数据处理模块规划
由视频收集模块获取的视频图画需求经过3G网络来进行传输,而从摄像头直接纳集的未经紧缩的数据量非常大,为了在不影响图画质量的前提下进步传输功率,本体系中对原始取得的视频图画进行了紧缩编码。因为MPEG-4是专门为播映流式媒体的高质量视频而规划的,而且MPEG-4规范以其高紧缩比、高质量、低传输率现已成为现在网络多媒体传输的首要格局和规范。它可运用很窄的带宽,经过帧重建技能紧缩和传输数据,以求使得用最少的数据取得最佳的图画质量而且能够保存接近于DVD画质的小体积视频文件。在本体系中选用开源的Xvidcore作为视频紧缩模块的中心算法。Xvidcore是一个高效而且便于移植的编码软件。它不只支撑Simple Profile和Advanced Profile,还支撑I/P Frames B-Frames Interlacing和GMC,以钻石和方块形式来进行PMVFast和EPZS运转估量,是现在比较盛行的MPEG-4编码软件。Xvidcore源码可从网上下载免费取得,现在最新版为xvidcore-1.2.2,它供给了一系列的库函数及接口函数供运用程序运用。但针对嵌入式体系渠道,要运用该库需求将其移植到嵌入式体系中。移植进程如下:
解压源代码:tar-zxvf xvidcore-1.2.2.tar.gz;在运用前需求对xvidcore-1.2.2进行穿插编译,过程如下:
1)设置环境变量:export=“xvidcore当时地点目录”;
2)进入/build/generic目录;
3)生成Makefrle:/configure-host=local hostbuild=arm-linux-gcc;//指定穿插编译东西以便进行穿插编译;
4)编译源代码:make。
将穿插编译生成的库文件libxvidcore.so.*复制到穿插编译器作业目录lib子目录中。完结编码库的移植作业。
以上对个独立模块进行了介绍,在软件完结上对体系进行了全体规划,将各个模块有机的组合在一起,并充分考虑了体系的可扩展性。
首要结构体如下:
以视频紧缩模块为例,其软件流程如图6所示。
2.3 网络转发模块规划
在完结对收集图画的紧缩或许接纳完视频服务器后,需求将数据经过3G网进行转发,完结网络数据转发一般采纳的办法是运用Linux供给的socket API进行,socket给用户供给了一致的编程接口,网络传输协议一般有TCP和UDP两种,关于TCP每非必须经过3次握手树立衔接,在等候乱序及重传丢掉数据时会发生较大延时,而UDP又缺少流量操控,所以都不太适用于实时数据传输,在这种状况下运转于UDP之上的RTP则具有很大的优势,现在关于有实时要求的数据传输RTP是最好的协议,故在本体系中运用了RTP协议作为数据传输协议,流程如图7所示。
2.4 3G模块驱动规划及联网
3G模块与ARM是经过USB相连的。无线终端到3G网络的衔接是经过PPP协议完结的,PPP协议是一种点对点串行通讯协议,为在点对点衔接上传输多协议数据包供给了一个规范办法。因为现在嵌入式市场上的3G模块基本上都是供给Windows CE操作体系下的驱动程序,但关于嵌入式Linux下面的现在还没有驱动支撑,所认为本体系开发了3G模块的驱动程序。要完结3G模块的拨号上网功用,需求3个层面的支撑:1)是内核层面;2)驱动层面;3)运用程序层面的支撑。内核层面首要是经过对内核的从头装备来完结,因为3G模块与ARM经过USB线衔接,而上层的PPP通讯选用的是串行协议,所以要在内核中参加USB转串口的支撑,经过makemenuconfig指令进入内核装备界面,顺次挑选Device Drivers-》USB support-》USB Serial Converter Support挑选USB Generic Serial Driver按两次空格键使项现在加[*]将其编译入内核,其间加*为编译成内核模块,加M为编译为模块。因为选用的是PPP协议,故要在内核中参加PPP的支撑。进入内核装备界面今后,顺次挑选DeviceDrivers-》Network device support-》PPP(point-to-point)protocol support选中,将PPP编译入内核,一起挑选PPP打开项,将其悉数编译入内核,保存退出。关于驱动层面,3G模块的驱动开发首要是经过修正两个文件generic.c以及usb-serial.c,其间generic.c为USB通用程序,usb-serial.c为USB转串口程序。经过在其间参加一些网络层的hook函数来抵达对上层协议的支撑。将修正往后的文件复制到/linux2.6.29/drivers/usb/serial,从头编译内核,生成zImage镜像,然后下载到板子上。完结3G模块驱动的规划以及内核对PPP协议的支撑,关于拨号上网运用程序的支撑,首要是经过PPP供给的两个东西pppd和chat来完结的,其间PPP供给了一种点对串行线路上传输数据流的办法,chat首要用于拨号并等候提示。可从网上下载PPP源码,在本体系中选用的版别为PPP-2.4.0,下载后要解压而且依据方针板的类型来进行穿插编译得到拨号程序。
3 、结束语
本文在一块ARM开发板上完结了多种功用,包含无线数据视频终端,经过外接视频服务器完结了现有视频服务器的3G功用扩展,经过选用了Netfilter与socket结合的办法,将数据包获取功用从用户态载入Linux内核态,防止了数据的内存复制,进步了处理功率,一起引进内核缓冲机制。处理了3G拨号延时而形成的视频服务器丢包问题,合作Netfilter用户东西iptables的运用,能够在本体系上完结NAT,包过滤防火墙等功用。便利对流经体系数据包的办理。
针对现在市场上的3G模块大多只供给Windows CE下驱动这一问题,开发了3G模块驱动,使得现有3G模块可运用与嵌入式Linux体系下,用户可直接在此基础上经过socket进行编程,而无需考虑底层的硬件通讯问题。在软件规划上充分发挥开源软件的优势,选用Xvideore进行视频编码,以及PPP源码编译拨号软件等,缩短了体系开发周期,体系在软件的全体规划上提出了一套相对通用的软件架构,可便利完结功用的扩展及晋级。
责任编辑:gt