嵌入式Web 服务器Boa 的移植及其应用

    随着嵌入式技术的发展和高速宽带网络的普及, 利用网络实现远程监控已为人们广泛接受, 嵌入式网络监控技术正是在此条件下逐步发展成熟起来的. 用户使用Web 浏览器, 通过以太网远程访问内置Web 服务器的监控摄像机, 不但可以实现对现场的远程视频监控, 而且可以向监控现场发送指令. 在整个系统的实现过程中, 嵌入式Web 服务器起着十分重要的作用, 因此, 在嵌入式网络视频监控系统中,Web 服务器的设计对监控系统的整体性能具有直接的影响, 只有有了高效率的Web 服务器, 监控系统的性能才能得到充分的发挥.

      1 嵌入式Web 服务器Boa 的特点

      Boa 是一款单任务的HTTP 服务器, 与其他传统的Web 服务器不同的是当有连接请求到来时, 它并不为每个连接单独创建进程, 也不通过复制自身进程来处理多链接, 而是通过建立HTTP 请求列表来处理多路HTTP 连接请求, 同时它只为CGI 程序创建新的进程, 这样就在最大程度上节省了系统资源, 这对嵌入式系统来说至关重要. 同时它还具有自动生成目录、自动解压文件等功能, 因此, Boa 具有很高的HTTP 请求处理速度和效率, 在嵌入式系统中具有很高的应用价值.

      2 Boa 的功能实现             嵌入式Web 服务器Boa 和普通Web 服务器一样, 能够完成接收客户端请求、分析请求、响应请求、向客

      户端返回请求结果等任务. 它的工作过程主要包括:

      ( a) 完成Web 服务器的初始化工作, 如创建环境变量、创建TCP 套接字、绑定端口、开始侦听、进入循环结构, 以及等待接收客户浏览器的连接请求;             ( b) 当有客户端连接请求时,Web 服务器负责接收客户端请求, 并保存相关请求信息;

      ( c) 在接收到客户端的连接请求之后,分析客户端请求, 解析出请求的方法、URL 目标、可选的查询信息及表单信息, 同时根据请求做出相应的处理;

      ( d)Web 服务器完成相应处理后, 向客户端浏览器发送响应信息, 关闭与客户机的TCP 连接.           嵌入式Web 服务器Boa 根据请求方法的不同, 做出不同的响应. 如果请求方法为HEAD, 则直接向浏览器返回响应首部; 如果请求方法为GET, 则在返回响应首部的同时, 将客户端请求的URL 目标文件从服务器上读出, 并且发送给客户端浏览器; 如果请求方法为POST, 则将客户发送过来的表单信息传送给相应的CGI 程序, 作为CGI 的参数来执行CGI 程序, 并将执行结果发送给客户端浏览器. Boa 的功能实现也是通过建立连接、绑定端口、进行侦听、请求处理等来实现的. 其初始化部分的源代码如下:

      int server_s;

      server_s = socket( SERVER_PF,SOCK_STREAM,IPPROTO_TCP) ;

      if( server_s == - 1) {

      DIE( unable to create socket) ;

      }

      if( set_nonblock_fd( server_s) == - 1) {

      DIE( unable to set server socket to nonblocking) ;

      }

      if( fcntl( server_s,F_SETFD,1) == - 1) {

      DIE( can′t set close! on! exec on server socket! ) ;

      }

      if( ( setsockopt( server_s, SOL_SOCKET,SO_REUSEADDR,( void*)&sock_opt,

      sizeof( sock_opt) ) ) == - 1) {

      DIE( setsockopt) ;

      }

      if( bind_server( server_s, server_ip, server_port) == - 1) {

      DIE( unable to bind) ;

      }

      if( listen( server_s, backlog) == - 1) {

      DIE( unable to listen) ;

      }           上述代码主要用于打开一个有效的socket 描述符, 然后将其转换为无阻塞套接字. 函数bind( ) 用于建立套接字描述符与指定端口间的关联, 并通过函数listen( ) 在该指定端口侦听, 等待远程连接请求.当侦听到连接请求时, Boa 调用函数get_request( int server_sock) 获取请求信息, 通过调用函数accept( ) 为该请求建立一个连接. 在建立连接之后, 接收请求信息, 同时对请求进行分析. 当有CGI 请求时, 为CGI 程序创建进程, 并将结果通过管道发送输出. Boa 的整体工作流程如图1 所示.

      3 Boa 在ARM 上的移植

      3.1 修改Web 服务器Boa           为进一步提高系统性能, 应根据嵌入式网络视频监控系统的特点, 对Web 服务器作适当的修改. 修改内容主要包括:

      ( a) 定义常数BUFFER_SIZE 为8192, 通过增大BUFFER_SIZE 的值来增加输入输出缓存,以提高图像传输速度, 从而加快系统的响应速度;

      ( b) 修改请求列表参数, 根据可能出现的请求数量修改服务器可以处理的HTTP 连接数量;

      ( c) 为适应嵌入式系统资源较少的情况, 精简uClinux 操作系统中的库函数,使用uClibc 进行编译, 因此要使Boa 在嵌入式系统上正常运行, 用户必须自己实现一些函数功能, 如字符串查找函数strstr( ) 和字符串复制函数strdup( ) 等.

      3.2 交叉编译Boa           为了建立嵌入式交叉编译环境, 首先必须安装arm 交叉编译工具arm-elf-gcc, 然后使用交叉编译工具arm-elf-gcc 编译Boa 源程序, 通过执行:

      . / configure -target = arm-elf -host = i686-pc-linux-gnu  -build = arm-elf

      Make           便可生成elf 格式的可执行文件boa.           通过arm-elf-strip -g boa 指令去除附带的编译信息, 以减少所占用的空间. uClinux 系统采用的romfs 文件系统相对于一般的ext2 文件系统需要的空间较少, 因此需要采用elf2flt 工具将生成的boa 的可执行文件由elf 格式转换成flat 格式, 并将其添加到romdisk 中.

      3.3 配置Web 服务器Boa           为了能够在ARM上运行Web 服务器Boa, 需要对其运行环境、参数等进行设置, 并将最终的配置文件Boa.conf 置于适当位置. 通过修改配置文件Boa.conf 可实现对Web 服务器的配置, 部分配置为: 侦听端口使用80 端口, 访问日志AccessLog 存放于/var/log/boa/access_log, 错误日志ErrorLog 位于/var/log/boa/error_log, 文件的根目录DocumentRoot 设在/home/httpd/, KeepAliveMax 的值修改为50,KeepAliveTimeout 的值修改为10, 设置CGIPath 为/cgi-bin/ 等; 在Boa.conf 的最后加上ServerNameEmServer, 即将EmServer 作为服务器名称, 当然也可用其他名称作为服务器名; 最后将修改好的配置文件Boa.conf 存放于嵌入式系统根文件/etc/boa 目录下. 通过镜像制作工具执行命令genromfs-fromfs.img -d romdisk 生成romdisk 的镜像文件romfs.img, 将romfs.img 通过bootloader 下载到flash 存储器.

      3.4 测试Boa 的运行           为了确保Boa 的正常运行, 利用简单的测试程序测试Boa 的运行情况. 在目录/home/httpd/ 下建立index.html 文档, 其内容为:

      <HTML>

      <BODY>

      This is boa

      < / BODY>

      < / HTML>           通过IE 浏览器连接到运行Boa 的嵌入式系统http://192.168.0.26/ , 若页面显示This is boa, 说明Boa可以正常获取页面.           在/cgi-bin/ 路径下建立test 文件, 其内容为:

      #!/bin/sh

      echo Content- type: text/html

      echo

      echo <html><body><pre>

      echo This is cgi test

      echo < / body>< / html>           在IE 浏览器输入地址http: //192.168.0.26/cgi-bin/ test, 若页面显示This is cgi test, 说明服务器可以正常执行CGI 程序.

      4 Boa 在网络监控系统中的应用

      将Boa 移植到运行uClinux 操作系统的ARM 处理器上, 建立嵌入式Web 服务器, 为用户提供基于HTTP 协议的网络接入方式, 这样的设计方案可以很好地运用到网络监控系统中. 由于Boa 只支持基于CGI 的动态网页, 因此需要编写适当的CGI 程序来实现对视频数据的发送和对控制指令的处理. Web 服务器通过调用CGI 程序实现网络视频监控, 同时向监控现场发送各种指令. 作者根据监控领域的实际需求, 按上述方案设计了一个网络视频监控系统, 该系统可以实现多路视频数据接入, 8 个方向的云台控制等功能.目前系统已经在楼宇监控中获得应用, 性能良好, 实时性强, 其监控界面如图2 所示.         图2 网络视频监控界面

      5 结束语

      Web 服务器是各种网络应用系统的有机组成部分, 直接影响网络应用系统的运行质量与效率. Boa 本身是为嵌入式系统所设计, 它特有的连接处理方式以及直接调用操作系统的文件读取方式, 大大提高了系统的性能. 它与Linux 系统上的Web 服务器Aparch 相比占用系统资源少, 连接处理速度快. 在网络监控系统中使用这种嵌入式Web 服务器, 可以节省系统资源, 提高系统运行效率, 充分发挥了网络的优势.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式web服务器boa框架的基础上, 使用C语言cgi, 或者Python脚本, 结合HTML + javascript + ajax 的嵌入式web系统的开发实例 html 中使用javascritp + ajax 从C语言生成的cgi文件的get, set 一些值. boa服务器的相关配置参数说明: http://www.cnblogs.com/liuweiqiang/p/3859130.html boa安装包文件名: boa-for-hi3516a.tar.gz boa.conf 文件的保存路径: cat /etc/boa/boa.conf boa可 执行文件的路径: /usr/local/bin/boa, 可以设置为: 系统启动的时候, 这个进程自动启动 boa.conf 文件的重要参数 保存html文件的目录 DocumentRoot /www 可以将这个目录, 设置为samb共享文件夹的目录, 方便修改调试 修改完成以后, 肯定要重启boa进程的 保存python脚本, 或者C语言cgi文件的目录 ScriptAlias /cgi-bin/ /var/www/cgi-bin/ 说明: cgi-bin/ 后面的斜杠, 一定要加上 可以将这个目录, 设置为samb共享文件夹的目录, 方便修改调试 修改完成以后, 肯定要重启boa进程的 html文件文件中, 调用python脚本的时候, 指定的路径, 需要有: /cgi-bin, 比如: var url = "/cgi-bin/getuser.py"; 这个是python 或者 var url = "/cgi-bin/output.cgi"; 这个是C语言 说明: 如果发现, html文件, 修改了, 可是在浏览器中, 查看html源代码的时候, 这个代码, 还是旧的, 那么可以通过清空"IE浏览器", "360浏览器"的浏览记录 以上, javascript 可以调用python 同样, 也可以调用C语言生成的cgi文件(其实, 就是可执行文件) C语言 + Html 例子 C语言 CGI实例 http://blog.csdn.net/ajrm0925/article/details/8810342 http://blog.csdn.net/liang890319/article/details/6277900 http://blog.csdn.net/gnefniu/article/details/42432657 上传文件: http://blog.csdn.net/yu_xiang/article/details/7996670 查找文件 find . -type f -name "boa.conf" -print -mount find . -type f -name "boa" -print -mount 四、嵌入式web服务器boa的配置和使用 嵌入式web服务器boa的配置文件为boa.conf, 在boa-0.94.13目录下面,复制该文件到文件 系统的/etc/boa目录下面,打开boa.conf,修改为如下内容: Port 80 User root Group root ErrorLog /dev/console AccessLog /dev/null ServerName SoftEmbed.com DocumentRoot /www DirectoryIndex index.html KeepAliveMax 1000 KeepAliveTimeout 10 MimeTypes /etc/mime.types DefaultType text/plain CGIPath /bin:/usr/bin:/usr/local/bin ScriptAlias /cgi-bin/ /www/cgi-bin/ 几个重要配置参数如下: DocumentRoot: 存放html文档的主目录; DirectoryIndex: 默认返回的html文档; ScriptAlias:cgi脚本虚拟路径对应的实际路径,/www/cgi-bin/为cgi脚本存放的实际路径; 其他配置选项的意义请参考相关资料。 复制boa可执行文件到/usr/sbin目录中, 启动boa进程 重新制作文件系统,系统启动后,在客户端浏览器上输入开发板的ip 地址,例如: http://192.168.0.218, 就可以看到显示的测试网页了,如下图所示 CGI getenv函数的参数详解: http://www.cnblogs.com/ser0632/p/5498228.html s = getenv("环境变量名"); 取得环境变量内容 putenv改变或增加环境变量 int putenv(const char * string); setenv(改变或增加环境变量) http://www.jb51.net/article/71940.htm

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值