[OK210开发板体验]系统篇(1) 基于S5PV210的智能家居系统之Boa服务器搭建

前面进行了OK210试用体验的入门篇和功能篇的体验,分别为:
入门篇:
[OK210开发板体验]入门篇(1):开箱验板
[OK210开发板体验]入门篇(2):板载资源
[OK210开发板体验]入门篇(3):开发环境(软件安装,开发环境,烧写系统)
[OK210开发板体验]入门篇(4):编程入门(NFS登录,驱动入门)
    
功能篇:
[OK210开发板体验]功能篇(1):Linux字符驱动之Led
[OK210开发板体验]功能篇(2):Linux字符驱动之Key按键
[OK210开发板体验]功能篇(3):Linux Input子系统之Key按键
[OK210开发板体验]功能篇(4):Linux字符驱动之DS18B20
[OK210开发板体验]功能篇(5):Linux字符驱动之PWM蜂鸣器
[OK210开发板体验]
功能篇(6):Linux字符驱动之红外遥控 
[OK210开发板体验]功能篇(7):Linux字符驱动之ADC模数转换
通过4篇入门篇的介绍,初步了解了OK210开发板的系统资源,并根据飞凌公司的提供的软件手册和硬件手册,结合自身的经验,搭建了相应的Linux系统开发环境。通过7篇功能篇的介绍,初步熟悉了OK210开发板的部分资源,对相应驱动模块的学习,为智能家居系统的搭建奠定了基础
今天是OK210试用体验的功能篇,Boa服务器的搭建:主要包括三部分,智能家居系统组成、Boa服务器搭建及附录。
一、智能家居系统组成
本设计的智能家居系统大体分为四大模块,数据采集、数据控制与处理、网络和终端显示与控制,具体如下图所示
 

数据采集分为5大部分,主要包括家庭安防、环境检测、灯光控制、窗帘控制和可视对讲,这些功能通过OK210连接的外设完成。数据控制与处理,主要通过OK210上的S5PV210处理器完成,即将采集到的数据进行处理,打包,通过网络发送到用户端。而网络部分可采用有线或无线的方法,来连接智能家居系统和用户端。终端显示与控制,主要实现用户对家居系统的检查和控制,可通过PC端或移动端来实现。
二、Boa服务器搭建

Boa 服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的http服务器。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全。它的最大特点是源代码开放、性能高,其可执行代码只有大约60KB左右。

由于Boa服务器运行在Linux系统,所以搭建分两步,第一步首先在Ubuntu主机上实现;第二步,完成在OK210的移植。其中,在Ubuntu上搭建有两个目的:(1)为在OK210上移植做准备,(2)方便程序功能代码的调试。
(一)主机上搭建

第一步编译Boa
1、下载Boa源码
下载地址: http://www.boa.org/ 或 http://sourceforge.net(当前版本为boa-0.94.13)
下载boa-0.94.13.tar.gz
解压: tar xvzfboa-0.94.13.tar.gz
2、生成Makefile文件
cd/boa-0.94.13/src
运行configure文件:./configure
3、安装bison和flex
sudoapt-get install bison
sudoapt-get install flex
4、编译
make
ps:编译前安装附录(1)(2)(3)修改相应的源码,不然会在编译或运行的过程中出错,修改后,进行编译
5、安装
将生成的可执行文件boa复制到/usr/local/bin/ 目录下
sudo cp /boa-0.94.13/src/boa /usr/local/bin/
第二步 Boa的配置
1、创建目录和文件
sudo mkdir /etc/boa
sudo mkdir -p  /var/www/cgi-bin/
sudo mkdir /var/log/boa/
sudo touch /var/log/boa/error_log
sudo touch /var/log/boa/access_log
2、修改权限
sudo chmod  -R 777  /var/www /var/log/boa/error_log/var/log/boa/access_log
sudo chmod  777 /uar/local/boa
3、配置boa.conf
将boa-0.94.13/boa.conf 复制到/etc/boa/ 目录下
sudo cp boa.conf /etc/boa/
(1)修改Group参数
将Group nogroup修改为Group 0
ps:由于在/etc/group文件中没有nogroup组,所以设成0。另外在/etc/passwd中有nobody用户,所以User nobody不用修改
(2)修改ScriptAlias参数
将ScriptAlias /cgi-bin/  /usr/lib/cgi-bin/修改为ScriptAlias /cgi-bin/  /var/www/cgi-bin/
第三步:Boa的执行
boa
ps:如果在第二步没有执行sudo chmod  777 /uar/local/boa,在此使用sudo boa
第四步:功能测试
1、静态网页测试
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>http://bbs.elecfans.com</title>
  6. </head>
  7. Hello World
  8. <body>
  9. </body>
  10. </html>
复制代码
将静态网页index.html存入/var/www目录下
直接在浏览器中输入:本机地址
静态HTML调试成功。
2、CGI脚本测试
1、编写Helloworld.c程序
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.      printf("Content-type: text/html\n\n ");
  5.      printf("<html> ");
  6.      printf("<head><title>CGI Output</title></head> ");
  7.      printf("<body> ");
  8.      printf("<h1>Hello,world.</h1> ");
  9.      printf("<body> ");
  10.      printf("</html> ");
  11.      return 0;
  12. }
复制代码
ps:
(1)形状应写成printf("Content- type: text/html\n\n");
(2)主程序的程序开头一定要用Tab,而不是空格

2、编译helloworld.c成helloworld.cgi
若在主机上测试,则用: gcc -ohelloworld.cgi helloworld.c
若在开发板上测试,则用:arm-linux-gcc -o helloworld.cgi helloworld.c
3、浏览
将helloworld.cgi拷贝至/var/www/cgi-bin/下,浏览器输入http://IP/cgi-bin/helloworld.cgi
(二)OK210上搭建

第一步:编译Boa
1、修改Makefile
CC = gcc
CPP = gcc -E   
该为:
CC = arm-linux-gcc
CPP = arm-linux-gcc -E
修改成功后,直接make
2、Boa瘦身

可以发现boa的大小前后差距很大,这为我们节省了很大的空间
第二步:配置boa
将主机 /etc/ 目录下的 mime.types 文件拷贝到开发板 /etc 目录下
第三步:移植
其实在OK210开发板上,已经移植好了Boa服务器,我们需要知道的是配置文件在/etc/boa目录下,可执行程序在/sbin/目录下,网页文件在/usr/local/boa下,我们可以替换成我们自己编译好的,也可以使用当前的,下面的是使用当前的测试结果:即在OK210开发板上运行Boa服务器,在PC上输入OK210的IP地址显示的结果。

三、附录
附录1
1)修改 src/compat.h,定位到120
找到
#define TIMEZONE_OFFSET(foo)foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo)(foo)->tm_gmtoff
否则会出现错误:
util.c:100:1: error: pasting "t"and "->" does not give a valid preprocessing token make: ***[util.o] 错误 1
2)修改 src/log.c,定位到72
注释掉
if (dup2(error_log, STDERR_FILENO) == -1) {
                         DIE("unableto dup2 the error log");
                   }
为:
/*if (dup2(error_log, STDERR_FILENO) == -1){
                         DIE("unableto dup2 the error log");
                   }*/
否则会出现错误:
log.c:73 unable to dup2 the error log:badfile descriptor
3)修改src/boa.c,定位到210行和228
注释掉下面两句话:
if (passwdbuf == NULL) {
        DIE(”getpwuid”);
        }
        if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
        DIE(”initgroups”);
        }
#if 0
        if (passwdbuf == NULL) {
        DIE(”getpwuid”);
        }
        if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
        DIE(”initgroups”);
        }
        #endif
否则会出现错误:boa.c:211 - getpwuid: No such file or directory
注释掉下面语句:
if (setuid(0) != -1) {
                        DIE(”ickyLinux kernel bug!”);
        }
#if 0
         if (setuid(0) != -1) {
                        DIE(”ickyLinux kernel bug!”);
                }
#endif
否则会出现问题:boa.c:228 - icky Linux kernel bug!: No such file or directory
附录2
boa.conf中各参数的含义:
Port 80                                #监听的端口号,缺省都是80,一般无需修改
#Listen 192.68.0.5                #bind调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址
User nobody                         #作为哪个用户运行,即它拥有该用户的权限,一般都是nobody,需要/etc/passwd中有nobody用户
Group nogroup                     #作为哪个用户组运行,即它拥有该用户组的权限,一般都是nogroup,需要在/etc/group文件中有nogroup
#ServerAdmin root@localhost  #当服务器发生问题时发送报警的email地址,目前未用,注释掉
ErrorLog /var/log/boa/error_log       #错误日志文件。如果没有以/开始,则表示从服务器的根路径开始。如果不需要错误日志,则用#/dev/null。在下面设置时,注意一定要建立/var/log/boa目录
#AccessLog/var/log/boa/access_log     #访问日志文件。如果没有以/开始,则表示从服务器的根路径开始。如果不需要错误日志,则用#/dev/null或直接注释掉。在下面设置时,注意一定要建立/var/log/boa目录
#UseLocaltime                         #是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用UTC时间
#VerboseCGILogs                       #是否记录CGI运行信息,如果没有注释掉,则记录,注释掉则不记录
ServerName www.hyesco.com             #服务器名字
#VirtualHost                          #是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web服务器。一般注释掉,即不需要启动
DocumentRoot /var/www                 #非常重要,HTML文档的主目录。如果没有以/开始,则表示从服务器的根路径开始。
UserDir public_html                   #如果收到一个用户请求的话,在用户主目录后再增加的目录名
DirectoryIndex index.html             #HTML目录索引的文件名,也是没有用户只指明访问目录时返回的文件名
#DirectoryMaker/usr/lib/boa/boa_indexer     #HTML目录没有索引文件时,用户只指明访问目录时,boa会调用该程序生成索引文件然后返回给用户,因为该过程比较慢最好不执行,可以注释掉或者给每个HTML目录加DirectoryIndex指明的文件,如果                                                            DirectoryIndex不存在,并且DirectoryMaker被注释,那么就用Boa自带的索引
#DirectoryCache/var/spool/boa/dircache      #生成程序来生成目录的索引文件并输出到下面目录,该目录必须是Boa能读写
KeepAliveMax 1000                           #一个连接所允许的HTTP持续作用请求最大数目,注释或设为0都将关闭HTTP持续作用
KeepAliveTimeout 10                        #HTTP持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接
MimeTypes /etc/mime.types                   #指明mime.types文件位置。如果没有以/开始,则表示从服务器的根路径开始。可以注释掉避免使用mime.types文件,此时需要用AddType在本文件里指明
DefaultType text/plain                      #文件扩展名没有或未知的话,使用的缺省MIME类型
CGIPath/bin:/usr/bin:/usr/local/bin         #提供CGI程序的PATH环境变量值
#AddType application/x-httpd-cgicgi         #将文件扩展名和MIME类型关联起来,和mime.types文件作用一样。如果用mime.types文件,则注释掉,如果不使用mime.types文件,则必须使用
#Redirect /barhttp://elsewhere/feh/bar      #指明文档重定向路径
Alias /doc /usr/doc                         #为路径加上别名
ScriptAlias /cgi-bin//var/www/cgi-bin/      #非常重要,指明CGI脚本的虚拟路径对应的实际路径。一般所有的CGI脚本都要放在实际路径里,用户访问执行时输入站点+虚拟路径+CGI脚本名