2.2 基于TCP/IP协议的视频传输 TCP/IP协议指的是Internet上使用的两种网络协议,即传输控制协议和网际协议。TCP协议是一个可靠的点到点之间的协议,IP协议是一个传输层的协议。TCP/IP协议族可以将各种操作系统和网络部件连接起来,它提供了一种在各种系统间移动数据的标准方法[5]。
本系统中,首先服务器通过socket函数创建套接字,并使用bind函数将套接字与某端口进行绑定;然后调用listen函数,服务器将处于监听状态,等待用户监控端请求连接指定端口;当接收到用户监控端的连接请求后,服务器调用accept函数来建立与用户监控端间的通信;在成功建立通信后,就可以通过read函数或write函数进行通信。
本系统可以人机交互,用户通过网页可以向视频服务器传递控制信息,比如调节帧速、亮度等。当建立连接后,首先用户监控端发送一个包含控制信息的client_t结构体数据给视频服务器;然后视频服务器根据控制信息采集一帧视频数据,并生成一个包含这一帧视频信息的frame_t结构体数据,把它们发送给用户监控端。这就完成了一次人机交互,这样不断地循环,就实现了数据传输。
3 嵌入式Web服务器的实现
3.1 嵌入式Web服务器的选择 Linux下嵌入式Web服务器主要有3个,分别是httpd、thttpd和Boa。httpd是最简单的一个Web服务器,它的功能最弱,不支持认证,不支持CGI。thttpd和Boa都支持认证和CGI等,功能都比较全。本系统采用Boa Web服务器,它通过建立HTTP请求列表来处理多路HTTP连接请求,节省了系统资源,这对嵌入式系统来说至关重要。同时它还具有自动生成目录、自动解压文件等功能。Boa具有很高的HTTP请求处理速度和效率,在嵌入式系统中具有很高的应用价值。
3.2 Boa在ARM上的移植与配置 (1)移植过程
从http://www.boa.org/下载Boa源码,选择boa-0.94.13.tar.gz,输入解压命令“tar xzvf boa-0.94.13.tar.gz”;进入解压生成的源码目录下的src子目录,输入命令“./configure”,生成Makefile文件;修改Makefile文件,将CC和CPP的值改成交叉编译器安装的路径;输入命令“make”即可交叉编译生成可执行文件Boa,通过串口下载到根文件系统下的/ bin下就实现了移植。
(2)配置
在/etc目录下新建一个Boa目录,里面存放Boa的主要配置文件boa.conf,在Boa源码目录下已有一个示例boa.conf,可以在其基础上进行修改;修改Group nogroup为Group root,修改User nobody为User root,这里的root是开发板存在的组和用户;修改#ServerName www.your.org.here为ServerName cs2440;修改DocumentRoot /var/www为DocumentRoot /www,设置HTML文档的主目录/www,其他采用默认设置即可。此外,还需要将mime.types文件复制到/etc目录下,通常可以从Linux主机的/etc目录下直接复制即可。
4 基于B/S模式的用户视频监控端实现 系统采用B/S模式,相比C/S模式,用户不需要做任何维护,这对用户人力、物力、时间、费用的节省是显而易见的,并且可以跨平台操作,真正方便了用户。
系统通过开发Java Applet应用程序,并嵌入网页中,网页名称设为Boa Web服务器默认主页名,把它们保存在/www中,用户在浏览器地址栏中输入视频服务器的IP地址,就能在网页里显示摄像头的监控图像。通过Java Applet与视频服务器进行交互,实现对视频数据的控制、传输和播放。Java Applet程序中主要功能步骤和主要函数可描述为:
(1)创建套接字、输入流和输出流。
connection=new Socket(m_strServer,port);
in=connection.getInputStream();
out=connection.getOutputStream();
IP地址及端口都是由嵌入在HTML中<applet>…</applet>部分的参数传入的,并创建此Socket对象的输入流和输出流。
(2)分配接收缓冲区:byte[]buffer=new byte[512*1024];
(3)发送一个用户控制信息。它由用户用鼠标点击图标而生成。当用户点击浏览器中的视频窗口时,在上方会显示亮度等图标,通过点击图标两侧的“+”和“-”而写入控制信息;当点击图标以外的地方,图标就会消失,实现全窗口的视频,便于监控,操作简单。
Public void mouse(MouseEvent evt) {…};
out.write(b);//b是包含控制信息的字符数组名
(4)读取一帧图像头信息,确认图像数据的正确性和获取图像数据的大小。
n=in.read(buffer,0,HDRLEN);//HDRLEN为图像信息头长度,设置为50 B
对头信息中包含的约定字符进行判断,若正确就可以继续接收图像数据,不正确则返回(3)。
(5)读取图像数据,把头信息后的图像数据写入缓冲区,以供播放显示。
r=in.read(buffer,HDRLEN,buffer.length-HDRLEN);
(6)实现图像显示。由于缓冲区中包含图像头信息,为单独使用图像数据,需把图像数据拷贝到另一缓冲区buffer2中。
BufferedImage image= ImageIO.read(new ByteArrayInputStream(buffer2));
ImageIcon ii=new ImageIcon(image);
m_label.setIcon(ii);//显示图像
通过以上(3)到(6)的不断循环运行,用户从监控网页上可以看到连续动态的图像,效果很好,画面流畅,不存在明显的延时,实现了视频监控。
本文提出的这种基于B/S的嵌入式
视频监控系统相比传统C/S模式,真正实现了用户零维护,可以跨平台监控,方便用户。采用嵌入式处理器和Linux操作系统相结合,很好地体现了本监控系统具有集成化、网络化、功耗低等优点,可广泛扩展应用在工业控制、可视电话、交通管理等诸多领域。
上一页 [1] [2]