嵌入式安防监控项目——CGIC

目录

一、概述

二、下载源码:

三、搭建交叉编译环境(默认x86平台)

四、cgi文件分析:

五、make编译cgi源码:

六、测试安装

七、问题与解决思路:

八、理论准备:

九、HTML模板的制作--CGIC的基本思路

九、其他问题汇总:

十、测试实验


一、概述

CGIC移植部分笔记: ====cgi是一个接口

CGIC是一个支持CGI开发的开放源码的标准C库,可以免费使用,只需要在开发的站点和程序文档中有个公开声明即可,表明程序使用了CGIC库,用户也可以购买商业授权而无需公开声明。

     CGIC能够提供以下功能:

   1   分析数据,并自动校正一些有缺陷的浏览器发来的数据;

   2   透明接收用GET POST方法发来的Form数据;

   3   能接受上传文件;

   4   能够设置和接收cookies

   5   用一致的方式处理From元素里的回车;

   6   提供字符串,整数,浮点数,单选或多选功能来接收数据;

   7   提供数字字段的边界检查;

   8   能够将CGI环境变量转化成C中的非空字符串;

   9   提供CGI程序的调试手段,能够回放CGI程序执行时的CGI状态;

总之,CGIC是一个功能比较强大的支持CGI开发的标准C库,并支持Linux, Unix 和Windows等多操作系统。

以下描述CGIC的移植过程。

二、下载源码:

   从CGIC的主站点http://www.boutell.com/cgic/下载源码,当前最新版本是2.05版。将其解压并进入源码目录

  

   cgic is available via the web from www.boutell.com:

       Obtain cgic: gzipped tar file

       Obtain cgic: .ZIP file

考虑到这是最新版的问题,不建议采用最新版,所以从网上下载了cgic205版本

 

     # tar xzf cgic205.tar.gz

     # cd cgic205

       

三、搭建交叉编译环境(默认x86平台)

     修改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},将其改成$(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS}

    找到gcc capture.o -o capture ${LIBS},将其改成$(CC) $(CFLAGS) capture.o -o capture ${LIBS}

    保存退出。

       

    修改后的Makefile

       CFLAGS=-g -Wall

       #CROSS_COMPILE=

       CROSS_COMPILE=arm-linux-

       CC=$(CROSS_COMPILE)gcc

       AR=$(CROSS_COMPILE)ar

       RANLIB=$(CROSS_COMPILE)ranlib

       LIBS=-L./ -lcgic

       all: libcgic.a cgictest.cgi capture

       install: libcgic.a    //可以执行 make install 命令  目标

          cp libcgic.a /usr/local/lib

          cp cgic.h /usr/local/include

          @echo libcgic.a is in /usr/local/lib. cgic.h is in /usr/local/include.

       libcgic.a: cgic.o cgic.h  //libcgic.a 依赖于 cgic.c cgic.h 

          rm -f libcgic.a

          $(AR) rc libcgic.a cgic.o  //一个归档命令  ar rc libcgic.a 

          $(RANLIB) libcgic.a  //ranlib”来对静态库的符号索引表进行更新。

       #mingw32 and cygwin users: replace .cgi with .exe

       cgictest.cgi: cgictest.o libcgic.a

          $(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS}

          #gcc cgictest.o -o cgictest.cgi ${LIBS}

       capture: capture.o libcgic.a

          $(CC) $(CFLAGS) capture.o -o capture ${LIBS}

          #gcc capture.o -o capture ${LIBS}

       clean:

          rm -f *.o *.a cgictest.cgi capture

      根据Makefile编译可以看出,有两个拷贝的过程:

cp       libcgic.a    /usr/local/lib 

cp       cgic.h        /usr/local/include

            两个命令的学习:

   ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,

   里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。

   原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。

同时:这个也是很好的可以学习的Makefile文件,阅读源码应该慢慢的养成一种习惯。

四、cgi文件分析:

       cd cgic205-arm

   里面有大约10个文件:

       cgic.h:头文件;

       cgic.cCGIC的源代码文件;

       cgictest.cCGIC库的作者提供的一个CGI程序例子;

       capture.c:用于调试CGI程序的工具;

       Makefile:安装CGIC的脚本文件;

           

      可以看到,整个库实际上就是cgic.c一个文件,可以说是非常的精炼。

      可以把CGIC安装为操作系统的一个动态链接库,这样我们每次编译的时候,就不需要有cgic.c这个源文件了。

      但是由于需要(以后将会看到),我们将修改cgic.c代码,所以我们不把它安装进系统。每次编译的时候,只要把cgic.c和cgic.h放到当前文件夹就好了。

     

     

五、make编译cgi源码:

   make

   得到的CGIClibcgic.a

      我们通过调试辅助程序capture和测试程序cgictest.cgi,来验证生成CGIC库的正确性。        将capture和cgictest.cgi拷贝到主机的/home/fengjunhui/source/rootfs/boa/cgi-bin目录下。

   cp capture cgictest.cgi  /home/fengjunhui/source/rootfs/boa/cgi-bin

   cp libcgic.a  /home/fengjunhui/source/rootfs/lib

     

六、测试安装

      在开始编写你自己的CGI程序之前,一定要先走通他的例子程序,免得后来程序出错的时候还不知道是配置有问题,还是你的程序代码有问题。

      我们用他自带cgictest.c来实现自己的第一个C语言CGI程序。           

  

先运行boa服务器(后台运行)

./boa  &

 在工作站的浏览器地址栏输入http://192.168.1.100/cgi-bin/cgictest.cgi (直接指定要运行的程序)

(指定网页运行举例:http://192.168.1.100/pass.html    板子ip/网页名)

可以看到页面,表示CGIC库和测试脚本都移植成功。cgictest.cgi比较完整的展现了CGIC库的功能,

在开发基于CGIC库的CGI程序前最好先掌握cgictest.cgi程序,这个应用程序是十分重要的参考范例。

七、问题与解决思路:

1、Unable to connect

Firefox can't establish a connection to the server at 192.168.1.100.

Boa服务器没有运行:

2、404 在boa的/cgi-bin目录下找不到对应的cgi文件或在www目录下找不到对应的html文件

404 Not Found

The requested URL /cgi-bin/cgictest.cgi was not found on this server

404 Not Found

The requested URL /index.html was not found on this server.

八、理论准备:

      前期理论准备1

   Web方式的应用开发一般都会将界面设计(CSS/JS等)和程序逻辑脱离开来,允许在一定程度下更改界面,

   如改变界面文本的属性,建立多语言版本等,而无需改动程序逻辑。界面一般由美工来进行制作,而程序员负责具体功能的实现。

前期理论准备2:                                                                           

   HTML中,表单 (FORM)是最主要的传递信息的手段,它适用于任何浏览器。 ----应用范围广---任何浏览器 FORM

   表单中有很多元素,包括输入文本框,单选框,多选框,按钮,等等,可以提供信息的交互。    ----表单的关键组成部分

  

   具体对象说明和语法请参见其他HTML书籍,在这里不作介绍。

   根据应用需求,美工或其他设计人员将最后的Web页面设计出来,作为程序员进行开发的模板。

   CGI程序的工作一般就是接收表单数据,进行数据处理,最后根据处理结果生成新的页面返回给浏览器。 

                 三步: 接收表单数据,解析数据,将解析后的数据返回给页面

   表单数据一般是以POST方法提交给服务器,由CGI程序获得,程序必须要将界面数据和内部数据对应起来才能够进行下一步的处理。  ---数据提交方式:post

   CGI程序从页面获取数据就根据元素名字/值中的元素名字来进行区分。但CGI返回页面就比较麻烦。由于界面在程序开发完成后还有可能会改变,

   而且有些需要程序处理的地方可能没有表单元素,

   因此对程序来说,不能以表单元素名作为区分的基础,一般方法是采用HTML中的注释<!-xxx-->来标记。

     

      前期理论准备3:

   程序员需要在模板中为每一个表单元素以及其他任何需要程序处理的地方,按照一定规则,如注释的下一行就是表单元素行,建立其注释标记。

   CGI程序就可以根据注释标记来判断表单元素信息并进行处理。程序逐行读取模板文件,检查有无注释标记,如有的话,则下一行需要进行处理,

   给表单元素赋上数据,最后就可以返回带数据的页面给浏览器。

    HTML模板还需要关注的是输入的检查。根据输入检查越早越好的原则,需要在用户界面上就对用户提交的数据进行检查。

   目前一般是采用javascript脚本的方式。当用户提交数据时,表单对象的onSubmit方法就会被调用,在该方法里就可以对用户的输入进行检查。

   常用的检查有是否必需、最大/小长度、是否字符、是否数字、email地址、IP地址是否正确、是否匹配一个正则表达式等。

      前期理论准备4:     

      CGI程序的开发

      CGI程序的工作流程:

      

    程序一般逻辑为:

   1   接收表单数据,根据应用需求进行数据处理,最后根据处理结果生成新的页面返回给浏览器。

   2   表单数据一般是以POST方法提交给服务器,由CGI程序获得,程序根据元素名字/值中的元素名字来区分数据,

   3   完成数据处理后,再读取相应的模板文件,根据注释标记将对应的数据填充到HTML文本中去,生成最后的页面返回给浏览器。

九、HTML模板的制作--CGIC的基本思路

   cgic.c的代码可以看出,它定义了main函数,

   而在cgictest.c中定义了一个cgiMain函数。

   也就是说,对于使用CGIC编写的CGI程序,都是从cgic.c中的代码进入,在库函数完成了一系列必要的操作(比如解析参数、获取系统环境变量)之后,

   它才会调用你的代码(从你定义的cgiMain进入)。

     

   另外一点就是,cgi程序输出HTML页面的方式都是使用printf把页面一行一行地打印出来,比如cgictest.c中的这一段代码:

   fprintf(cgiOut, "<textarea NAME=\"address\" ROWS=4 COLS=40>\n");  //cgiOut实际上就是stdin

   fprintf(cgiOut, "Default contents go here. \n");

   fprintf(cgiOut, "</textarea>\n");

   上面这段代码的运行结果就是在页面上输出一个textarea

     

   第一个参数cgiOut实际上就是stdin,所以我们可以直接使用printf,而不必使用fprintf。不过在调试的时候会用到fprintf来重定向输出。

   这种方式与Java Servlet非常类似,Servlet也是通过调用打印语句System.out.println()来输出一个页面。(不过后来Java推出了JSP来克服这种不便。)

   但是与Servlet不同的地方在于,使用C语言的我们还要自己输出HTML头部(声明文档类型):

     

   cgiHeaderContentType("text/html");

   这个语句的调用一定要在所有printf语句之前。而这个语句执行的任务实际上就是:

   void cgiHeaderContentType(char *mimeType) {

      fprintf(cgiOut, "Content-type: %s\r\n\r\n", mimeType);

   }

   这个语句告诉浏览器,这次传来的数据是什么类型,是一个HTML文档,还是一个bin文件…

   如果是个HTML文档,就通过浏览器窗口显示,如果是一个bin(二进制)文件,则打开下载窗口,让用户选择是否保存文件以及保存文件的路径。

     

      理解了这几点之后,你就可以编写自己的CGIC程序了。新建一个文件mycgitest.c试试:

     

      下载: mycgitest.c

     

   #include <stdio.h>

   #include "cgic.h"

   #include <string.h>

   #include <stdlib.h>

  

   int cgiMain() {

       cgiHeaderContentType("text/html");

       fprintf(cgiOut, "<HTML><HEAD>\n");

       fprintf(cgiOut, "<TITLE>My First CGI</TITLE></HEAD>\n");

       fprintf(cgiOut, "<BODY><H1>Hello CGIC</H1></BODY>\n");

       fprintf(cgiOut, "</HTML>\n");

       return 0;

   }

  

      在Makefile文件中的末尾仿照cgitest.c添加自己的mycgitest.c文件,注意添加到目标文件

保存,再执行make命令即可(良好的习惯帮助你快速成长,参考别人的代码然后自己模仿)。

 12 all: libcgic.a cgictest.cgi mycgitest.cgi capture

 .....

 32 mycgitest.cgi: mycgitest.o libcgic.a

 33     $(CC) mycgitest.o -o mycgitest.cgi ${LIBS}

   capturemycgitest..cgi拷贝到主机的/home/fengjunhui/source/rootfs/boa/cgi-bin目录下。

   cp  mycgitest.cgi  /home/fengjunhui/source/rootfs/boa/cgi-bin

      此时通过浏览器访问,会在页面上看到一个大大的

Hello CGIC......”。

           

扩展学习:官网学习教程:

cgic官网学习教程:

   https://boutell.com/cgic/

   cgic: an ANSI C library for CGI Programming

参考博客:(吃水不忘挖井人哇,继续加油,同志们)

http://blog.csdn.net/tiantang46800/article/details/7530930

http://3633188.blog.51cto.com/3623188/826606

九、其他问题汇总:

问题一:

 

1、A9服务器 没有运行   ./smart_storage

2、A9和CGI的进程间通信失败:

注意查看进程间通信的ftok获得的秘钥是否是一致的。

 

问题二:

404的错误:

诊断:html网页找不到对应的cgi程序;

解决思路:

  1. 右键、查看网页源代码,确定IP地址没有问题
  2. 查看form表单,form表单对应的/cgi-bin/xxx.cgi在boa的cgi-bin目录下是否存在;

够用就行,不在于多

十、测试实验

连接库连接不上,然后切换root用户后命令又不对

arm-linux-gnueabi-gcc login.c -o login.cgi -L./ -lcgic 

经过我的测试最终对的命令这样写

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
项目开发环境 Linux+Arm53+C语言   项目需求    功能类别 功能名称 描述 家电控制模块 1、空调控制模块 信息显示 显示当前室内温度 自动控制 设置空调在某温度下自动开、关  2、风扇控制模块 状态显示 风扇开、关 自动控制 设置风扇的档数 3、灯光控制模块 状态控制 灯光的开/关控制 亮度 正常、节能  4、窗帘控制模块 自动开/关 根据室外的亮度自动开启/关闭窗帘 手动开/关 读取当前窗帘状态,手动开启/关闭 监控模块  1、烟感监控 自动控制 超过限量烟雾浓渡报警  2、红外监控 自动控制 有人非法闯进报警  3、报警功能 自动控制 打开、关闭  4、GPRS模块 信息收发 当有报警信息的时候,系统会自动将警报信息发送到指定的手机号码。 信息设定 设定接收信息的手机号  5、访客视频对讲 状态显示 观察访客信息、自定义门锁开、关 娱乐模块  1、收音机 状态控制 开、关 自定义 更换频道 自动调节声音 增大、减小  2、家庭影院 灯光控制 亮度效果调节 自动调节声音 增大、减小  3、音频播放 状态控制 开、关 自动调节声音 增大、减小 自定义模式 选择播放、随机播放、顺序播放、列表循环  4、数码相册 状态控制 开、关 自定义模式 选择播放、随机播放、顺序播放、列表循环 场景切换  1、在家模式 状态控制 家居电器开关、灯光亮度、监控状态  2、离家模式    项目源码结构:     |--bin            脚本目录         |--tar.sh     项目打包脚本     |--data           数据目录     |--include        头文件         |--beep.h     蜂鸣器模块         |--bmp.h      BMP图模块         |--config.h   项目配置文件         |--file.h     文件操作模块         |--jpeg.h     JPG图模块         |--led.h      LED模块         |--mp3.h      音频模块         |--mplayer.h  音频库模块         |--res.h      资源配置文件         |--tslib.h    触摸模块         |--ui.h       UI模块         |--vedio.h    视频模块     |--lib            库文件     |--pic            资源图片         |--icon       应用图标         |--ui         UI文件     |--shortcut       项目效果图     |--ext            第三方库         |--driver     驱动         |--lib        第三方库     |--src            代码目录         |--main.c     主程序         |--Makfile    自动编译脚本 --------------------- 作者:qq_39188039 来源:CSDN 原文:https://blog.csdn.net/qq_39188039/article/details/83751526 版权声明:本文为博主原创文章,转载请附上博文链接!
要在嵌入式Linux上使用boa和cgi来浏览文件目录,您需要按照以下步骤进行操作: 1. 安装boa和cgi: 在Linux中,您可以使用以下命令来安装boa和cgi: ``` sudo apt-get install boa sudo apt-get install libcgi-pm-perl ``` 2. 配置boa服务器: 在嵌入式Linux上,您需要编辑boa服务器的配置文件,以便它可以正确地运行cgi脚本。默认情况下,boa服务器配置文件位于/etc/boa/boa.conf。您需要确保以下配置项已启用: ``` server.modules = ("mod_cgi") ``` 并且以下行被注释掉: ``` #cgi.assign = ( ".cgi" => "/usr/bin/perl" ) ``` 3. 创建cgi脚本: 您可以使用Perl或其他脚本语言来编写cgi脚本,以便在boa服务器上运行。以下是一个示例Perl脚本,它将显示当前目录中的所有文件和子目录: ``` #!/usr/bin/perl use CGI qw(:standard); print header, start_html('File Browser'), h1('File Browser'), "<ul>\n"; opendir(DIR, "."); while ($file = readdir(DIR)) { next if ($file =~ m/^\./); if (-d $file) { print "<li><a href=\"$file/\">$file/</a></li>\n"; } else { print "<li><a href=\"$file\">$file</a></li>\n"; } } closedir(DIR); print "</ul>\n", end_html; ``` 4. 将cgi脚本复制到boa服务器的cgi-bin目录中: 默认情况下,boa服务器的cgi-bin目录位于/var/www/cgi-bin。将您的cgi脚本复制到此目录中。 5. 启动boa服务器: 您可以使用以下命令启动boa服务器: ``` sudo /etc/init.d/boa start ``` 现在,您可以在浏览器中输入嵌入式Linux的IP地址和端口号(默认为8888),然后浏览您的文件目录。例如,如果您的嵌入式Linux的IP地址为192.168.1.100,则可以在浏览器中输入http://192.168.1.100:8888/cgi-bin/your-script.cgi来运行您的cgi脚本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇努力学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值