当前位置: 首页 > 工具软件 > Boa > 使用案例 >

Boa移植及应用

唐弘厚
2023-12-01
  1. 移植:(boa-0.94.14rc21.tar)
    ./configure –host=arm-linux-gnueabihf-
    Make

  2. 配置文件:
    Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。
    Boa.conf: 内容如下

端口
– Port 80,是缺省的HTTP端口,如果有程序占用,则要换一个

-ErrorLog 的修改
原始值发布一个自建的日志文件 ErrorLog /var/log/boa/error_log
在嵌入式设备,在调试可将其直接注释掉,这样会重定向的缺省错误输出,即串口上
正式发布,可直接 设为 ErrorLog /dev/null 即不输出.

-AccessLog的修改
注释时 AccessLog的值 dev/null,调试时,可以将其改为 AccessLog /dev/console 输出到串口

-ServerName的设置
修改 ServerName www.your.org.here为 ServerName <自己的主机名>
注意:该项默认为未打开,执行Boa会异常退出,提示“gethostbyname::No such file or directory”,所以必须打开。其它默认设置即可。
-DocumentRoot修改
DocumentRoot /var/www表示静态网页存放目录,用户访问都以为此为根目录
修改成你自己的静态网页目录 DocumentRoot /html

-User root
Group root : 因开发板没有Group 将Group root 注释掉

-DirectoryIndex的修改
缺省网页名字.即用户只输出路径,不带网页名字,BOA自动调用这个网页,缺省是调用index.html,前提DocumnetRoot必须有这个文件存在.
缺省值 DirectoryIndex index.html

  • CGIPath的修改
    表示CGI程序在调用时,BOA查找CGI的路径顺序.为了保险,可以把ScriptAlias 所指向路径加到这里来
    CGIPath /bin:/usr/bin:/usr/local/bin

    scriptAlias的修改 (cgi的c文件存放目录)
    修改 scrīptAlias /cgi-bin/ /usr/lib/cgi-bin/ 为 scrīptAlias /cgi-bin/ /cgi-html/

Boa所有的CGI程序应该放在这个目录下,注意最后的一个/,必须要有

BOA 运行前准备
如果采用缺省日志(即配置文件ErrorLog 所指向的)还需要创建日志文件所在目录/var/log/boa,
创建静态网页HTML文档的主目录,将静态网页存入该目录下,(即DocumentRoot指向的目录)
创建CGI脚本所在目录,将cgi的脚本和程序存放在该目录下.(即ScriptAlias 所指向的目录)
另外还要将mime.types文件复制/etc目录下,通常可以从linux主机的 /etc目录下直接复制即可。
执行时,如果boa.conf 在/etc/boa下,直接运行boa即可. 但boa.conf 在其它目录,需要-c 指示boa.conf所在目录
– 如果boa和boa.conf 在同一目录下,运行 ./boa –c .即可

BOA判断CGI程序原理
l BOA是通过用户发来URL(即浏览器里输入的网址)来判断是静态网页还是需要用CGI来处理
– 如果url的路径包括cgi-bin 这们路径(即scriptAlias前半部分),那么BOA认为这是是需要cgi程序处理.并把它后面的参数变成cgi程度的命令行参数去执行.否则是静态网页
– 如 http://192.168.0.146:8081/cgi-bin/hello.cgi
l 出现了cgi-bin,BOA把hello.cgi执行起来,如果hello.cgi正好是一个CGI程序,则进入CGI处理流程

Post get 方法:

Html:(静态网页目录: /html  ; cgi c的目录 为 /cgi-html/cgi-bin/  )
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
        "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="js/jquery-1.8.3.min.js"></script>
    <script>
        function test()  // jquery 通过后台获取数据
         {
             alert("enter fx");
             $.ajax({
                 "type": "POST",
                 "url": "cgi-bin/test.cgi", // 注意是cgi-bin/test.cgi 
                 "cache": false, //cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓//存里面读取而不是再到服务器端读取

                 "data": "name=John",
                 "dataType": "html"
             }).done(function(data, status, xhr) {

                 if (status != 'success')
                 {
                    alert("fail");
                 } else {

                     alert(data);
                 }
                 })
         }
    </script>

    <title>test.html</title>
</head>

<body  >
    <form   action="cgi-bin/test.cgi" method="post"  name="form1">
        <input type="text"   val =100 name="input_1">
        <input type="text"   val =200 name="input_2">
        <input type="submit" val="submit">
    </form>

     <table>
         <input type="button" id="00"  val="key press "  onclick="test()"/>
     </table>

</body>

</html>

test.c (编译通过后将test.c 更名为test.cgi,然后放在cgi-html/cgi-bin/目录中)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>  

char * method;
char * p ;
int len;
char *post_buff;
int main(void)
{  
   method = getenv("REQUEST_METHOD"); // val 是 POST  或者GET
   if(method==0)
   {
     printf("can't receive data from net ");
   }
   else if( strcmp(method,"POST")==0 )  //post 方法
           {
             printf("Content-type:text/html\n\n"); 
             printf("<p>post method</p>");
             p = getenv("CONTENT_LENGTH");  //获取POST的环境变量 
             if(p)
             {
               len =atoi(p);
               printf("<p>len is %d</p>",len);
               post_buff  = malloc(sizeof(char)*len + 1); //必须申请缓存,因为stdin是不带缓存的
               fread(post_buff,sizeof(char),len,stdin);//将POST的值读到post_buff
               printf("%s",post_buff);
             }
             else
             {
                len =0;
                printf("len is null");
             }

           }
   else if ( strcasecmp(method,"get")==0) // GET 方法
           {
             printf("get method");
             p = getenv("QUERY_STRING");     //从环境变量
           }
}

应用框架:C:\Users\Administrator\Desktop\learning_linux\cgi-boa\cgi3
收到POST数据后,将数据写入到消息队列中,应用程序不停的get消息,如果有消息进入消息解析函数。
CGIC的编译:
1.从CGIC 的主站点http://www.boutell.com/cgic/ 下载源码,将其解压并进入源码目录
    # tar -zxvf cgic205.tar.gz
    # cd cgic205
 2.修改Makefile 文件
找到CC=gcc ,将其改成CC=arm-linux-gcc ,
找到AR=ar ,将其改成AR=arm-linux-ar ,
到RANLIB=ranlib ,将其改成RANLIB=arm-linux-ranlib 。
找到gcc cgictest.o -o cgictest.cgi LIBS L I B S , 将 其 改 成 (CC) (CFLAGS)cgictest.oocgictest.cgi ( C F L A G S ) c g i c t e s t . o − o c g i c t e s t . c g i {LIBS} ,
 找到gcc capture.o -o capture LIBS L I B S , 将 其 改 成 (CC) (CFLAGS)capture.oocapture ( C F L A G S ) c a p t u r e . o − o c a p t u r e {LIBS} ,

然后运行make 进行编译,得到的CGIC 库libcgic.a 。
将生成的libcgic.a 复制到工具链所在的路径中sudo cp libcgic.a /usr/arm-linux-gnueabihf/lib/
编译catture.c arm-linux-gnueabihf-gcc -o test capture.c cgic.h -L. -lcgic (不难看出静态库和动态库的使用方法是一致的)

 类似资料: