网络服务器设计

 

 

 

 

 

信息家电网络服务器设计

Network Server forInformation Appliance

 

 

 

 

 

 

 

 

 

 

 

 

  2016 年  6  月

 

 

 


目     录

 





 

 

 

 

 

 

 

 

第三章 嵌入式平台开发环境

 

3.2 软件开发环境

3.2.1 交叉编译开发环境的建立

第一步 下载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等

4.3.1  boa的编译 

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>

                            密&nbsp码:

                            <inputtype="password" name="passwd"><br><br>

                            <inputtype="submit" value="登录">

                            &nbsp;&nbsp;&nbsp;

                            <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("&nbsp;&nbsp;%2d .  \n" , tmp_data/10 ,tmp_data%10) ;

                     else

                            printf("&nbsp;&nbsp85.0 \n") ;

              }

              else if(strncmp(buf ,"$FLAG2S" , 7) == 0)

              {

                     adc_data = adc_fun(0) ;

                     printf("&nbsp;nbsp;nbsp;nbsp;%2d %\n" , adc_data/11) ;

              }

              else if(strncmp(buf ,"$FLAG3S" , 7)

              {

                     adc_data = adc_fun(1) ;

                     printf("&nbsp;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>温&nbsp;&nbsp;&nbsp;&nbsp;度

$FLAG1S</h2><b>

       <p><fontcolor="red"><h2 align=center>湿&nbsp;&nbsp;&nbsp;&nbsp;度

$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

 

 

显示结果如下:

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值