信息家电网络服务器设计
Network Server forInformation Appliance
2016 年 6 月
(
第三章 嵌入式平台开发环境
3.2 软件开发环境
第一步 下载VMware在电脑上一键安装,打开虚拟机,在虚拟机中安装RetHat Linux操作系统,具体步骤如下:参考附图(一)
第二步 安装交叉工具链
打开VMware里的RethatLinux系统,在根目录下新建一个文件夹为test,把下载的工具链通过samba服务器从window传到Linux系统中的test文件下,然后解压出来,在进行编译安装,具体步骤如下:
1.下载arm-linux-gcc-3.4.1.tar.bz2放在 /usr/local目录下
2.解压arm-linux-gcc-3.4.1.tar.bz2
#tar -jxvf arm-linux-gcc-3.4.1.tar.bz2
3.进入该文件夹,将arm文件夹拷贝到/usr/local/下
# cd usr/local/
#cp -rv arm /usr/local/现在交叉编译程序集都在/usr/local/arm/3.4.1/bin下面了
3.修改环境变量,把交叉编译器的路径加入到PATH。修改/etc/bash.bashrc文件 #vim /etc/bash.bashrc
在最后加上:export PATH=$PATH:/usr/local/arm/3.4.1/bin
4.立即使新的环境变量生效,不用重启电脑:
#source /root/.bashrc
5.检查是否将路径加入到PATH:
# echo $PATH 显示的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加入PATH。至此,交叉编译环境安装完成。
6.测试是否安装成功
# arm-linux-gcc –v
7.编译Hello World程序,测试交叉工具链
写下下面的Hello World程序,保存为hello.c
#include <stdio.h>
intmain()
{
printf("HelloWorld!/n");
return 0;
}
执行下面的命令:
# arm-linux-gcc -o hello hello.c
第四章 嵌入式web服务器的移植与实现
4.3 boa服务器的移植
常见的w嵌入式eb服务器有:boa、 appweb、lighttpd、 shttpd、 mathopd、 minihttpd、 goahead等
1. 从www.boa.org 下载 Boa 服务器的最新版:boa-0.94.13.tar.gz。
2. 解压:tar xzfboa-0.94.13.tar.gz
3. 进入解压后的文件夹boa-0.94.13内部的 src文件夹,对源文件进行如下修改
1 由于arm-linux-gcc 编译器版本过高,对语法的支持有一些改变,所以需要修改compat.h中的
2 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
3 为:
4
5 #define TIMEZONE_OFFSET(foo) foo->tm_gmtoff
4. 然后生成Makefile:./configure
5. 修改生成的Makefile:默认生成的Makefile针对x86平台,我们的目标是针对嵌入式平台,所以需要修改编译器.
1 更改Makefile的31行和32行:
2 CC = gcc
3 CPP = gcc -E
4 更改为
5 CC = arm-linux-gcc
6 CPP = arm-linux-gcc –E
6. 在当前目录下编译Boa源文件:make
7. 将生成好的boa可执行文件去掉冗余信息: arm-linux-strip boa.
4.3.2 Boa移植到OK6410中
1 (1) 修改25行的port端口,用来设置服务器监听的端口:
2 # Port: The port Boa runs on. The default port for http servers is 80.
3 # If it is less than 1024, the server must be started as root.
4
5 Port 80
6 (2) 注释43行的监听IP地址:默认监听该主机上的所有IP地址
7 #Listen 192.68.0.5
8 (3) 修改53、54行的user和Group 启动的UID和GID,使其以root身份启动
9 # User: The name or UID the server should run as.
10 # Group: The group name or GID the server should run as.
11
12 User root
13 Group root
14 (4) 修改116行的DocumentRoot地址,即客户端要显示的HTML页面存放位置
15 # DocumentRoot: The root directory of the HTML documents.
16 # Comment out to disable server non user files.
17
18 DocumentRoot /usr/local/boa
19 (5) 修改输入网页输入主机IP时要显示的页面:这里设为index.html
20 # DirectoryIndex: Name of the file to use as a pre-written HTML
21 # directory index. Please MAKE AND USE THESE FILES. On the
22 # fly creation of directory indexes can be _slow_.
23 # Comment out to always use DirectoryMaker
24
25 DirectoryIndex index.html
26 (6) 修改CGI程序存放的位置:以http://IP/cgi-bin/cginame 的方式运行cgi 程序时将在/usr/local/boa/cgi-bin 目录下寻找该程序
27 # ScriptAlias: Maps a virtual path to a directory for serving scripts
28 # Example: ScriptAlias /htbin/ /www/htbin/
29
30 ScriptAlias /cgi-bin/ /usr/local/boa/cgi-bin/
2. 将配置文件boa.conf 移动到OK6410的 /etc/boa/ 目录下。
3. 创建/var/log/boa/ 目录,这样Boa服务器启动时会在该目录下创建日志文件。
4. 将Linux系统上/etc/mime.types 文件复制到OK6410的/etc 目录下,否则Boa服务器启动不起来。
5. 将生成的boa文件移植到嵌入式板中的/sbin目录下并更改脚本文件 /etc/init.d/rcS, 新增一行: /sbin/boa ,确保boa服务器随系统上电自启动
4.3.3 测试boa服务器
1. 静态页面测试:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Boa 静态网页测试</title>
</head>
<body>
<h1> Welcome to Boa sever! </h1>
</body>
</html>
2. CGI 程序测试:
#include <stdio.h>
int main()
{
printf("Content-type: text/html\n\n");
printf("<html>\n");
printf("<head>\n");
printf("<title>CGI Output</title>\n");
printf("</head>\n");
printf("<body>");
printf("<h1> Hello, world. </h1>");
printf("</body>");
printf("</html>\n");
return 0;
}
4.4 sqlite数据库的移植
4.4.1 sqlite的编译
1.下载sqlite-3.5.6.tar.gz
2.解压#tarxvfz sqlite-3.5.6.tar.gz
3. #./configure--prefix=/home/user_name/sqlite/sqlite-arm --disable-tcl --host=arm-linux--prefix=/home/sqlite-3.6.18/sqlite-arm-linux/
4.编译并安装 #make && make install
6.为了减小执行文件大小,去掉其中的调试信息#arm-linux-strip sqlite3
4.4.2 sqlite移植到OK6410中
1.将bin目录下的sqlite3拷贝到根文件系统的bin目录下。
2.将lib目录下的.so系列文件和pkgconfig目录拷贝到根文件系统的usr/lib目录下
第五章 ARMlinux下实现动态页面的cgi技术
5.2 登录实现
Index.html
<html>
<head>
<title></title>
</head>
<bodybackground="./image/bg.jpg">
<br>
<br>
<h1align="center"><font color="red">智能网络家居系统</font></h1>
<p><center><b><fontsize="5">请登录</font></b></center></p>
<formalign="cgi-bin/login.cgi"method="post"><center>
用户名:
<inputtype="text" name="name"><br>
密 码:
<inputtype="password" name="passwd"><br><br>
<inputtype="submit" value="登录">
<inputtype="reset" value="重新输入">
</body>
</html>
Demo.c
#include<stdio.h>
#include<stdlib.h>
intmain()
{
char *str_len=NULL;
int len=0;
char buf[100]="";
char user[20]="";
char passwd[20]="";
printf("%s\r\n\r\n","Content-Type:text/html");
printf("<html>\n<head>\n<title>CGI3:登录结果</title></head><br>\n");
str_len = getenv("CONTENT_LENGTH");
if((str_len==NULL)||(sscanf(str_len,"%d",&len)!=1)||(len>80))
printf("sorry!error!");
fgets(buf,len+1,stdin);
sscanf(buf,"name=%[^&]&password=%s",user,passwd);
if((strncmp(user,"yugengde",8)==0)&&(strncmp(passwd,"133435",6)==0))
printf("<h1>Welcome!登录成功!");
else
printf("<h1>Sorry!用户名或密码错误!");
return 0;
}
Login.c
#include<stdio.h>
#include<stdlib.h>
intmain()
{
char *str_len=NULL;
int len=0;
char buf[100]="";
char user[20]="";
char passwd[20]="";
printf("%s\r\n\r\n","Content-Type:text/html");
printf("<html>\n<head>\n<title>CGI3:登录结果</title></head><br>\n");
str_len =getevn("CONTENT_LENGTH");
if((str_len==NULL)||(sscanf(str_len,"%d",&len)!=1)||(len>80))
fgets(buf,len+1,stdin);
sscanf(buf,"name=%[^&]&password=%s",user,passwd);
if((strncmp(user,"yugengde",8)==0)&&(strncmp(passwd,"133435",6)==0))
{
printf("<scriptlanguage=\"JavaScript\">self.location="main.cgi";</script>");
}
else
printf("<h1>Sorry!用户名或密码错误");
returnn 0;
}
5.3 主控制界面
Main.c
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include"leds.h"
#include"adc.h"
#include"18b20.h"
voidconfig(int *led_config,int led_num);
intmain()
{
int led_num = 0 ;
int adc_data = 0 ;
float tmp_temp ;
unsigned short tmp_data ;
int led_config[8] = {0 , 0 , 0 , 0} ;
FILE *fp_html ;
char bur[512] = "" ;
char *len ;
printf("%s\r\n\r\n" ,"Content-Type: text/html") ;
len = getenv(" CONTENT_LENGTH") ;
if( len != NULL)
{
unsigned int content_len = 0 ;
char *data ;
content_len = atoi(len) ;
data = malloc(content_len + 1) ;
read(0 , data , content_len) ;
sscanf(data , "led%d" ,&led_num) ;
free(data) ;
}
else
{
led_num = 0 ;
}
config(led_config , led_num) ;
led_fun(led_config) ;
if((fp_html = fopen("main_html", "r")) == NULL)
{
exit(1) ;
}
while(fgets(buf , 512 , fp_html))
{
if(strncmp(buf ,"$FLAG1S" , 7) == 0)
{
tmp_data = ds18b20_fun() ;
tmp_temp = tmp_data *0.0625 ;
tmp_data = tmp_temp * 10 +0.5 ;
if(tmp_data < 1000)
printf(" %2d . \n" , tmp_data/10 ,tmp_data%10) ;
else
printf("  85.0 \n") ;
}
else if(strncmp(buf ,"$FLAG2S" , 7) == 0)
{
adc_data = adc_fun(0) ;
printf(" nbsp;nbsp;nbsp;%2d %\n" , adc_data/11) ;
}
else if(strncmp(buf ,"$FLAG3S" , 7)
{
adc_data = adc_fun(1) ;
printf(" nbsp;nbsp;nbsp;nbsp;%2d %\n" , adc_data/11) ;
}
else if(strncmp(buf ,"$FLAG4S" , 7)
{
int i = 0 ;
for(i = 0 ; i < 4 ; i++)
{
if(led_config[i] ==0)
{
printf("<imgsrc = \" ../image/off.png\"width = 30 height = 30 hspace =45">") ;
}
else
{
printf("<imgsrc = \" ../image/on.png\"width = 30 height = 30 hspace =45">") ;
}
}
}
else
printf("%s" ,buf) ;
}
return 0 ;
}
voidconfig(int *led_config , int led_num)
{
FILE *fp ;
if( (fp = fopen("config.ini" ,"r+")) == NULL )
{
printf("<p> fopen error! <a href = \"/cgi-bin/main.cgi\">Return /a>") ;
exit(1) ;
}
fscanf(fp , "led1 = %d , led2 = %d,led3 = %d , led4 = %d " , led_config , led_config+1 , led_config+2 ,led_config+3) ;
if(led_num > 0)
{
if(led_config[led_num - 1] == 1)
{
led_config[led_num - 1] = 0;
}
else
{
led_config[led_num - 1] = 1;
}
fseek(fp , 7 * (led_num - 1) + 5 ,SEEK_SET) ;
fprintf(fp , "%d" ,led_config[led_num - 1]) ;
}
fclose(fp) ;
}
HTML界面:
Main_html
<script>
functionAddDataPost(sUserId,sUserName)
{
var obj = newActiveXObject("Microsoft.XMLHTTP");
sUserId = escape(sUserId);
sUserName = escape(sUserName);
var userInfo ="userid="+sUserId+"&username="+sUserName;
obj.open("POST","getData.asp",false);
obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
obj.send(userInfo);
return unescape(obj.responeText);
}
functionshow()
{
var data = new Date();
var now = "";
now = data.getFullYear()+"";
now = now +(data.getMonth()+1)+"";
now = now +(data.getData()+1)+"";
now = now +(data.getHours()+1)+"";
now = now +(data.getMinutes()+1)+"";
now = now + (data.getSeconds()+1)+"";
document.getElementById("nowDiv").innerHTML= now;
setTimeout("show()",1000);
}
</scropt>
<html>
<head>
<title>智能网络家电主页</title>
</head>
<body bgcolor="silver">
<center>
<h2 align=center><fontcolor=blue><body οnlοad="show()">
<div in="nowDiv"></div></h2></font>
</body>
<br>
<h1align="center"><font color="crimson">智能网络家居系统</h1>
<br><br><br>
<FORM METHOD="post">
<p><fontcolor="red"><h2 align=center>温 度
$FLAG1S</h2><b>
<p><fontcolor="red"><h2 align=center>湿 度
$FLAG2S</h2><b>
<br><br><br>
<input type="submit"name="view" value="">
</FORM>
<br></b>
<h1align="center"><font color="orangered">电灯控制</h1>
<br>
<FORM METHOD="post">
$FLAG3S
<br>
<input type="submit"name="led1" value="led1">
<input type="submit"name="led2" value="led2">
<input type="submit"name="led3" value="led3">
<input type="submit"name="led4" value="led4">
<br>
</html>
Led灯的配置文件
Config.ini
led1=0,led2=1,led3=0,led4=1
显示结果如下: