基于ARM-Linux远程视频监控系统的设计

2014-03-06 05:40王宏志宇皓林
吉林大学学报(理学版) 2014年1期
关键词:内核线程嵌入式

王宏志,宇皓林

(长春工业大学 计算机科学与工程学院,长春 130012)

嵌入式技术目前已成为集网络通信、信号处理和图像应用等功能为一体的、拓展性能强的综合性技术.新兴的嵌入式远程监控系统就是基于嵌入式技术,与网络技术相结合产生的新一代监控体系.

本文设计一种以COALL2440开发板为基础的远程视频监控系统.该系统采用B/S(浏览器/服务器)结构,基于ARM9和Linux操作系统;服务器图像采集端采用USB接口的CMOS传感器摄像头,运用MPEG-4压缩编码方式,利用boa和CGI设计 Web服务器,通过以太网发送到远程客户端,客户端可使用PC机和智能手机接收监控图像,从而使客户端实现远程监控.

1 硬件设计

根据系统对硬件的要求,本文设计的嵌入式远程视频监控系统采用基于ARM920T核的S3C2440微处理器作为硬件平台,主频400MHz,COALL2440开发板配置一个64Mb NAND Flash(K9F1208)和64Mb SDRAM,一个 20 芯 Multi-ICE 标准JTAG 接口,一个 DM9000AEP 10M/100M网口,一个连接视频摄像头的USB接口,一个可直接挂接硬盘的IDE接口.硬件结构如图1所示.

图1 硬件结构Fig.1 Hardware structure

2 软件开发平台

系统使用Linux操作系统,内核版本为Linux 2.6.30,根文件系统为Cramfs文件系统.嵌入式系统分4个层次:1)引导加载程序;2)Linux内核;3)根文件系统;4)用户应用程序.

2.1 建立交叉编译环境 制定所需的Linux系统前要先搭建交叉编译环境.由于嵌入式系统本身的存储空间有限,不宜直接在嵌入式系统上进行开发,因此需要建立交叉编译环境.嵌入式Linux使用的交叉编译是在宿主机上生成开发板上的可执行代码,包括编译、编辑引导程序(bootloader)、Linux2.6内核和Cramfs根文件系统.本文系统使用arm-linux-gcc-3.4.1版本编译器.

Bootloader,即引导加载程序,通过一段小程序可将系统的软硬件置于一个合适的运行环境中.Bootloader一般分为两个阶段:1)运行在Flash内,初始化CPU内部,如寄存器和内存等;2)运行在RAM中,初始化网卡和串口等,但最初都放在Flash内.

2.2 Linux系统的移植与配置 由于Linux系统默认不支持ARM处理器,因此必须修改系统配置以实现对ARM的支持.进入内核目录,修改Makefile文件时要设置PATH环境变量,该环境变量是交叉编译工具编辑时增加的路径,使ARM能找到建立的交叉编译工具链[1].

1)进行Linux配置内核make menuconfig.根据远程视频监控系统特定的需求,选择在配置菜单中添加内核的相关支持选项.系统需要添加对处理器S3C2440的支持、Video4Linux支持、USB设备的支持、网络的支持和对Cramfs文件系统的支持等.

2)输入make zImage编译内核,得到Linux内核压缩映像zImage.

3)使用mkcramfs把根文件目录制成COALL2440.cramfs映像文件.制作根文件系统会用到busybox,它集成了最常用的Linux命令和工具.

4)安装DM9000网卡和USB口的驱动程序,即完成了系统的移植与配置.

3 应用模块设计

3.1 视频数据采集模块 Linux对视频数据采集设备的支持通过Video4Linux(V4L)实现.V4L是一种应用程序编程接口(API),API分为两层:下层为音频视频驱动程序;上层为Linux内核提供给用户空间的API.对于USB接口摄像头,驱动程序中有一个struct file_operation结构,它描述了在设备上能进行的各种操作.本文系统中包括基本的I/O操作接口函数open(),close(),read(),write()和对I/O通道控制接口函数ioctl()[2].

编写图像采集应用程序时,先定义一个结构用于保存图像采集时的各种参数和信息,该结构如下:

图2 视频采集流程Fig.2 Flowchart of video capture

要完成摄像头对视频图像数据的采集,就要先获得视频采集设备信息和图像信息,并进行相应的初始化,才能保证采集图像顺利进行.若有需要可在采集过程中更改设备相关设置[3].视频采集流程如图2所示.

3.2 视频数据压缩模块 获取视频数据后,要先去掉冗余信息,减轻网络负载,并在网络传输前对其进行压缩.本文系统中,对摄像头采集到的图像数据采用开源软件xvidocre进行MPEG-4标准压缩[4].

3.3 网络通信模块 Linux具有强大的网络功能,远程监控的实质是运用网络对采集到的数据进行远程传输.根据不同指令的自身特点及对网络的要求,分别采用不同的协议进行管理,本文系统的网络模块,对控制指令和数据指令分别采用TCP/IP协议和RTP/RTCP协议进行管理,使用不同的包封装策略.

3.3.1 RTP/RTCP协议 目前解决实时流媒体传输问题的最好方法是RTP(实时传输协议),JRTPLIB是一个用C++语言实现的RTP库,用于帮助实现实时流媒体编程[5].

RTP被划分在传输层,建立在UDP上.与UDP协议一样,为实现实时传输功能,RTP也有自己固定的封装形式.RTP为端到端的实时传输提供时间信息和流同步,RTP本身并不能为按序传输数据包提供可靠的保证,服务质量由RTCP(实时传输控制协议)提供.RTP协议将得到的MPEG-4视频数据封装成RTP数据包,并交给下层UDP协议进行处理,MEPG-4数据包的封装形成以IP/UDP/RTP协议为基础的包封装.RTP协议同时接收下层通过UDP传递的报文.RTCP协议负责完成服务质量的监测、反馈和控制报文的发送[6].当RTP会话被一个应用程序建立后,其即被指定一对传输地址.一般的传输地址由一个网络地址和一个端口组成,但RTP会话需要多一个端口给RTCP包.RTP数据包发向是偶数端口,RTCP即发向偶数端口+1的奇数端口,两个端口协同工作保障RTP包的正确发送.RTP主要流程如下:

1)生成一个RTPSession类来实例此次RTP会话,并获得接收端的IP地址和端口号.dip=inet_addr(argv[1]);dip=ntohl(dip);dport=atoi(argv[2]).

2)创建此次RTP会话sess.Create(bport);参数为此次RTP会话所采用的端口号;获取会话接收端的地址和端口sess.AddDestination(dip,dport).

3)设置RTP会话默认参数,从而简化数据发送.同一个RTP会话中,负载类型sess.SetDefaultPayloadType(), 标 识 sess.SetDefaultMark(), 时 戳 增 量sess.SetDefaultTimeStampIncrement()都相同,在发送数据时只需指明发送的数据和其长度即可.

4)发送流媒体数据sess.SendPacket(buf,strlen(buf)).

5)RTP数据接收端调用sess.PollData()方法接收RTP,通过调用GotoFirstSourceWithData()和循环调用GotoNextSourceWithData()方法检测那些携带RTP数据的数据包,并不断调用sess.GetNextPacket()从指定的端口读取RTP数据包,处理完数据后及时释放数据包.

3.3.2 TCP/IP协议 TCP(传输控制协议)是面向连接的,提供可靠的数据传输,因此适合传输控制指令.TCP套接口通信工作流程如图3所示.创建套接口,绑定端口和IP地址,服务器端监听网络中的客户端.服务器阻塞,等待连接请求,直到客户端程序发送连接请求.当服务器端接收到一个连接请求时,会创建一个新的进程,以后的数据传输和读取就通过这个新进程处理,原来的进程继续监听网络.客户端同样建立一个套接口,并填充要连接的服务器端资料,连接远程计算机指定的端口,成功连接后,即可实现客户端与服务器端的数据传输.完成通信,关闭连接[7].

图3 TCP套接口工作流程Fig.3 Flowchart of TCP socket

3.4 Linux下的多线程技术 多线程是现代操作系统所支持的一种重要多任务机制.线程是内核进行调度的基本单元,每个用户级的线程都一一映射到内核,一个线程进行系统调用被阻塞不会影响同一个进程所创建的其他线程.实施远程监控系统中需要用到的视频采集模块、视频压缩模块和图像传输模块等通过多线程技术实现对多个程序的并发执行,极大提高了系统的整体运行效率,节省开销和耗时.

Linux下使用多线程技术进行程序设计主要是使用POSIX标准所规定的API接口实现.多线程程序设计时,经常要用到数据共享区,因此实现多线程程序设计的关键是多线程之间的同步.pthread_t,pthread_mutex_t和pthread_cond_t是常用的数据结构,分别定义线程的标识符、互斥锁和条件变量.条件变量的触发特性和互斥锁的二值性决定了两者必须搭配使用,条件变量用于阻塞一个线程,互斥体用于确保一个线程对共享数据进行独占式访问、获取或修改.使用时,先指定的互斥锁将被线程释放,然后线程将阻塞,等待条件变量被其他线程触发.函数返回前,线程重新获取互斥锁并继续测试条件是否满足[8].

多线程技术使用的主要函数如下:1)pthread_create(),创建一个新的线程;2)pthread_cond_signal(),唤醒条件变量cond上阻塞的线程;3)pthread_cond_wait(),使线程阻塞在一个条件变量cond上;4)pthread_mutex_lock(),用于对mutex指向的互斥体进行加锁(阻塞).

4 服务器与客户机的设计

4.1 嵌入式Web server 本文系统选用boa作为服务器,支持CGI,单线程Web server,因此boa不会fork出新的进程用于处理用户的并发连接请求,即boa是被进行类似于独占式访问的,只有CGI脚本运行时boa才会fork出新的进程执行.

CGI是Web server与外部扩展应用程序交互的一种标准接口,CGI程序由html页面和运行在服务器上面的程序组成.开发时应先构建html页面(表单),再编写服务器程序(CGI程序)[9].

图4 Boa服务器工作流程Fig.4 Flowchart of boa server

远程客户端浏览器通过HTTP协议向Web服务器发送请求,服务器接收请求.由于一个URL指向一个CGI脚本,服务器按照URL指向的CGI应用程序,执行应用程序.CGI脚本通过环境变量和标准输入从Web服务器得到要执行的操作,通过环境变量和标准输出将结果返回给服务器,服务器再把结果返回给客户端,其流程如图4所示.

4.2 智能手机客户端的实现 为了方便客户端进行实时视频监控,本文系统采用JDK+eclipse设计在Android智能手机上运行的应用程序,通过网络连接到嵌入式Web服务器即可实现远程监控.

设计网络浏览器软件时,主要流程如下:

1)使用urlText=(EditText)findViewByID(R.id.url)从 myweb.xml文件中得到输入的网址,其中myweb.xml是布局文件,由它得到触屏的输入;

2)使用ToPage(urlText.getText().toString().trim())函数处理获取的网址,在函数中使用loadurl(wv,url)函数设置 WebView要显示的网页,其中:url是输入网址;wv是页面的显示.在loadurl(wv,url)中使用view.loadUrl(url)真正实现网页的载入显示.

设计视频播放软件时,主要流程如下:

1)设置MediaPlayer将要播放的视频文件 myMediaPlayer.setDataSource(path),其中path为视频源的路径;

2)设置 MediaPlayer的视频输出界面 myMediaPlayer.setDisplay(mySurfaceHolder);SurfaceView用于显示视频,SurfaceHolder用于控制SurfaceView,将播放视频的SurfaceView对应的SurfaceHolder对象作为setDisplay()的参数;

3)myMediaPlayer.prepare();在设置播放的视频数据源后,MediaPlayer需要对其进行解码;

4)MediaPlayer开始视频播放myMediaPlayer.start().

由于客户端只需播放已经在嵌入式系统中存储好的视频文件,因此只需两个功能模块即能实现智能手机的网络监控:Web浏览器模块和视频播放器模块.在Android手机上使用已经编译好的apk应用软件,输入IP地址连接到嵌入式服务器,选择要播放的图像文件进行视频播放,实现在移动客户端的视频图像播放.手机视频图像监控图像截图如图5所示,网络浏览器截图如图6所示.

图5 视频图像监控Fig.5 Video surveillance

图6 网络浏览器Fig.6 Internet browser

[1]何永琪.嵌入式Linux系统实用开发 [M].北京:电子工业出版社,2010.

[2]ZHANG Xiao-dong,LI Xiu-juan,ZHANG Jie.Design of Embedded Remote Monitoring System Based on the ARM [J].Modern Electronics Technique,2008,31(6):22-23.(张晓东,李秀娟,张杰.基于ARM的嵌入式远程监控系统设计 [J].现代电子技术,2008,31(6):22-23.)

[3]YANG Ying,CHEN Zhi-long,HUANG Jie,et al.Embedded Remote Monitoring System Based on the USB Camera[J].Security and Safety Technology Magazine,2007(3):24-26.(杨颖,陈之龙,黄杰,等.基于USB摄像头的嵌入式远程视频监控系统 [J].安防科技,2007(3):24-26.)

[4]刘禾.数字图像处理及应用 [M].北京:中国电力出版社,2006:227-230.

[5]Cline L S,Du J,Keany B,et al.DirectShowTMRTP Support for Adaptivity in Networked Multimedia Applications[C]//Proceedings of the IEEE International Conference on Multimedia Computing and Systems.Washington:IEEE Computer Society,1998:13.

[6]Tanenbaum A S.计算机网络 [M].熊桂喜,王小虎,译.北京:清华大学出版社,2002:99-199.

[7]Kurose J F,Ross K W.计算机网络 [M].陈鸣,译.北京:机械工业出版社,2009:211-233.

[8]WANG Chen-ying.Design and Research of Embedded Remote Monitoring System Based on the ARM9 [D].Beijing:Beijing University of Posts and Telecommunications,2009.(王晨营.基于ARM9的嵌入式远程监测系统的设计与实现 [D].北京:北京邮电大学,2009.)

[9]张移山.CGI程序设计指南 [M].北京:中国水利水电出版社,2002:33-80.

猜你喜欢
内核线程嵌入式
强化『高新』内核 打造农业『硅谷』
基于国产化环境的线程池模型研究与实现
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
搭建基于Qt的嵌入式开发平台
浅谈linux多线程协作
嵌入式软PLC在电镀生产流程控制系统中的应用
微生物内核 生态型农资
Altera加入嵌入式视觉联盟
倍福 CX8091嵌入式控制器