全部博文(187)
分类:
2009-07-02 14:03:17
摘 要
主要内容是在Linux中驱动摄像头(WebCam),用Spcaserv 服务器架设网络监
控系统,客户端通过浏览器进行时时监控。
一、 大作业任务要求
在linux2.6内核基础上搭建下面的环境
1)摄像头(中星微芯片)
2)搭建web服务器
3)编译一个摄像头采集程序和客户端服务程序(Servfox和Spcaview的使用.)
二、系统结构与功能
程序结构为B/S模式,其中运行在开发主机上的是浏览器,运行在嵌入式设备上的是服务器端。所以整个监控系统的重点在于服务器端的开发。
整个系统服务器端的设计分为两部分:
A)HttpServer部分
B)OS监控端部分
三、 实现方法
任务要求提到几点,下面祥细的介绍一下,boa嵌入式web用服务器\摄像头采集程序和客户端服务程序(Servfox和Spcaview的使用.)
首先讲一下boa的搭建
1、下载Boa源码
下载地址:
目前最新发行版本: 0.94.13 (几年没更新版本了)
下载 boa-0.94.13.tar.gz,
注意:若从boa上下载的是boa-0.94.13.tar.tar,解压方式一样
[root@jimmy]# tar xzf boa
-
0
.
94
.
13
.
tar
.
gz
2、生成Makefile文件
进入boa-0.94.13,直接运行src/configure文件
[
tekkamanninja@Tekkaman
-
Ninja src
]$.
/configure
3、修改Makefile文件
CC
=
/usr/local/arm/
gcc
CPP
=
/usr/local/arm/3.4.1/bin/arm-linux-
gcc
-
E
4、交叉编译
[tekkamanninja@Tekkaman-Ninja src]$ make |
5、去除调试信息,减小体积。(可选)
[tekkamanninja@Tekkaman-Ninja src]$ /usr/local/arm/ |
6.我在上面的进过中,编译时有提示错误。然后修改如下
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token
make: *** [util.o] Error 1
解决方法:
修改 src/compat.h
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
7.修改boa.conf 和目标板的一样,以下是boa.conf修改后的,注意是修改了所建立目录的路径。
# Boa v0.94 configuration file
# File format has not changed from 0.93
# File format has changed little from 0.92
# version changes are noted in the comments
#
# The Boa configuration file is parsed with a lex/yacc or flex/bison
# generated parser. If it reports an error, the line number will be
# provided; it should be easy to spot. The syntax of each of these
# rules is very simple, and they can occur in any order. Where possible
# these directives mimic those of NCSA httpd 1.3; I saw no reason to
# introduce gratuitous differences.
# $Id: boa.conf,v 1.25 2002/03/22 04:33:09 jnelson Exp $
# The "ServerRoot" is not in this configuration file. It can be compiled
# into the server (see defines.h) or specified on the command line with
# the -c option, for example:
#
# boa -c /usr/local/boa
# Port: The port Boa runs on. The default port for http servers is 80.
# If it is less than 1024, the server must be started as root.
Port 80
# Listen: the Internet address to bind(2) to. If you leave it out,
# it takes the behavior before 0.93.17.2, which is to bind to all
# addresses (INADDR_ANY). You only get one "Listen" directive,
# if you want service on multiple IP addresses, you have three choices:
# 1. Run boa without a "Listen" directive
# a. All addresses are treated the same; makes sense if the addresses
# are localhost, ppp, and eth0.
# b. Use the VirtualHost directive below to point requests to different
# files. Should be good for a very large number of addresses (web
# hosting clients).
# 2. Run one copy of boa per IP address, each has its own configuration
# with a "Listen" directive. No big deal up to a few tens of addresses.
# Nice separation between clients.
# The name you provide gets run through inet_aton(3), so you have to use dotted
# quad notation. This configuration is too important to trust some DNS.
#Listen 192.68.0.5
# User: The name or UID the server should run as.
# Group: The group name or GID the server should run as.
User root
Group 0
# ServerAdmin: The email address where server problems should be sent.
# Note: this is not currently used, except as an environment variable
# for CGIs.
#ServerAdmin root@localhost
# ErrorLog: The location of the error log file. If this does not start
# with /, it is considered relative to the server root.
# Set to /dev/null if you don't want errors logged.
# If unset, defaults to /dev/stderr
ErrorLog /mnt/yaffs/var/log/boa/error_log
# Please NOTE: Sending the logs to a pipe ('|'), as shown below,
# is somewhat experimental and might fail under heavy load.
# "Usual libc implementations of printf will stall the whole
# process if the receiving end of a pipe stops reading."
#ErrorLog "|/usr/sbin/cronolog --symlink=/var/log/boa/error_log /var/log/boa/error-%Y%m%d.log"
# AccessLog: The location of the access log file. If this does not
# start with /, it is considered relative to the server root.
# Comment out or set to /dev/null (less effective) to disable
# Access logging.
AccessLog /mnt/yaffs/var/log/boa/access_log
# Please NOTE: Sending the logs to a pipe ('|'), as shown below,
# is somewhat experimental and might fail under heavy load.
# "Usual libc implementations of printf will stall the whole
# process if the receiving end of a pipe stops reading."
#AccessLog "|/usr/sbin/cronolog --symlink=/var/log/boa/access_log /var/log/boa/access-%Y%m%d.log"
# UseLocaltime: Logical switch. Uncomment to use localtime
# instead of UTC time
#UseLocaltime
# VerboseCGILogs: this is just a logical switch.
# It simply notes the start and stop times of cgis in the error log
# Comment out to disable.
#VerboseCGILogs
# ServerName: the name of this server that should be sent back to
# clients if different than that returned by gethostname + gethostbyname
ServerName
# VirtualHost: a logical switch.
# Comment out to disable.
# Given DocumentRoot /var/www, requests on interface 'A' or IP 'IP-A'
# become /var/www/IP-A.
# Example: becomes /var/www/127.0.0.1
#
# Not used until version 0.93.17.2. This "feature" also breaks commonlog
# output rules, it prepends the interface number to each access_log line.
# You are expected to fix that problem with a postprocessing script.
#VirtualHost
# DocumentRoot: The root directory of the HTML documents.
# Comment out to disable server non user files.
DocumentRoot /mnt/yaffs/var/www
# UserDir: The name of the directory which is appended onto a user's home
# directory if a ~user request is recieved.
UserDir public_html
# DirectoryIndex: Name of the file to use as a pre-written HTML
# directory index. Please MAKE AND USE THESE FILES. On the
# fly creation of directory indexes can be _slow_.
# Comment out to always use DirectoryMaker
DirectoryIndex index.html
# DirectoryMaker: Name of program used to create a directory listing.
# Comment out to disable directory listings. If both this and
# DirectoryIndex are commented out, accessing a directory will give
# an error (though accessing files in the directory are still ok).
DirectoryMaker /usr/lib/boa/boa_indexer
# DirectoryCache: If DirectoryIndex doesn't exist, and DirectoryMaker
# has been commented out, the the on-the-fly indexing of Boa can be used
# to generate indexes of directories. Be warned that the output is
# extremely minimal and can cause delays when slow disks are used.
# Note: The DirectoryCache must be writable by the same user/group that
# Boa runs as.
# DirectoryCache /var/spool/boa/dircache
# KeepAliveMax: Number of KeepAlive requests to allow per connection
# Comment out, or set to 0 to disable keepalive processing
KeepAliveMax 1000
# KeepAliveTimeout: seconds to wait before keepalive connection times out
KeepAliveTimeout 10
# MimeTypes: This is the file that is used to generate mime type pairs
# and Content-Type fields for boa.
# Set to /dev/null if you do not want to load a mime types file.
# Do *not* comment out (better use AddType!)
MimeTypes /mnt/yaffs/temp/mime.types
# DefaultType: MIME type used if the file extension is unknown, or there
# is no file extension.
DefaultType text/plain
# CGIPath: The value of the $PATH environment variable given to CGI progs.
CGIPath /bin:/usr/bin:/usr/local/bin
# SinglePostLimit: The maximum allowable number of bytes in
# a single POST. Default is normally 1MB.
# AddType: adds types without editing mime.types
# Example: AddType type extension [extension ...]
# Uncomment the next line if you want .cgi files to execute from anywhere
#AddType application/x-httpd-cgi cgi
# Redirect, Alias, and ScriptAlias all have the same semantics -- they
# match the beginning of a request and take appropriate action. Use
# Redirect for other servers, Alias for the same server, and ScriptAlias
# to enable directories for script execution.
# Redirect allows you to tell clients about documents which used to exist in
# your server's namespace, but do not anymore. This allows you to tell the
# clients where to look for the relocated document.
# Example: Redirect /bar
# Aliases: Aliases one path to another.
# Example: Alias /path1/bar /path2/foo
Alias /doc /usr/doc
# ScriptAlias: Maps a virtual path to a directory for serving scripts
# Example: ScriptAlias /htbin/ /www/htbin/
ScriptAlias /cgi-bin/ /mnt/yafss/var/www/cgi-bin/
8.Group的修改
修改 Group nogroup
为 Group 0开发板上有的组)
修改 User nobody
为 User root组中的一个成员)
根据你的开发板的情况设定。一定要存在的组和用户。
9ScriptAlias的修改
修改 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
为 ScriptAlias /cgi-bin/ /mnt/var/www/cgi-bin (这里也是根据自己的开发板来建立吧)
这是在设置CGI的目录,你也可以设置成别的目录。比如用户文件夹下的某个目录
10.ServerName的设置
修改 #ServerName
为 ServerName
注意:该项默认为未打开,执行Boa会异常退出,提示“gethostbyname::No such file or directory”,所以必须打开。其它默认设置即可。你也可以设置为你自己想要的名字。比如我设置为:ServerName tekkaman2440
此外,还需要:
11.(以下配置和boa.conf的配置有关)
创建日志文件所在目录/var/log/boa
创建HTML文档的主目录/var/www
创建CGI脚本所在录 /var/www/cgi-bin
注(上面的目录看你喜欢建立在有权限建立目录的地方下)
[
tekkamanninja@Tekkaman
-
Ninja
log
]$
mkdir
-
m 777 boa
[
tekkamanninja@Tekkaman
-
Ninja
log
]$
cd
..
[
tekkamanninja@Tekkaman
-
Ninja var
]$
mkdir
-
m 777 www
[
tekkamanninja@Tekkaman
-
Ninja var
]$
mkdir
-
m 777 www
/
cgi
-
bin
[
tekkamanninja@Tekkaman
-
Ninja var
]$
cd
..
然后把boa boa.conf mime.types 移到到目标机的一个目录下。Mime.types 的位置要和boa.conf相对应.
12.运行Boa
开发板操作:
[root@~]#boa
如果发现boa没有运行,则可以在开发板的/var/log/boa/error_log文件中找原因。
比如端口已被其他程序占用:
或是用户设置错误等等,都可以查到。 |
13.功能测试
静态网页测试
将静态网页存入根文件系统的/var/www目录下(可以将主机 /usr/share/doc/HTML/目录下的index.html、homepage.css和img、stylesheet-images目录复制到/var/www目录下
运行boa的命令:
#。/boa –c 。 最后的点是当前目录,它要指定boa.conf所在.
Servfox和Spcaview的使用
下载的原码包:servfox-R1_1_3.tar.gz spcaview-20061208.tar.gz
客户端浏览服务器采集的视频可以有两种形式。
一种是通过在pc机(linux 下)浏览,要编译 spcaview-20061208.tar.gz 产生一个spcaview来浏览。另一种是通过在xp下浏览器来访问,要安装一个jre-6u7-windows-i586-p-s.exe的插件。
现在讲第一种先。
2.移植服务器端程序
服务器端程序我用的是servfox ,下载,解压,进入其目录,观察之,发现没有makefile,但有一个makefile.arm,还有一个makefile.386,于是将makefile.arm改名为makefile,然后输入命令
make 编译正常,没有出错
运行servfox,出错,提示为找到到该命令,老问题,以前遇到过类似问题,原因是该命令为动态链接,而开发板上没有相关的库文件,所以无法运行,需要静态链接。
回到PC,打开makefile,将所有用到arm-linux-gcc的地方,都加上一个参数-static,其实就三个地方。
然后重新编译,在开发板上运行,输入命令:
./servfox –g -d /dev/video0 -s 320x240 -w 7070
程序运行了,提示为
servfox version:
[email=mxhaard@magic.fr]mxhaard@magic.fr[/email]
wrong spca5xx device
Waiting .... for connection. CTrl_c to stop !!!!
Got connection from 192.168.141.234
3.编译客户端程序
客户端程序使用的是spcaview
这个程序是在PC上运行的,解压后,直接编译就行,
make
生成可执行文件spcaview,运行之
注(一开始我在ubuntu里make 这个程序,提示很多错误。好像缺少很多变量。最后我在redhat 9里编译,就没有错误的提示。对比了一下,两边环境的gcc版本不同redhat9 比ubuntu 低。可能是用低版本的编译器才支持。)
./spcaview -g -s 320x240 -w 192.168.141.236:7070
上面成功运行后,就产一个小界面,看得到摄像头所照的东西。
4.通过浏览器
在XP下安装jre-6u7-windows-i586-p-s.exe这个小插件就OK了。
5.付上无线网卡的设置过程
# insmod rt73.ko
# ifconfig rausb0 inet 192.168.0.3 up
# route add default gw 192.168.0.1
# iwconfig rausb0 essid "dansen"
# iwconfig rausb0 mode Ad-hoc
# iwconfig rausb0 channel 1
四、 运行状况
视频彩集比较流畅,画面算清晰。
五、结论
这个课程设计是在之前移植linux2.6内核的基础上慢慢扩展开来的。移植好内核后,想在上面搭建一个web、后面想移植usb摄像头驱动,通过web来监控周围的环境。现在也调试成功,通过无线网卡来访问实验箱里的web服务器.
通过前面的工作,感觉自己这次课程设计像在做监控系统。如果做成监控系统,现在的系统的功能还不够强大。现在想到的就是想扩展以下几项工能:
1. 增加一个gprs发送功能
2. 增加一个红外感应