一、BOA嵌入式服务器的移植

  step1:下载BOA服务器并解压,进入boa下面的src目录,执行./configure生成必须的配置文件以及Makefile

  step2:修改Makefile文件

      cc=arm-linux-gcc

      cpp=arm-linux-gcc -E

  step3:编译make

      编译时出错:util.c:100:1:error:posting "t" and "->" does not give a vaild preprocessing token

         将util.c文件中 time-offset=TIMEZONE_OFFSET(t) 注释掉,改为time_offset=0;

  step3:将编译生成的boa可执行文件拷贝到根文件系统的/sbin/目录中

  step4:配置BOA

      将boa.conf拷贝到根文件系统的/etc/boa目录下。改变的配置项:

        a.DocumentRoot  /web/指明开发板网页路径

        b.user  Group 注释掉  

        c.Mime Type 媒体文件 设置为 /dev/null

        d.Errorlog 错误日志文件 设置为 /dev/null(设置为/dev/consoce表示错误打印到终端)

        e.Access log 访问日志 设置为/dev/null

  step5:开发板运行"#boa",浏览器登录开发板IP-192.168.19.127,即可登录嵌入式web服务器的网页设计界面。

二、CGI快速入门-网页控制

移动物体监控系统-sprint4嵌入式web服务器开发-LMLPHP

控制流程:1、用户浏览器---(请求连接)--->web服务器 (web服务器包括a.供浏览器登录的网页界面程序,b.共服务器调用的CGI程序(扩展服务器功能));

     2、浏览器登录的微博服务器指定的网页界面,给予指令-->调用设定CGI程序进行控制;

     3、获取的返回结果->web服务器发送到网络中,用户即可通过浏览器远程获取数据信息。

三、CGIC库移植

  step1:解压CGIC库

    step2:修改Makefile      

       cc=arm-linux-gcc

          AR=arm-linux-ar

       RANLIB=arm-linux-ranlib

       arm-linux-gcc cgictest.o -o cgictest.cgi ${LIBS}

       arm-linux-gcc capture.o -o capture ${LIBS}

  step3:拷贝libcgic.a到根文件系统中

  step4:BOA配置文件修改(boa.conf)

      scriptAlias /cam/  /web/cam/  (指明CGI程序路径)

  step5:运行boa程序,在pc的浏览器上输入开发板IP地址  /cam/cgictest.cgi,网页正常打开则表明boa和cgic移植成功。

四、CGI程序设计

    其中,网页界面.html、获取监控图片和视频的cgi程序开发

    step1:网页界面在原有的indx.html中修改       

       <a class="menu" href="/cam/image.cgi">   //获取图片的程序,跳转运行/CGI程序

    step2:CGI程序:主程序cgiMain()下

        1、print_file(cgiOut,"../top.html");  //加头,将top.html内容打印到cgiOut

        2、total = list_pic("/mnt/sd","jpg");  //将图片加入显示列表

        3、if (cgiFormSubmitClicked("gopage") == cgiFormSuccess)    //处理用户的选择请求

        4、show_pic(start,end,total);  //显示图片

        5、print_file(cgiOut,"../bottom.html");  //加尾,将bottom.html内容打印到cgiOut

    step3:编译生成.cgi文件 arm-linux-gcc -L ./cgic205/ -lcgi -I ./cgic205/image.c -o image.cgi

    step4:获取视频的程序开发

        (1)<a class="menu" href="/cam/movie.cgi">        

        (2)fprintf(cgiOut, "<embed src = \" / sd / % s\" autostart = true loop = true width = \"640\" height =\"480\">< / embed>","01-19700101000405.avi");

        在index.html中添加语句(1)

        建立movie.c中添加语句(2),编译 arm-linux-gcc -L ./cgic205/ -lcgi -I ./cgic205/movie.c -o movie.cgi

 #include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <cgic.h>
#include <dirent.h>
#include <string.h> struct pic_list
{
char name[];
}g_img[]; //加头,将top.html内容打印到cgiOut
void print_file(FILE *dst_fp,const char *src)
{
FILE* src_fp;
char line[]; src_fp = fopen(src, "r");
while (NULL != fgets(line, , src_fp))
fputs(line, dst_fp);
fclose(src_fp);
} int cmp_sfc(const char* fn,const char *sf)
{
char* tfn = (char*)fn;
for (; *tfn != '.' && *tfn != ; tfn++)
if (*tfn == )
return -;
tfn++; return strcmp(tfn, sf);
} //
int list_pic(const char* path,const char *sfx)
{
//遍历/mnt/sd目录,将所有的图片文件的名字加入列表
DIR* dir;
struct dirent* ptr;
int i = ; //1、打开目录
dir = opendir(path); //2、读取目录中一个文件
while ((ptr = readdir(dir)) != NULL)
{ //3、判断该文件的后缀是否为jpg
if ( == cmp_sfc(ptr->d_name, sfx))
{
//4、如果是图片,将其文件名加入列表
strcpy(g_img[i].name, ptr->d_name);
i++;
}
} return i; } //显示图片
void show_pic(int start, int end, int total)
{
int i,j = ; fprintf(cgiOut, "<tr>");
fprintf(cgiOut, "<td align=center>");
fprintf(cgiOut, "<table border=\"1\">"); for (i = start; i < end + ; i++)
{
if ((j % ) == )
{
fprintf(cgiOut, "<tr>");
fprintf(cgiOut, "<td>");
}
j++; fprintf(cgiOut, "<img src = \"/sd/%s\" width =\"160\" height = \"120\" / >", g_img[i].name); if ((j % ) == )
{
fprintf(cgiOut, "<tr>");
fprintf(cgiOut, "<td>");
}
}
fprintf(cgiOut, "</table>");
fprintf(cgiOut, "<p class=\"little\">-- 第%d页 共%d页 --</p>", start / + , total % ? total / + : total / );
fprintf(cgiOut, "</td>");
fprintf(cgiOut, "</tr>");
} //界面选择
void show_select_form(int total)
{
int i, pgn; pgn = total / ; if (total % )
pgn++; fprintf(cgiOut, "<tr>");
fprintf(cgiOut, "<td align=center>"); fprintf(cgiOut, "<br><form>");
fprintf(cgiOut, "转到第");
fprintf(cgiOut, "<select name=\"selectpage\">");
for (i = ; i < pgn; i++)
fprintf(cgiOut, "<option value=\"opt%d\">%d</option>", i, i + ); fprintf(cgiOut, "</select>");
fprintf(cgiOut, "页&emsp;");
fprintf(cgiOut, "<input type=\"submit\" name=\"gopage\" value=\"go\"/>");
fprintf(cgiOut, "<form>"); fprintf(cgiOut, "</td>");
fprintf(cgiOut, "</tr>");
} int cgiMain()
{
int fd;
int led_control, led_state;
char *data;
int start, end, total;
start = ;
end = ; //3、结果显示信息 //加头
print_file(cgiOut, "../top.html"); //将图片加入显示列表
total=list_pic("/mnt/sd","jpg"); //处理用户的选择请求
if (cgiFormSubmitClicked("gopage") == cgiFormSuccess) { int i, sel;
char** optlist;
char tmp[]; optlist = (char**)malloc(sizeof(char*) * total); for (i = ; i < total; i++)
{
sprintf(tmp, "opt%d", i);
optlist[i] = strdup(tmp);
} cgiFormSelectSingle("selectpage", optlist, total, &sel, ); start = sel * ;
end = start + ;
end = total < end ? total : end;
//fprintf(cgiOut, "<p>s=%d, e=%d</p>", start, end); free(optlist);
} //显示图片
show_pic(start,end,total);
show_select_form(total); //加尾
print_file(cgiOut, "../bottom.html");
return ;
}
05-11 17:54