移动物体监控系统(Part4)——嵌入式web服务器开发
接上一篇《移动物体监控系统(Part3)——监控主系统设计与开发》的项目总结,本文接着讲解:嵌入式web服务器开发。
一、BOA嵌入式服务器移植
1、BOA简介
Boa是一种非常小巧的Web服务器,也是目前嵌入式领域比较流行的web服务器;其可执行代码只有大约60KB左右。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行,Boa的设计目标是速度和安全。(摘自百度文库https://zhidao.baidu.com/question/176630833490048884.html)
Boa源码下载地址: http://www.boa.org/
2、编译BOA
一般常用的web服务器有三种:Boa、lighttpd、shttpd;本项目选用BOA服务器。接下来进行配置与编译。
(1)在Linux终端下,将boa-0.94.13.tar.gz源码包放到project1/ Sprint4文件(自己建立的项目文件)下,并解压;
(2)进入boa-0.94.13/src文件下,执行./configure命令即可生成编译boa所必须的配置文件以及一些源代码和Makefile文件;
(3)修改Makefile,找到CC=gcc,将其改成CC = arm-linux-gcc(交叉编译链);
(4)由于BOA代码本身存在一些问题,需要对配置文件修改,打开配置文件下的util.c文件;
将util.c的第100行注释掉,改为
//time_offset = TIMEZONE_OFFSET(t);(注释掉)
time_offset = 0;(改正后)
(5)执行“make“后,将生成的boa文件拷贝到开发板根文件系统/home/rootfs/sbin/中;在SecureCRT下,键入“reboot”重启开发板,
3、BOA的配置
将配置文件Liinux终端上的boa.conf 移动到Tiny6410开发板根目录的 /etc/boa/ (自己建立这个文件)目录下;
在SecureCRT下运行“boa”时提示出现错误,需配置修改该文件,配置如下表所示:
|
选项名 |
说明 |
|
Port |
监听的端口号,缺省都是80,一般无需修改。 |
|
User |
作为哪个用户组运行,即它拥有该用户组的权限,一般都是nobody,需要/etc/passwd中有nobody用户。所以这里我们将其注释掉。 |
|
Group |
作为哪个用户组运行,即它拥有该用户组的权限,一般都是nogroup,需要在/etc/group文件中有nogroup组。也注释掉。 |
|
ErrorLog |
错误日志文件。如果没有以/开始,则表示从服务器的根路径开始。如果不需要错误日志,则用/dev/null。设置为/dev/console表示错误信息打印到终端。在调试阶段建议改成/dev/console,调试稳定以后改成null或者具体的文件。 |
|
AccessLog |
访问日志文件。如果没有以/开始,则表示从服务器的根路径开始。如果不需要错误日志,则用/dev/null或直接注释掉。 |
|
DocumentRoot |
HTML文档的主目录,非常重要,boa毕竟是为网页服务的,所以这个参数指明了开发板上什么地方有网页文件,如果不指定正确的html文件的存放路径,访问会出错。如果没有以/开始,则表示从服务器的根路径开始。这里拷贝我们提供的web目录到开发板的文件系统根目录即可,因此这里设置为/web/。 |
|
MimeTypes |
指明mime.types文件位置。如果没有以/开始,则表示从服务器的根路径开始。可以注释掉避免使用mime.types文件,此时需要用AddType在本文件里指明。实际上就是一个媒体文件,我们设置为/dev/null。 |
|
DefaultType |
文件扩展名没有或未知的话,使用的缺省MIME类型。 |
|
ScriptAlias |
指明CGI脚本的虚拟路径对应的实际路径。一般所有CGI脚本都要放在实际路径里,用户访问执行时输入站点+虚拟路径+CGI脚本名。 |
一、 CGI快速入门-网页控制LED
1、CGI简介
CGI(Common Gateway Interface: 公用网关接口)规定了Web服务器调用其他可执行程序(CGI 程序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的交互,也就是CGI程序接受Web浏览器发送给Web服务器的信息,进行处理, 将响应结果再回送给Web服务器及Web浏览器。CGI程序一般完成Web网页中表单(Form)数据的处理、数据库查询和实现与传统应用系统的集成等工作。(摘自https://blog.csdn.net/xiaominthere/article/details/32328589)
在嵌入式领域,要想实现远程控制某个嵌入式设备,首选CGI的方式进行网页的动态交互。

2、CGI移植
(1)在Linux终端下,将cgic205.tar.gz源码包放到project1/ Sprint4文件下,并解压;
(2)进入cgic205源码目录,修改Makefile,将其中的编译器改为arm-Linux- ;
(3)执行“make”,生成了libcgic.a库,并将其拷贝开发板根目录/home/rootfs/lib/下;
(4)BOA配置文件修改(boa.conf) ---->>>> scriptAlias /cam/ /web/cam/ (指明CGI程序路径)
(5)运行boa程序,在pc的浏览器上输入开发板IP地址 /cam/cgictest.cgi,网页正常打开则表明boa和cgic移植成功。
3、使用CGI通过网页对开发板点灯
点灯程序(Led.c)如下所示:
int cgiMain()
{
int fd,led_control,led_state;
char *data;
/*输出HTML格式的内容以便反馈给浏览器*/
cgiHeaderContentType("text/html");
fprintf(cgiOut, "<HTML><HEAD>\n");
fprintf(cgiOut, "<TITLE>LED CGI</TITLE></HEAD>\n");
fprintf(cgiOut, "<BODY>");
fprintf(cgiOut, "<H1>Control Led Ok!</H1>");
fprintf(cgiOut, "</BODY>\n");
fprintf(cgiOut, "</HTML>\n");
/*获取环境变量*/
data = getenv("QUERY_STRING");
/*从获取到的环境变量里面按格式提取所需变量的值*/
sscanf(data,"led_control=%d&led_state=%d",&led_control,&led_state);
printf("led_control=%d\n",led_control);
printf("led_control=%d\n",led_state);
/*打开开发板的LED*/
fd = open("/dev/leds",0);
/*根据浏览器的输入控制相应的eLED*/
ioctl(fd,led_state,led_control);
/*关闭LED*/
close(fd);
点灯的可视网页界面为HTML界面,部分程序如下(可供参考):
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<head>
<title>web控制开发板LED</title>
</head>
<body>
<h1 align="center">WEB控制LED</h1>
<form action="/cam/led.cgi" method="get">
<p align="center">
请输入需要控制的LED灯 <input type="text" name="led_control"/>
</p>
<p align="center">
请输入控制LED的动作 <input type="text" name="led_state"/>
</p>
<p align="center"><input type="submit" value="sure"/>
<input type="reset" value="back"/>
</p>
</form>
</body>
将编写好的Led.c控制程序进行编译,在linux终端下键入“arm-linux-gcc –L ./cgic205/ -lcgic –I ./cgic205/(使用的库) led.c –o led.cgi”编译程序;编程无误后,将led.cgi拷贝到根文件系统/web/cam/中去,进行测试;
4、CGI程序设计
接下来,主要针对CGI程序设计框架进行讲解:
4.1、在网页界面上输出一帧监控图片
在cgiMain()主函数中,设计思路如下:
(1) printf_file(cgiOut,"../top.html"); // 给监控界面加头top.html,比如监控界面的名字(Mr_Zhang的监控界面),控制功能等等;
(2)遍历/mnt/sd(采集图片存放文件)目录图片,将文件名加入待显示列表g_img[n]
打开图片存储目录
读取目录中的一个文件
判断文件名的后缀是不是“jpg”
如果是jpg文件就将文件名加入g_img列表
重复步骤2直到读取完存储目录下的所有文件
返回所有jpg文件的数量
(3)处理用户的选择请求
(4)显示采集图片
void show_pic(int start,int end,int total)
{
int i;
int j=0;
fprintf(cgiOut,"<tr>");
fprintf(cgiOut,"<td align=center>");
fprintf(cgiOut,"<table border=\"1\">");
for(i=start;i<end+1;i++) //四个图片一行
{
if ((j%4)==0)
{
fprintf(cgiOut,"<tr>");
fprintf(cgiOut,"<td>");
}
j++;
fprintf(cgiOut, "<img src=\"/sd/%s\" width=\"160\" height=\"120\" />",g_img[i].name);
} //显示图像
fprintf(cgiOut,"</table>");
fprintf(cgiOut,"</td>");
fprintf(cgiOut,"</tr>");
}
(5) printf_file(cgiOut,"../bottom.html"); //给监控界面加头bottom.html,比如设计人之类的信息(Mr_Zhang),图片翻页功能等等;
程序编译完成后,在linux终端下键入“arm-linux-gcc –L ./cgic205/ -lcgic –I ./cgic205/(使用的库) image.c –o image.cgi”编译程序;编程无误后,将image.cgi拷贝到根文件系统/web/cam/(第1项所配置)中去。 运行后,在网页中可以成功读取一帧图片。
整体设计框架如下:

4.2、在网页界面上嵌入视频
(1)在cgiMain()中调用show_mymovie( ) 函数;
show_mymovie( ) 参数为total // total为 “ .avi ” 格式视频存放文件;
total = list_avi("/mnt/sd", "avi"); // 存放在/mnt/sd中;
(2)show_mymovie( ) 函数:
void show_movie(int nr, int total) //将监控视频放置在网页界面上
{
int i, j = 0;
if (nr > total - 1)
return;
fprintf(cgiOut, "<tr>");
fprintf(cgiOut, "<td align=center>");
fprintf(cgiOut, "<embed src=\"/sd/%s\" autostart=true loop=true width=\"640\" height=\"480\">", g_avi[nr].name);
fprintf(cgiOut, "</td>");
fprintf(cgiOut, "</tr>");
}
最后,将编写好的显示视频的movie.c文件编译成cgi文件以后,将movie.cgi拷贝到根文件系统/web/cam中去。 运行后,在网页中可以成功读取监控视频。
到此,《移动物体监控系统》的整个项目就结束了。
接下来,进行《网络安全传输系统》项目的经验分享!!! 具体内容,详见我的下篇文章。
文章内容如有雷同,纯属巧合;涉及雷同的内容,作者可私聊我,我自会添上“引用”声明,感谢大家关注!
———————————————————————————————————————狂撕代码者9527
posted on 2020-08-24 10:11 Mr_Zhang2426 阅读(310) 评论(0) 收藏 举报
浙公网安备 33010602011771号