嵌入式课设报告web远程控制系统设计.docx
《嵌入式课设报告web远程控制系统设计.docx》由会员分享,可在线阅读,更多相关《嵌入式课设报告web远程控制系统设计.docx(21页珍藏版)》请在冰豆网上搜索。
嵌入式课设报告web远程控制系统设计
课设报告
课程名称嵌入式系统课程设计
实验项目web远程控制系统设计
指导教师周金和、王勇
学院信息与通信工程
专业电子信息工程
班级/学号电信1101/
学生姓名
实验日期
成绩____________________
实验步骤
一、搭建及移植web服务器
搭建及移植boa服务器是本次课题的要点所在,为了能够顺利搭建服务器,前期做了大量工作对其进行学习以及研究,在基本掌握boa服务器的搭建和移植的具体操作方法还有该服务器的工作方式、流程之后,才着手进行搭建和移植,即便如此,在搭建和移植的过程中还是遇到了不少问题,下文也进行了分析和解决。
1.1下载及配置BOA服务器
1.1.1下载安装boa服务器
首先在http:
//www.boa.org/下载BOA服务器的源码:
boa-0.94.13.tar.gz版本为0.94.13。
对其进行解压:
$tarxzfboa-0.94.13.tar.gz
还要安装必要的工具bison,flex。
否则会出现:
make:
yacc:
命令未找到
make:
***[y.tab.c]错误127。
$sudoapt-getinstallbisonflex
在输入上一条命令之前需要保证虚拟机联网,虚拟机联网方式如下
首先把主机联上网,虚拟机网络设置桥接改成nat
$sudovim/etc/network/interfaces
static改成dhcp,在address,netmask,gateway加#注释
用:
wq保存并退出
重启网路配置
$sudo/etc/init.d/networkingrestart
1.1.2修改相关配置文件
修改src/compat.h文件:
打开compat.h找到这一条语句:
#defineTIMEZONE_OFFSET(foo)foo##->tm_gmtoff
将其修改为:
#defineTIMEZONE_OFFSET(foo)(foo)->tm_gmtoff
这是由于本机所使用的交叉编译版本对语句用法的不同。
修改src/log.c文件。
打开log.c注释掉下列语句:
/*if(dup2(error_log,STDERR_FILENO)==-1){
DIE("unabletodup2theerrorlog");
}*/
否则会出现错误:
log.c:
73unabletodup2theerrorlog:
badfiledescriptor。
修改src/boa.c文件。
打开src/boa.c注释掉下面两句话:
#if0
if(passwdbuf==NULL){
DIE(”getpwuid”);
}
if(initgroups(passwdbuf->pw_name,passwdbuf->pw_gid)==-1){
DIE(”initgroups”);
}
#endif
否则会出现错误:
boa.c:
211-getpwuid:
Nosuchfileordirectory。
#if0
if(setuid(0)!
=-1){
DIE(”ickyLinuxkernelbug!
”);
}
#endif
否则会出现问题:
boa.c:
228-ickyLinuxkernelbug!
:
Nosuchfileordirectory。
1.1.3生成boa可执行文件
进入相关目录生成makefile文件:
$cdboa-0.94.13/src
$./configure
修改makefile文件。
$sudovimMakefile
修改CC=gcc为CC=arm-linux-gnueabihf-gcc
修改CPP=gcc-E为CPP=arm-linux-gnueabihf-gcc-E
接下来进行编译。
$make
然后为刚刚生成的二进制文件boa瘦身删除其调试信息。
$arm-linux-gnueabihf-stripboa
1.1.4修改配置
找到配置文件boa.conf并进行如下修改:
$sudogeditboa-conf
以下步骤需要在计算机上完成:
(1)对Group的修改
将Groupnogroup(这是修改程序所属的组)。
修改为Group0
(2)对user的修改
将Usernobody(这里是修改程序所属的用户)。
修改为User0
(3)对ScriptAlias的修改
将ScriptAlias/cgi-bin//usr/lib/cgi-bin/(这里是配置服务器读取cgi程序的目录,需要在SD卡中同样的位置建立同样的目录)。
修改为ScriptAlias/cgi-bin//www/cgi-bin/
(5)对DoucmentRoot的修改
将DoucmentRoot/var/www(这里是服务器初始网页放置的位置同样需要在SD卡同样的位置建立同样的文件夹并将名为index.html的网页放置在其中)。
修改为DoucmentRoot/www
(6)对ServerName的修改
将#ServerNamewww.your.org.here(取消掉注释否则提示没有服务器名)。
修改为ServerNamewww.your.org.here
否则会出现错误“gethostbyname:
:
Nosuchfileordirectory”
(7)对AccessLog修改
将AccessLog/var/log/boa/access_log(在SD卡相应位置建立同名文件夹以存放日志文件,否则提示找不到文件夹)。
修改为#AccessLog/var/log/boa/access_log
否则会出现错误提示:
“unabletodup2theerrorlog:
Badfiledescriptor”
修改完成后直接点击文件左上方的保存按钮进行保存。
在目标板上需要做的配置:
创建目录/etc/boa并且把boa和boa.conf拷贝到这个目录下:
$mkdir/etc/boa
$sudocpboa.conf/media/rootfs/etc/boa
创建HTML文档的主目录/www:
$mkdir/www
创建CGI脚本所在的目录/www/cgi-bin:
$mkdir/www/cgi-bin
1.2.测试服务器动态网页功能
到此为止服务器已经搭建完成了,接下来就要测试服务器是否能够成功运行动态网页了,为了顺利完成测试,首先要做的是让目标板和主机能够通过交叉网线通信:
在虚拟机菜单栏中安照:
虚拟机--设置--网络适配器--网络连接中选择桥街模式,这样就可以直接连接主机的物理网络。
有时会出现无论怎样配置都无法联通的情况这时就需要使用虚拟机中的虚拟网络编辑器来重置网络配置。
前面的设置完成后,先将windows下的ipv4设置为:
IP地址:
181.168.1.10,子网掩码:
255.255.255.0,默认网关:
181.168.1.1。
然后设置Ubuntu下的ip地址:
sudovi/etc/network/interfaces
将主机的ip地址设置为这一网段:
address181.168.1.11netmask:
255.255.255.0gateway:
181.168.1.1
重启主机的网络服务:
sudo/etc/init.d/networkingrestart
再去配置目标板,同样将其置于同一网段:
sudogedit/etc/network/interfaces
将目标板的ip地址设置为同一网段:
address181.168.1.12netmask:
255.255.255.0gateway:
181.168.1.1
重启目标板的网络服务:
sudo/etc/init.d/networkingrestart
配置完后在目标板上输入ifconfig可以查看到如下内容
这时就可以测试主机与目标板之间的连通性了:
分别在主机和目标板上使用ping命令去测试相互之间的连通性:
图1.1测试连通性
出现上图所示信息就便表示着主机与目标板已经联通了,可以进行通信了。
接下来要做的就是编译一个cgi程序,因为只是测试用所以就用最简单的helloworld来测试:
首先建立一个hello.c文件:
$sudogedithello.c
编写helloworld代码:
#include
intmain(intargc,char**argv)
{
printf("Content-type:
text/html\n\n");
printf("\n");
printf("
cgiCHello.c\n");
printf("
\n");
printf("
HelloWorld!
\"CGIC\"\n");
printf("\n");
printf("\n");
return0;
}
保存。
然后再对其进行编译,使之成为一个cgi文件:
arm-linux-gnueabihf-gcc-ohello.cgihello.c
在当前文件夹下便会生成hello.cgi,为这个文件添加权限,使其可执行:
chmod+Xhello.cgi
将这个文件移动到SD卡中之前所指定的服务器中的文件夹:
sudocphello.cgi/media/rootfs/www/cgi-bin/
现在可以打开浏览器在地址栏中输入181.168.1.12/cgi-bin/hello.cgi出现下图所示页面说明cgi功能可以使用,可以进行下一步工作了:
(首先应在目标板中启动Boa服务器,步骤如下:
在目标板中找到文件boa的目录,用cd命令进入,输入$sudo./boa,然后用ps-ef查看进程中是否有boa。
或者用ps-ef|grepboa直接查找进程Boa更加简便。
接下来才能访问服务器。
否则会出现连接不到服务器的错误)
图boa的运行与进程查看
图1.2动态网页测试
二、实现嵌入式web远程控制功能
目前为止,服务器的搭建以及数据的传输等基本功能已经实现了,为了能够实现嵌入式web远程控制的功能,就需要让控制者进入到其主页来进行编辑提交,所以在这个页面中就要让控制者能够对目标板进行各种控制和修改,而html只是单方向的,不能进行信息的交互,这时候就需要cgi程序来完成交互的任务。
2.1静态网页的配置
首先建立一个index.html文件:
sudogeditindex.html
编写index.html代码:
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
无标题文档
functionMM_jumpMenu(targ,selObj,restore){//v3.0
eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
if(restore)selObj.selectedIndex=0;
}
//181.168.1.10/cgi-bin/hello.cgi#tips"target="_blank">hello~
其实每个标记都是一一对应的。
每个网页文件都是以开始和以结束。
与之间的内容是网页的标题。
会显示在浏览器的标题栏上。
与之间放的是网页内容。
语句能够实现空行功能,以便使网页整体结构不会过于紧凑,
//181.168.1.10/cgi-bin/hello.cgi#tips"target="_blank">hello~
将index.html拷贝到目标板HTML文档的主目录/www里。
sudocpindex.html/media/rootfs/www
该语句表示了在网页中加入一个超链接,该链接指向http:
//181.168.1.12/cgi-bin/hello.cgi显示为hello用于测试服务器的cgi功能。
效果如图所示:
在虚拟机浏览器中输入181.168.1.12显示如下图所示
图2.1HTML超链接
点击hello~之后服务器跳转,页面显示的内容:
图2.2超链接hello.cgi
2.2动态网页的配置
2.2.1HTML表单
/表单动作指向allroot.cgi传送方式为post
/插入文本框,赋值名为var_ip
/插入提交按钮
/表单结束
上面的语句表示了以post的方式将表单内容发送给allroot.cgi,同时定义了一个按键和一个输入文本框,按钮的属性为提交按钮,文本框内的值为var_ip的值。
2.2.2cgi功能的实现
为了能够实现更改ip的的功能就需要写一个shell脚本调用interfaces并对其进行修改,然而修改这个文件需要root权限,可是单单给shell脚本加上权限并不能达到目的,这时就需要借用一个c程序来提升其权限.
首先建立一个allroot.c文件:
sudogeditallroot.c
编写allroot.c代码:
#include
#include
#include
#include
intmain()
{
printf("Content-type:
text/html\n\n");//输出类型
uid_tuid,euid;
uid=getuid();
euid=geteuid();
if(setreuid(euid,uid))//交换这两个id
perror("setreuid");
system("sudosh/www/cgi-bin/changeip.sh");//调用程序,原来的指导书没有sudosh,不能成功的调用changeip.sh,因此在前面加上相应调用的语句才执行成功
return0;
}
保存。
然后再对其进行编译,使之成为一个cgi文件:
arm-linux-gnueabihf-gcc-oallroot.cgiallroot.c
在当前文件夹下便会生成allroot.cgi,为这个文件添加权限,使其可执行:
chmod+Xallroot.cgi
将这个文件移动到SD卡中之前所指定的服务器中的文件夹:
sudocpallroot.cgi/media/rootfs/www/cgi-bin/
这个c程序所做的便是提升changip.sh脚本的权限。
当在网页中输入ip地址181.168.1.12后,进入changip.sh
将通过awk截取变量$f以-为分隔符的第二个域($2)的值,并赋值给var_ip这个变量:
var_ip=`echo$QUERY_STRING|awk-F'&''{print$1}'|awk-F'=''{print$2}'`
将得到的var_ip这个值写入interfaces:
eth0_cfg="/etc/network/interfaces"
sed-i'/^address/d'$eth0_cfg
echo"address$var_ip">>$eth0_cfg
这样就完成了ip的更改。
changeip.sh:
#!
/bin/bash
#iftheprogramwhatcalledthiscgiisn'tsysconf.php,thisscriptwillrefusetorun!
!
!
!
#如果不是通过sysconf.php调用这个脚本,则拒绝执行,以保证安全性,避免直接通过http加参数的get
#方式直接运行
#if[-z`echo$HTTP_REFERER|sed-n'/sysconf.php/p'`];then
#exit
#fi
if[$REQUEST_METHOD="POST"];then
QUERY_STRING=`cat/dev/stdin`
fi
echo"Content-type:
text/html"
echo""
eth0_cfg="/etc/network/interfaces"
var_ip=`echo$QUERY_STRING|awk-F'&''{print$1}'|awk-F'=''{print$2}'`
var_mask=`echo$QUERY_STRING|awk-F'&''{print$2}'|awk-F'=''{print$2}'`
var_gateway=`echo$QUERY_STRING|awk-F'&''{print$3}'|awk-F'=''{print$2}'`
sed-i'/^netmask/d'$eth0_cfg
sed-i'/^address/d'$eth0_cfg
sed-i'/^gateway/d'$eth0_cfg
echo"address$var_ip">>$eth0_cfg
echo"netmask$var_mask">>$eth0_cfg
echo"gateway$var_gateway">>$eth0_cfg
#ifconfigeth0$var_ipnetmask$var_mask
#routeadddefaultgw$var_gateway
为了能够使开发板重启同样需要一个提升权限的reboot.c程序,考虑到cgi的原理是需要将主机提交的数据提供给相应程序来执行,所以这样编写C语言.
首先建立一个reboot.c文件:
sudogeditreboot.c
编写reboot.c代码:
#include
#include
#include
#include
intmain(intargc,char**argv,void)
{
printf("Content-type:
text/html\n\n");
inta;
if(a=1)
{printf("Thesystemisgogingtoreboot.......\n\n");
system("sudoreboot");//原来的代码中没有sudo,因此在点击重启之后屏幕印出Thesystemisgogingtoreboot......但是没有真正的重启系统,是因为重启系统需要有root的权限,因此加入sudo之后便可以正常的实现功能
}
else
return(0);//原来的代码没有加;在编译的时候会报错,因此把分号加上了
}
保存。
然后再对其进行编译,使之成为一个cgi文件:
arm-linux-gnueabihf-gcc-oreboot.cgireboot.c
在当前文件夹下便会生成reboot.cgi,为这个文件添加权限,使其可执行:
chmod+Xreboot.cgi
将这个文件移动到SD卡中之前所指定的服务器中的文件夹:
sudocpreboot.cgi/media/rootfs/www/cgi-bin/
三、测试与调试
3.1测试远程控制功能
3.1.1配置ip地址功能
首先将主机与开发板用网线串口线连好,打开SecureCRT连接进入开发板,如果是上电之前就连接好电脑的话,还可以看到一些启动信息。
在开发板上启动boa服务器,之所以使用root权限进入是因为,如果用普通用户权限进入的话,会有端口被占用的提示,然而如果使用8080端口的话,对于本设计后面的进行会带来很多不必要的麻烦。
启动boa服务器后,会显示启动信息,服务器版本,服务器创建时间以及服务器所占用的端口号,占用的端口号为80。
在主机上打开浏览器,地址栏内输入开发板服务器的ip(181.168.1.12)这样就进入了服务器的主页,主页的内容很直接,两个按钮,一个超链接,一个文本框:
boa服务器主页
3.1.2重启功能
在开发板上测试重启功能的具体过程如下:
打开服务器初始的页面找到并点击重启按钮,重启这个功能看起来比改变ip要容易的多,但是如果使用c语言来编写cgi程序的时候往往会因为权限的问题带来很多的麻烦。
因此要注意加sudo给到系统root权限。
重启按钮
浏览器中的显示,目标板自动重启
图服务器重启
3.1.3更改ip功能
为了确定ip是否更改首先查看开发板当前ip地址,输入ifconfig命令后可以看到当前的连接,硬件地址,ipv4和ipv6地址,