基于A8的嵌入式Linux远程视频监控系统的设计与实现
2016-05-31姚莉邓丹君
姚莉 邓丹君
摘 要:将网络技术和嵌入式技术相结合的远程视频监控系统是视频采集技术的发展趋势,文中提出了一种基于对等网络模型的嵌入式远程视频监控系统的设计方案。该方案将嵌入式系统和Web开发技术相结合,再利用USB摄像头作为视频监控系统的终端进行图像采集,并使用网络TCP协议将其远程发送给服务器终端。相较于传统的Client/Server网络模型,本系统实现采用对等网络模型,即确定发送命令的控制程序既可以是客户端,又可以是服务端。文中选择嵌入式开发平台ARM系列A8处理器进行研究和设计,并采用PC机下的Linux系统作为主机开发环境。
关键词:嵌入式;视频监控;网络远程控制;对等网络
中图分类号:TP39 文献标识码:A 文章编号:2095-1302(2016)05-00-03
0 引 言
网络远程控制(Network Remote Control,NRC)是利用计算机网络对远程计算机进行操作的一种控制方式。计算机技术和网络技术目前都在高速发展,现在监控系统已经发展到网络视频监控系统[1]。网络视频监控具有数字视频监控和网络传输技术的优点,其具有不受地理位置约束、扩展方便简单、信息处理较容易等特点,可以使远程的管理和维护变成现实,只要是网络覆盖的地方,就能实现网络监控[2]。嵌入式系统向网络发展已成必然趋势,目前嵌入式系统对网络协议如TCP/IP协议和HTTP协议的支持也越来越广泛。
1 系统硬件设备选择与配置
系统硬件设备选择凌阳嵌入式A8教学实验系统进行设计与实现。该实验箱基于ARM CortexTM-A8内核的处理器S5PV210,该芯片又名“蜂鸟”(Hummingbird),是三星公司推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器[3]。本系统使用了人机交互模块的USB接口、多媒体模块摄像头接口及通信模块以太网接口。
1.1 USB摄像头
摄像头属于视频类设备。在目前的Linux核心中,视频部分的标准是Video for Linux(简称V4L)。这个标准其实定义了一套接口,内核、驱动、应用程序以这个接口为标准进行交流。目前的V4L涵盖了视、音频流捕捉及处理等内容,USB摄像头也属于它支持的范畴。
本系统所采用的嵌入式Linux操作系统如果需要使用USB摄像头则必须在内核配置时添加Video4Linux驱动和对USB摄像头驱动模块的支持。本系统的设计与实现采用静态加载以上驱动。首先进入Linux源代码所在的目录,在终端输入make menuconfig命令,在基于Ncurses内核配置图形界面进行内核选项的配置。选中多媒体设备选项“Multimedia device->”,进入多媒体设备配置界面,选中“Video For Linux”,加载Video4Linux模块,就可以使内核实现对Video4Linux驱动的支持,为视频采集设备提供编程接口。在内核配置主界面,选中USB支持选项“USB support—>”,选中“USB Multimedia device”选项下的“USB OV511 Camera support”,使内核中加入OV511接口芯片的USB数字摄像头的驱动支持。OV511 USB 摄像头驱动配置界面如图1所示。
图1 OV511 USB 摄像头驱动配置界面
1.2 开启帧缓冲设备
帧缓冲(Frame Buffer,FB)是Linux为显示设备提供的一个接口,是把显存抽象后的一种设备,它允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。由于FB设备驱动为受限驱动,因此必须进行设备开启。本系统开发环境采用发行版Linux操作系统Ubuntu10.10,Ubuntu下启用FB设备的一般步骤如下所示:
安装v86d和hwinfo两个包查看显卡是否支持,并设置本机支持模式。
修改启动文件/etc/default/grub,如图2所示。
图2 修改启动文件图
修改modules文件/etc/initramfs-tools/modules,如图3所示。
图3 修改modules文件
更新以上两个文件并重启系统,即可查看到FB设备,具体如图4所示。
图4 查看FB设备
2 系统软件设计
本系统软件由摄像头驱动模块、图像采集模块、网络传输模块和网络服务器模块组成[4]。摄像头驱动模块使得摄像头为应用程序编写提供系统编程接口。功能主要包括摄像头设备信息的获取与设置、设备的打开和关闭、信号通道选择、窗口初始化等。图像采集模块的作用是使用编程接口获取摄像头采集来的图像信息并进行暂时存储。服务器通过网络传输模块与远程监控PC机端进行信息交流。
2.1 V4L图像信息采集流程
V4L图像信息采集流程分为如下几步:
(1)打开摄像头设备
int vd ->fd = open(“/dev/video0”, O_RDWR);
(2)读video_capability 中的信息,成功后可读取vd->capability各分量ioctl(vd ->fd, VIDIOCGCAP, &(vd->capability));
(3)读video_picture中的信息,成功后可读取图像的属性ioctl(vd ->fd, VIDIOCGPICT, &(vd->picture));
(4)初始化channel
int i;
for (i = 0; i < vd ->capability.channels; i++) {
vd ->channel[i].channel = i;
ioctl(vd ->fd, VIDIOCGCHAN,&(vd->channel[i]));}
(5)用mmap(内存映射)方式进行图像信息采集
vd ->map = mmap(0, vd->mbuf.size, PROT_READ|PROT_WRITE,MAP_SHARED, vd->fd, 0));
(6)mmap方式下真正做视频截取的 VIDIOCMCAPTURE对采集的图像信息进行处理:
ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap));若调用成功,开始一帧的视频截取,是否截取完毕留给VIDIOCSYNC来判断。
ioctl(vd->fd, VIDIOCSYNC, &frame) ;
调用VIDIOCSYNC等待一帧截取结束。若成功,表明一帧视频截取已完成。可以开始做下一次VIDIOCMCAPTURE。frame是当前截取的帧序号。
(7)关闭设备
close(vd ->fd);
系统的整体图像信息采集流程如图5所示。
图5 图像信息采集流程图
2.2 网络编程
Linux中的网络编程通过Socket(套接字)接口实现,Socket是一种文件描述符。它有三种类型,本系统采用流式套接字(SOCK_STREAM)。流式套接字可以提供可靠的、面向连接的通讯流,使用TCP协议保证了数据传输的正确性和顺序性。基于TCP协议的服务器端实现步骤如下:
(1)创建一个socket
sockfd=socket(AF_INET,SOCK_STREAM,0);
(2)绑定IP 地址、端口等信息到socket上
bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr));
(3)设置允许的最大连接数n
listen(sockfd,n);
(4)接收客户端上来的连接
accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size);
(5)接收数据
recv(new_fd,buffer,strlen(buffer),0);
(6)关闭网络连接
close(sockfd);
基于TCP协议的客户端实现步骤如下:
(1)创建一个socket
sockfd=socket(AF_INET,SOCK_STREAM,0);
(2)设置要连接的服务器IP地址和端口等属性。
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);
(3)连接服务器
connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr));
(4)发送数据
send(sockfd,buffer,strlen(buffer),0);
(5)关闭网络连接
close(sockfd);
以上服务器端和客户端的实现没有固化单一功能,即客户端不必依赖于服务器的命令。本系统实现了只要服务器开启后,服务器与客户端之间就可以相互发送命令实现网络数据传输的功能。即数据的传输方向不是单向地由客户端发送给服务器。并且服务器与客户端的程序可以任意选择在PC机或者A8机上安装启动。
2.3 对等网络模型
对等网络又称工作组,即网络中各设备的功能相同,无主从之分,既可作为服务器端设定共享资源供网络中其他设备所使用,又可以作为客户端。对等网络是小型局域网常用的组网方式,在对等网络中没有专用的服务器,也没有专用的客户端[5]。本系统所采用的对等网络模型打破了传统的C/S网络模型中依赖中心服务器的模式,实现了发送命令的控制程序既可以是客户端,也可以是服务器端。因此,监控端既可以设定为客户端也可以设定为服务器端。
3 系统实现
本系统软件由摄像头驱动模块、图像采集模块、网络传输模块和网络服务器模块组成。本系统主要功能包括USB摄像头设备和FB设备的启用、视频图像信息采集形成图片文件、TCP/IP网络数据传输和监控端使用FB设备进行图像显示等。在网络信息接通后,图6所示为被监控端接入USB摄像头设备后进行视频图像信息采集显示。图7所示为主要源码文件及监控视频截图。
4 结 语
本文主要介绍了在Linux操作系统下使用Cortex-A8教学实验箱设计实现的远程视频监控系统。本系统实现了嵌入式设备驱动加载、视频图像信息采集、网络数据的存储和传输等功能,已经完成了远程监控的基本功能。本系统是基于对等网络模型进行设计与实现的,即客户端对服务器端没有绝对的依赖,端口的应用程序既可以看做是服务器端也可以看做是客户端。对于本系统后续的研究设计,仍有可以进一步扩展和改进的地方,例如可以在本系统上扩展V4L2接口和MJPG-Streamer的使用可以提高监控画面的清晰度和流畅度。
参考文献
[1]杨光. ARM嵌入式远程监控技术研究[J].数字技术与应用, 2013(3):7-9.
[2] 罗孝骞.计算机网络远程监控系统的应用[J].网络安全技术与应用,2013(11):5-6.
[3] 温淑鸿.嵌入式Linux系统原理-基于ARM Cortex-A8处理器[M].北京:北京航空航天大学出版社,2014.
[4]关丽敏, 李思慧, 李伟刚.STM32F107VC的嵌入式远程监控终端设计[J].单片机与嵌入式系统应用, 2014(6):72-75.
[5] 张启飞,张尉冬,李文娟,等.基于对等网络的面向小文件的云存储系统[J].浙江大学学报(工学版),2013,47(1):8-14.