移动物体监控系统(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)    收藏  举报

导航