1.嵌入式web服务器boa的移植(Ubuntu+4412)

索引

这一期会介绍这一阶段的学习:
1. boa服务器的移植与测试
2. HTML控制4412的led灯亮灭(局域网)
3. 内网穿透实现外网控制
4. 花生壳的移植与开机自启动

接下来进入本篇正题:

一 准备本次内容

链接:https://pan.baidu.com/s/1_XX-X6JZwt9YMLl8b99yYw
提取码:0qhr
材料介绍:
| boa-0.94.13.tar.gz | boa服务器安装包 |
| html_test.tar.gz | 对应html测试程序 |
| cgi_test.tar.gz | 对应cgi测试程序 |
| cgic205.tar.gz | cgic网关接口移植包 |

二 移植boa服务器

1.修改配置(Ubuntu下)

解压boa-0.94.13.tar.gz源码
tar -xvf boa-0.94.13.tar.gz
在这里插入图片描述
安装需要工具bison,flex
sudo apt-get install bison flex
在这里插入图片描述
进入 解压得到的boa-0.94.13/目录下,修改 src/compat.h:
vi compat.h +120

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff

修改为

#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

修改 src/log.c:
vi log.c +72

注释掉

	if (dup2(error_log, STDERR_FILENO) == -1) {
            DIE("unable to dup2 the error log");
       }

  /*if (dup2(error_log, STDERR_FILENO) == -1) {
            DIE("unable to dup2 the error log");
        }
  */

修改src/boa.c: vi boa.c +209

	passwdbuf = getpwuid(server_uid);
	if (passwdbuf == NULL) {
        DIE(”getpwuid”);
        }
        if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
        DIE(”initgroups”);
        }

改为

 #if 0   
      passwdbuf = getpwuid(server_uid);
        if (passwdbuf == NULL) {
            DIE("getpwuid");
        }
        if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
            DIE("initgroups");
        }
#endif  

	if (setuid(0) != -1) {
                DIE(”icky Linux kernel bug!);
        }

#if 0
         if (setuid(0) != -1) {
                DIE(”icky Linux kernel bug!);
         }
#endif

修改src/defines.h
vi defines.h +30

#define SERVER_ROOT "/etc/boa"

修改为

#define SERVER_ROOT "/boa"

//此处为boa服务器位置,根据自己设置的位置填写正确
(这样boa程序启动时会在/boa目录下寻找boa.conf配置文件,并且将/boa文件夹作为服务器的根目录)。
执行./configure:
./configure

这是根据configure.in文件进行一系列的配置,生成config.status,configure,和Makefile文件。
如果无法执行,考虑权限,修改该目录下的configure的属性为可执行 chmod 777 configure

编译ubuntu的boa服务器
make
进入boa-0.94.13 目录下,修改boa.conf文件(Boa的配置):
cd ..
vi boa.conf
重新指定一些文件的生成路径,因为重新指定这些路径后会帮助我们深刻的理解关于boa服务器的工作机

Port  80  
User  0  
Group 0  

bind调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址
error_log和access_log会自动生成,只要指定生成路径就可以了。

ErrorLog /boa/log/error_log  
AccessLog /boa/log/access_log    

存放HTML文件的根路径

DocumentRoot /boa/www  
UserDir public_html    

默认页面,若输入http://127.0.0.1/则会自动返回给浏览器默认页面index.html

DirectoryIndex index.html    
irectoryMaker /boa/boa_indexer   //被修改
KeepAliveMax 1000  
KeepAliveTimeout 10  
MimeTypes /boa/mime.types   //被修改
DefaultType text/plain    

指定传给cgi程序的PATH环境变量

CGIPath /bin:/usr/bin:/usr/local/bin   
Alias /doc /usr/doc   
ScriptAlias /cgi-bin/ /boa/cgi-bin/  

如果输入http://127.0.0.1/cgi-bin/test.cgi, 则boa服务器会到/boa/cgi-bin中寻找test.cgi程序。
在根目录下,创建boa目录
mkdir /boa
在boa目录下创建文件夹
sudo mkdir -p /boa /boa/www /boa/cgi-bin /boa/log
将需要的文件复制到安装目录中
将boa-0.94.13目录下的 boa.conf拷贝到 /boa
sudo cp boa.conf /boa
将boa-0.94.13/src目录下生成的boa、boa_indexer二进制文件复制到/boa
sudo cp src/boa src/boa_indexer /boa
将/etc/mime.types复制到/boa目录下
sudo cp /etc/mime.types /boa
此时整个boa服务器移植完成,但是还需要测试boa服务器是否移植成功

2.测试Ubuntu下的boa服务器

解压html_test.tar.gz
tar -xvf html_test.tar.gz
将解压下的www目录覆盖 /boa/www
sudo cp -r www /boa
解压cgi_test.tar.gz
tar -xvf cgi_test.tar.gz
进入解压得到的cgi-bin文件夹中编译c文件得到对应的cgi
gcc -o test.cgi test.c
将得到的test.cgi移动到/boa/cgi-bin/下
cp test.cgi /boa/cgi-bin/

ok,打开浏览器
本机回环测试输入127.0.0.1
在这里插入图片描述
出现如图说明:没有启动服务器
我们在终端输入
./boa/boa

重新打开浏览器
在这里插入图片描述
点击 to cgi page 会显示
在这里插入图片描述
至此Ubuntu下的boa服务器移植成功

3.移植到4412开发板

在boa-0.94.13/src/目录下进行以下操作:
make clean 用于清除之前make生成的ubuntu虚拟机可执行文件
修改Makefile
vi Makefile
修改CC = gcc 为 CC = arm-linux-gcc
修改CPP = gcc -E 为 CC = arm-linux-gcc -E
保存,再执行
make
生成用于4412开发板的执行文件
为生成的二进制文件boa瘦身:
arm-linux-strip boa

将/boa 备份到csdn/目录下,用于生成开发板的boa服务器
sudo cp -r /boa /home/topeet/csdn
将现在的 boa boa_indexer 移动到csdn/boa/
sudo cp boa boa_indexer ../../../boa

进入到解压得到的cgi-bin/文件夹,编译4412上的 test.cgi
arm-linux-gcc -o test.cgi test.c
并将得到的test.cgi移动到4412的boa/cgi-bin/目录下
sudo cp test.cgi ../boa/cgi-bin/

使用tf卡将这个boa服务器放置在开发板的根目录下
打开和开发板有网络连接平台的浏览器
输入开发板的ip
好了,出现了和ubuntu虚拟机上一样的效果

三 移植cgic库

1. 解压cgic205.tar.gz
tar -xvf cgic205.tar.gz
cd cgic205
2. 先做ubuntu虚拟机的
直接make
将得到的capture和cgictest.cgi移动到/boa/cgi-bin/目录下
sudo cp capture cgictest.cgi /boa/cgi-bin/
3. 回环测试
浏览器里输入
http://127.0.0.1/cgi-bin/cgictest.cgi
得到如图则说明成功
在这里插入图片描述
4. 编译4412开发板的
make clean清除一下
修改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 L I B S , 将 其 改 成 {LIBS},将其改成 LIBS(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS},
找到gcc capture.o -o capture L I B S , 将 其 改 成 {LIBS},将其改成 LIBS(CC) $(CFLAGS) capture.o -o capture ${LIBS},
保存退出。
修改Makefile后为:

CFLAGS=-g -Wall
CC=arm-linux-gcc
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
LIBS=-L./ -lcgic

all: libcgic.a cgictest.cgi capture

install: libcgic.a
 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
 rm -f libcgic.a
 $(AR) rc libcgic.a cgic.o
 $(RANLIB) libcgic.a

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

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

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

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

5. 编译测试
make后得到的capture和cgictest.cgi 移动到开发板的cgi-bin/下
打开和开发板有网络连接平台的浏览器
输入http://192.168.1.230/cgi-bin/cgictest.cgi

测试发现
在这里插入图片描述
这时需要修改权限。
chmod 777 capture
chmod 777 cgictest.cgi
再进行测试,结果与虚拟机相同效果
6. 补充
两个命令的学习:
ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,
里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)
原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。
cgi文件分析
cd cgic205-arm
里面有大约10个文件:
cgic.h:头文件;
cgic.c:CGIC的源代码文件;
cgictest.c:CGIC库的作者提供的一个CGI程序例子;
capture.c:用于调试CGI程序的工具;
Makefile:安装CGIC的脚本文件;
可以看到,整个库实际上就是cgic.c一个文件,可以说是非常的精炼。
可以把CGIC安装为操作系统的一个动态链接库,这样我们每次编译的时候,就不需要有cgic.c这个源文件了。
但是由于需要(以后将会看到),我们将修改cgic.c代码,所以我们不把它安装进系统。每次编译的时候,只要把cgic.c和cgic.h放到当前文件夹就好了。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值