Goahead网络远程设备控制程序设计课件_第1页
Goahead网络远程设备控制程序设计课件_第2页
Goahead网络远程设备控制程序设计课件_第3页
Goahead网络远程设备控制程序设计课件_第4页
Goahead网络远程设备控制程序设计课件_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Goahead网络远程设备控制程序设计小组成员:周凯亮查伟王俊杰赵震玺张慧成Goahead网络远程设备控制程序设计小组成员:周凯亮查伟1一.课程设计目的和意义

1.1课程设计目的

课程设计的主要目的是通过实际的嵌入式应用系统开发实例掌握嵌入式系统设计和开发的技能和专门知识,积累实践和工程经验。

本课题设计尝试移植嵌入式服务器上广泛使用的网络服务器中称为“GoAhead”的网络服务器。并且,利用CGI程序,尝试在网络上控制HBE-EMPOSIII-SV210的LED,7-Segment,TextLCD。1.2课程设计要求本课题所设计的系统要求实现以下功能。 1.将“GoAhead”网络服务器移植到实验箱目标板Linux系统上; 2.创建作为网络服务器的索引文件使用的index.html文件; 3.完成编写利用Web的LED,7-Segment,TextLCD的控制程序。一.课程设计目的和意义

1.1课程设计目的2二.课程设计的需求与方法2.2需求分析

2.2.1功能需求分析

远程控制是当前信息技术领域的热点,使用远程控制技术,我们可以克服因地域差异而造成的操作不便,让网络的效率得到更大的发挥。随着技术的发展与网络的普及,目前远程控制技术的应用领域已经相当广泛。我们不仅可以通过远程控制技术管理远端电脑,解决远端电脑的故障,与其他同事通过网络实现远程协作,一起编辑一份文档或者与其他团队成员交流信息,还可以在家里或旅途中使用公司内部网络的数据与办公设备,实现远程办公。

2.2.2性能需求分析

(1)准确性与及时性

(2)灵活性

(3)响应速度二.课程设计的需求与方法3

2.2.3课题任务目标

(1)将“GoAhead”网络服务器移植到实验箱目标板Linux系统上;

(2)创建作为网络服务器的索引文件使用的index.html文件;

(3)完成编写利用Web的LED,7-Segment,TextLCD的控制程序。

2.2.4输入输出的要求

(1)鼠标点击WEB输入,通过键盘输入两个16进制的数,通过CGI程序将其转换成8位二进制数来控制开发板中的LED0~8的暗灭。(1为亮0为灭)

(2)鼠标点击WEB输入,通过键盘输入6位16进制的数,在开发板的七段码中显示出来。

(3)鼠标点击WEB输入,通过键盘在网页的Line1和Line2中输入一串字母或数字,在开发板的TextLCD中将输入的这些字符对应的显示出来。

2.2.5系统运行环境

硬件环境:pc机、HBE-EMPOSIII-SV210hardware、串口线、网线等

软件环境:windows、ubuntu等一些应用软件

宿主机开发环境:交叉编译环境、调试环境

2.2.3课题任务目标42.3软硬件平台设计2.3.1硬件平台设计以太网接口S5PV210(ARMCortexTM-A8Core)SDRAMNANDFLASHNORFLASHSD卡接口系统电源

嵌入式网络控制系统通过串行接口直接传送到S5PV210微处理器上的Web服务器,之后通过浏览器,用户可以方便的监测控制。硬件平台设计框图如图所示:2.3软硬件平台设计以太网接口SDRAMNANDF52.3.2软件平台设计

嵌入式网络控制系统通过RS-232串行接口直接传送到SamsungS5PV210微处理器上的WEB服务器,之后通过浏览器,用户可以方便的监测控制。

因此系统软件部分主要由数据采集、数据传输、服务器数据处理和CGI程序访问等几大部分。系统工作流程如下图所示:PCIECGI应用程序驱动程序HTML网页数据采集程序2.3.2软件平台设计PCIECGI应用程序驱动程序H62.3.3Goahead服务器的特点以及使用方式

Goahead服务器是一款主要面向嵌入式系统的Web服务器。 GoAheadWebserver是跨平台的服务器软件它的特点是: 1、很小的内存消耗 2、支持认证功能DigestAccessAuthentication(DAA) 3、支持安全的通信,例如SSL(安全的套接字层) 4、支持动态Web页面,如ASP页面 5、可以使用传统的C语言编程定制Web页面里的HTML标签 6、支持CGI(公共网关编程接口) 7、嵌入式的JavaScript脚本翻译器 8、独特的URL分析器2.3.3Goahead服务器的特点以及使用方式 Goah7三.课程设计的步骤与实现3.1GoAhead网络服务器移植 1.下载Goahead源码 2.GoAhead源码复制及解压缩 3.为了GoAhead编译的源码修改对“Makefile”进行修改

main.c和misc.c文件 4.GoAhead编译生成了“webs”网络服务器执行文件和“libwebs.a”库 5.创建作为网络服务器的索引文件使用的index.html文件 6.创建在目标板上连接网络服务器时出现的网页目录(/web),创建包含cgi的目录(/web/cgi-bin)。 7.向目标板下载GoAhead执行文件及main.html 8.在目标板上运行GoAhead 9.通过主机PC的网页浏览器连接网络服务器

三.课程设计的步骤与实现3.1GoAhead网络服务器移植83.2通过HTML中的CGI接口完成对开发板的链接开始编译HTML文件(如:first.html)编译.c文件(如:first.c)通过gcc.将c文件生成CGI文件将HTML.cgi文件用TFTP指令下载到开发板并运行结束 CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的交互,也就是CGI程序接受Web浏览器发送给Web服务器的信息,进行处理,将响应结果再回送给Web服务器及Web浏览器。CGI程序一般完成Web网页中表单(Form)数据的处理、数据库查询和实现与传统应用系统的集成等工作。CGI接口标准包括:1标准输入

可通过标准输入(stdin)从Web服务器得到输

入信息2环境变量 Web服务器和CGI接口设置了自己的一些环

境变量,用来向CGI程序传递一些重要的参数3标准输出

通过标准输出(stdout)将输出信息传送给Web服务器(html形式),就在命令行状态调试CGI程序,并且得到它们的输出。3.2通过HTML中的CGI接口完成对开发板的链接开始编译H9虚拟机及超级终端截图:虚拟机及超级终端截图:10Goahead网络远程设备控制程序设计课件11Goahead网络远程设备控制程序设计课件12通过HTML中的CGI接口完成对开发板的链接

实验截图:通过HTML中的CGI接口完成对开发板的链接13Goahead网络远程设备控制程序设计课件143.3嵌入式Web服务器的实现

3.3.1利用Web的LED控制程序

LED控制程序创建创建8bitled.html;8bitled.c文件LED控制程序编译8bitled.html和8bitled.cgi复制到/tftpboot目录中向目标板下载LED控制程序通过tftp下载8bitled.html和8bitled.cgi,并复制到/web和/web/cgi-bin接下来,通过主机PC的网页浏览器连接网络服务器

并向地址栏中输入“65/8bitled.html”并连接,则8bitled.html网页运行。

向地址栏中输入“http://65/8bitled.html

向文本框中输入两位十六进制数并单击input按钮。在这里,输入“1a”后,单击“input”按钮。3.3嵌入式Web服务器的实现LED控制程序创建创建8b15

LED控制页面运行确认及测试

实验截图:

16Goahead网络远程设备控制程序设计课件17Goahead网络远程设备控制程序设计课件18Goahead网络远程设备控制程序设计课件193.3.27-Segment设备驱动程序7Segment控制程序创建vi7segment.htmlvi7segment.c7Segment控制程序编译将7segment.html和7segment.cgi文件复制到/tftpboot目录中。向目标板下载7Segment控制程序通过tftp下载7segment.html和7segment.cgi文件,向/web和/web/cgi-bin目录中复制文件。接下来,通过主机PC的网页浏览器连接网络服务器。

如果运行网页浏览器并向地址栏中输入“65/7segment.html”并连接,则7segment.html网页运行。

向地址栏中输入“65/7segment.html”。

向文本框中输入六位十进制数并单击input按钮。在这里,输入”123456”后单击“input”按钮。3.3.27-Segment设备驱动程序7Segment20

7segment控制页面运行确认及测试

实验截图:Goahead网络远程设备控制程序设计课件21Goahead网络远程设备控制程序设计课件223.3.3利用Web的textlcd控制程序

Textlcd控制程序创建创建textlcd.html创建textlcd.c编译textlcd控制程序将textlcd.html和textlcd.cgi文件复制到/tftpboot目录中。向目标板下载textlcd控制程序下载textlcd.html和textlcd.cgi文件,向/web和/web/cgi-bin目录中复制文件。接下来,通过主机PC的网页浏览器连接网络服务器。

如果运行网页浏览器并向地址栏中输入“65/textlcd.html”并连接,则textlcd.html网页运行。

向地址输入栏输入“65/textlcd.html”。

输入文本框的Line1和Line2文字并单击“input”按钮。

如果画面上出现“LCDDone”消息窗,则可以清楚/web/cgi-bin中的textlcd.cgi程序顺利运行。3.3.3利用Web的textlcd控制程序Text23

textlcd控制页面运行确认

实验截图:Goahead网络远程设备控制程序设计课件24Goahead网络远程设备控制程序设计课件25Goahead网络远程设备控制程序设计课件26textlcd控制页面运行确认

实验截图:赵震玺周凯亮*查伟王俊杰textlcd控制页面运行确认赵震玺周凯亮*查伟王俊杰27四

总结4.1实验认知与发现的问题

本次课程设计是嵌入式开发与应用,虽然只有短短的两个星期,但在这两个星期里我们学到了很多。首先,我们对计嵌入式开发有了进一步的掌握。基本掌握了Goahead网络远程设备控制并在网络上控制HBE-EMPOSIII-SV210的LED,7-Segment,TextLCD。但在完成这些题目的同时,我们也发现了自己的很多问题:

第一,比如很多的专业术语都没有听说过,只好在同学的帮助和网络的帮助下,勉勉强强完成了任务,我们也知道了自己的很多不足,在往后的时间中还要继续研究。

第二,在我们使用tftp传送文件的时候忘记修改虚拟机IP地址导致没有传送文件成功。

第三,在我们将文件传送成功的时候,网页文件已经能在goahead中显示出来,但是输入数据的时候,开发板并没有显示出来,后面才发现是传送文件时,忘记用chomd命令给CGI文件加上权限,我们通过分析及时的解决了这个问题。第四,我们在完成实验后的第二天再次开启虚拟机并不能将这些网页文件打开,原来是每次启动虚拟机它的IP地址都是原地址,要将它改成00并通过超级终端运行网页文件。

第五,在运行网页文件的时候,首先要查看进程,要将进程中bin目录下的webs进程杀除再运行网页文件才能将它打开。

最后,通过本次实验我们知道了团队力量的重要性,有的题目单靠单人的力量是很难完成的,但是经过大家的合作,相比一个人来说完成的容易了点。四 总结4.1实验认知与发现的问题284.2实验效果分析

本次实验虽然能将开发板中的LED,7-Segment,TextLCD成功显示出来。但是本次实验的效果仍有几点不足。

第一:通过goahead网页服务器编写LED,7-Segment,TextLCD的网页较为简单。

第二:控制开发板中7-Segment的显示时间没有进行精确的控制。4.3课程设计心得体会

本次课程设计也获得一个经验:在写一个程序的时候,一定要事先把程序原理方框图化出来。以前总觉得这样做没必要,很浪费时间。但是,这次课程设计完全改变了我以前的那种错误的认识。这次课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的,因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。

经过本次试验我们这次做的实验还算是比较成功的,因为我们同时也在不知不觉中提高了动手能力和独立分析思考问题、解决问题的能力。

这两个星期的嵌入式应用的课程设计,使我们更加系统的认识和了解Goahead网络远程设备控制的工作原理,更深层次的认识了嵌入式开发,相信在今后的学习以及相关工作上会有很大帮助。致谢

感谢孙老师和范老师在课设中给予的指导和鼓励。感谢学校提供机会,能够让我们在实践中培养动手能力,将理论与实际结合再一起。4.2实验效果分析29五.代码附录参考资料5.17segment实验代码附录

/*********************************************************************** 7-SegmentCGIProgram**********************************************************************/#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/mman.h>#include<sys/stat.h>#include<fcntl.h>#include<sys/ioctl.h>#include<termios.h>#defineFPGA_BASEADDRESS 0x88000000#defineSEG_GRID_OFFSET 0x30#define SEG_DATA_OFFSET 0x32typedefstruct{ charname[128]; charval[128];}entry;五.代码附录参考资料5.17segment实验代码附录/30voidgetword(char*word,char*line,charstop){ intx=0,y=0; for(x=0;((line[x])&&(line[x]!=stop));x++)word[x]=line[x]; word[x]='\0'; if(line[x])++x; while(line[y++]=line[x++]);}intsizeofword(char*word){ inti=0; for(i=0;i<10;i++){ if(word[i]=='\0')break; } returni;}unsignedintGetsegcode(charx){ unsignedintcode;switch(x){ case'0':code=0xfc;break; case'1':code=0x60;break; case'2':code=0xda;break; case'3':code=0xf2;break; case'4':code=0x66;break; case'5':code=0xb6;break; case'6':code=0xbe;break;

case'7':code=0xe4;break;

voidgetword(char*word,char31case'8':code=0xfe;break; case'9':code=0xf6;break; case'a': case'A':code=0xfa;break; case'b': case'B':code=0x3e;break; case'c': case'C':code=0x1a;break; case'd': case'D':code=0x7a;break; case'e': case'E':code=0x9e;break; case'f': case'F':code=0x8e;break; default:code=0;break; } returncode;}intmain(){ char*cl; intk; unsignedintlow=0,high=0; entryentries; unsignedshortdigit[6]={0x20,0x10,0x08,0x04,0x02,0x01}; unsignedshortdata[6]; inti,j,m; intfd; unsignedshort*addr_fpga; unsignedshort*addr_grid,*addr_data; printf("Content-type:text/html\n\n"); printf("<html>\n<head><title>7-Segmentcgiprogram</title></head>\n");case'8':code=0xfe;break;32printf("<body>\n"); if((fd=open("/dev/mem",O_RDWR|O_SYNC))<0){ printf("memopenfail\n"); exit(1); } addr_fpga=(unsignedshort*)mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,FPGA_BASEADDRESS); addr_grid=addr_fpga+SEG_GRID_OFFSET/sizeof(unsignedshort); addr_data=addr_fpga+SEG_DATA_OFFSET/sizeof(unsignedshort); if(addr_grid<0|addr_data<0){ close(fd); printf("mmaperror\n"); exit(1); } cl=(char*)getenv("QUERY_STRING"); getword(,cl,'='); getword(entries.val,cl,'&'); k=sizeofword(entries.val); for(i=0;i<k;i++) data[(k-i)-1]=Getsegcode(entries.val[i]); for(j=0;j<200;j++){ for(i=0;i<k;i++){ *addr_grid=digit[i]; *addr_data=data[i]; for(m=0;m<65536;m++); } }

*addr_grid=~digit[0]; *addr_data=0; munmap(addr_grid,4096); munmap(addr_data,4096); close(fd);printf("<body>\n"); *addr_grid33if(k!=0) printf("<br><center>7-SegmentDone<br></center>"); elseprintf("<br><center>Youenteredthewrongvalue!<br></center>"); printf("<hr>"); printf("</body>\n</html>"); return0;}

5.17segment

HTML源码附录

<html><head><title>7segmentcgiprogram</title></head><body> <formmethod=getaction="cgi-bin/7segment.cgi"> <p><p><p>向7-Segment中输入要显示的十进制数。

<inputtype="text"name="value"maxlength="6"size="6">if(k!=0) printf("<br><cente345.2LED实验代码附录

<inputtype="submit"name="button"value="input"> /*********************************************************************8-BitLEDCGIProgram

**********************************************************************/#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/mman.h>#include<sys/stat.h>#include<fcntl.h>#include<sys/ioctl.h>#include<termios.h>#defineFPGA_BASEADDRESS 0x88000000#defineLED_OFFSET 0x20typedefstruct{ charname[128]; charval[128];}entry;voidgetword(char*word,char*line,charstop){ intx=0,y=0; for(x=0;((line[x])&&(line[x]!=stop));x++)word[x]=line[x]; word[x]='\0'; if(line[x])++x; while(line[y++]=line[x++]);}5.2LED实验代码附录<inputtype="sub35intmain(){ intfd;unsignedshort*addr_fpga,*addr_led; char*cl; unsignedshortval; entryentries; printf("Content-type:text/html\n\n"); printf("<html>\n<head><title>8bitLEDcgiprogram</title></head>\n"); printf("<body>\n"); cl=(char*)getenv("QUERY_STRING"); getword(,cl,'='); getword(entries.val,cl,'&'); val=(unsignedshort)strtol(entries.val,NULL,16); if(val==0){ if(!((entries.val[0]=='0'&&entries.val[1]=='\0')||(entries.val[0]=='0'&&entries.val[1]=='0'))){ printf("<p>Youenteredthewrongvalue!"); exit(1);} } if((fd=open("/dev/mem",O_RDWR|O_SYNC))<0){ printf("memopenfail,%d\n",fd); exit(1); } addr_fpga=(unsignedshort*)mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,FPGA_BASEADDRESS); addr_led=addr_fpga+LED_OFFSET/sizeof(unsignedshort); *addr_led=val|0x100; munmap(addr_fpga,4096); close(fd); printf("<br><center>Youentered<b>'0x%x'</b></center>",val); printf("<hr>"); printf("</body>\n</html>"); return0;}intmain() if((fd=open("/dev/m36<html><head><title>8bitledcgiprogram</title></head><body><formmethod=getaction="cgi-bin/8bitled.cgi"><p><p><p>输入两位十六进制值:  <inputtype="text"name="value"maxlength="2"size="2"><inputtype="submit"name="button"value="input"></form>5.2LED

HTML源码附录

5.2LEDHTML源码附录375.3LCD实验代码附录

/****************************************************************** TextLCDCGIProgram*****************************************************************/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<sys/mman.h>#include<fcntl.h>#include<termios.h>#defineFPGA_BASEADDRESS 0x88000000#defineTEXTLCD_OFFSET 0x10voidsetcommand(unsignedshortcommand);voidwritebyte(charch);voidinitialize_textlcd();voidwriteTextLcd(introw,char*str,intlength);intfunction_set(introws,intnfonts);intdisplay_control(intdisplay_enable,intcursor_enable,intnblink);intcusrsor_shit(intset_screen,intset_rightshit);intentry_mode_set(intincrease,intnshift);intreturn_home();intclear_display();intset_ddram_address(intpos);voidsplitword(char*out,char*in,charstop);voidunescape_url(char*url);charx2c(char*x);unsignedshort*pTextlcd;typedefstruct{ charname[128]; charval[128];}entry[2];5.3LCD实验代码附录/****************38intget_get(entryentries){ charqs[128]; inti; //bzero(qs,sizeof(qs)); sprintf(qs,"%s\0",getenv("QUERY_STRING")); for(i=0;*qs&&i<2;i++){ splitword(entries[i].val,qs,'&'); unescape_url(entries[i].val); splitword(entries[i].name,entries[i].val,'='); } returni;}voidsplitword(char*out,char*in,charstop){ inti,j; while(*in=='')in++; for(i=0;in[i]&&(in[i]!=stop);i++)out[i]=in[i]; out[i]='\0'; if(in[i])++i; while(in[i]=='')i++; for(j=0;in[j];)in[j++]=in[i++];}voidunescape_url(char*url){ inti,j;for(i=0,j=0;url[j];++i,++j){ if((url[i]=url[j])=='%'){ url[i]=x2c(&url[j+1]); j+=2; }elseif(url[i]=='+'){ url[i]=''; } }intget_get(entryentries)for(39 url[i]='\0';}charx2c(char*x){ charc;

c=(x[0]>='A'?((x[0]&0xdf)-'A')+10:(x[0]-'0')); c*=16; c+=(x[1]>='A'?((x[1]&0xdf)-'A')+10:(x[1]-'0')); returnc;}intmain(intargc,char**argv){ chardata[2][128]; intfd; entryentries; char*cl; unsignedshort*addr_fpga; printf("Content-type:text/html\n\n"); cl=(char*)getenv("QUERY_STRING"); get_get(entries); if((fd=open("/dev/mem",O_RDWR|O_SYNC))<0){ perror("memopenfail\n"); exit(1); } addr_fpga=(unsignedshort*)mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,

fd,FPGA_BASEADDRESS); pTextlcd=addr_fpga+TEXTLCD_OFFSET/sizeof(unsignedshort); if(pTextlcd<0){ close(fd);printf("mmaperror\n");exit(1); }

initialize_textlcd(); strcpy(data[0],entries[0].val); url[i]='\0';40 strcpy(data[1],entries[1].val); writeTextLcd(1,data[0],strlen(data[0])); writeTextLcd(2,data[1],strlen(data[1])); munmap(pTextlcd,4096); close(fd); printf("<br><center>LCDDone!</center><br>"); return0;}voidsetcommand(unsignedshortcommand){ command&=0x00FF; *pTextlcd=command|0x0000; usleep(1000); *pTextlcd=command|0x0100; usleep(1000); *pTextlcd=command|0x0000; usleep(1000);

}voidwritebyte(charch){ unsignedshortdata; data=ch&0x00FF; *pTextlcd=data&0x400; usleep(1000); *pTextlcd=data|0x500; usleep(1000); *pTextlcd=data|0x400; usleep(1000);}

strcpy(data[1],entries[1].va41voidinitialize_textlcd(){ function_set(2,0);//FunctionSet:8bit,display2lines,5x7mod display_control(1,0,0);//Displayon,Cursoroff clear_display();//Displayclear entry_mode_set(1,0);//EntryModeSet:shiftrightcursor return_home();//gohome}//sendFunctionSetcommandtothetextlcd//rows=2:=>2rows,rows=1=>1rows//nfonts=1:=>5x10dot,nfonts=0:5x7dotintfunction_set(introws,intnfonts){ unsignedshortcommand=0x30;if(rows==2)command|=0x08; elseif(rows==1)command&=0xf7; elsereturn-1;

command=nfonts?(command|0x04):command; setcommand(command);

return1;}intdisplay_control(intdisplay_enable,intcursor_enable,intnblink){ unsignedshortcommand=0x08; command=display_enable?(command|0x04):command; command=cursor_enable?(command|0x02):command; command=nblink?(command|0x01):command; setcommand(command); return1;}voidinitialize_textlcd()if(ro42intcusrsor_shit(intset_screen,intset_rightshit){ unsignedshortcommand=0x10; command=set_screen?(command|0x08):command; command=set_rightshit?(command|0x04):command; setcommand(command); return1;}intentry_mode_set(intincrease,intnshift){ unsignedshortcommand=0x04; command=increase?(command|0x2):command; command=nshift?(command|0x1):command; setcommand(command); return1;}intreturn_home(){ unsignedshortcommand=0x02; setcommand(command); return1;}intclear_display(){ unsignedshortcommand=0x01; setcommand(command); return1;}

intset_ddram_address(intpos){ unsignedshortcommand=0x80; command+=pos; setcommand(command); return1;}intcusrsor_shit(intset_scree43voidwriteTextLcd(introw,char*str,intlength){ inti;

if(row==1)set_ddram_address(0x0); elseif(row==2)set_ddram_address(0x40);

for(i=0;i<length;i++)writebyte(str[i]);}

<html><head><title>TextLCDCGIProgram</title></head><body> <formmethod=getaction="cgi-bin/textlcd.cgi"> <p><p><p>向LCD中输入要显示的字符。<br><br>Line1 <inputtype="text"name="form2"maxlength="16"size="20"><br>Line2

#include<stdio.h>intmain(){printf("Content-type:text/html\n\n");printf("<html>\n<head><title>TheFirstCGIprogram</title></head>\n");printf("<body>\n<center>ItisaCGIprogramtest</center>\n<body>\n</html>");return0;}<html><head><title>TESTCGIPROGRAM!</title></head><body><center><ahref="cgi-bin/first.cgi">ThefirstCGIPROGRAM!</a></center></body></html>5.3LCD实验代码附录voidwriteTextLcd(introw,cha44<html><head><title>TheFirstwebstest!</title></head><bodybgcolor="white"text="black"link="blue"vlink="purple"alink="red"><tablealign="center"cellpadding="0"cellspacing="0"width="100%"height="100"bgcolor="#006699"><tr><td><palign="center"><fontcolor=whiteface="ArialBlack"><spanstyle="font-size:22pt;"><b>欢迎使用goaheadweb服务器<br></b></span></font></p><tr><td><palign="center"><fontcolor=whiteface="ArialBlack"><spanstyle="font-size:12pt;"><b>组员:周凯亮查伟王俊杰赵震玺张慧成<br></b></span></font></p></td></tr></table></body><bodybgcolor="white"text="black"link="blue"vlink="purple"alink="red"><divalign="left"><tablecellpadding="0"cellspacing="0"width="700"><tr><tdwidth="50"height="20"><p> </p></td><tdwidth="700"height="20"><p> </p></td></tr><tr><tdwidth="50"><p> </p></td><tdwidth="700"><ul><divalign="left"><br><li><fontsize="3"color="#000000">

课程设计目的:本课题设计尝试移植嵌入式服务器上广泛使用的网络服务器中称为“GoAhead”的网络服务器。

并且,利用CGI程序,尝试在网络上控制HBE-EMPOSIII-SV210的LED,7-Segment,TextLCD。</font></li></ul><ul><li><fontsize="3"color="#000000">5.4TextledHTML源码5.4TextledHTML源码45Goahead网络远程设备控制程序设计课件465.5参考文献 1.《嵌入式开发与应用》课程设计指导书 2.《嵌入式开发与应用》实验指导书 3.田泽主编,《嵌入式系统开发与应用教程(第2版)》,北京航空航天大学出版社,2010 4.朱华生等主编,《嵌入式系统原理与应用:基于ARM微处理器和Linux操作系统》,清华大学出版社,2012 5.孙纪坤等主编,《嵌入式Linux系统开发技术详解:基于ARM》,人民邮电出版社,2008 6.谭浩强主编,《C语言程序设计》,清华大学出版社,2010

5.5参考文献47Goahead网络远程设备控制程序设计小组成员:周凯亮查伟王俊杰赵震玺张慧成Goahead网络远程设备控制程序设计小组成员:周凯亮查伟48一.课程设计目的和意义

1.1课程设计目的

课程设计的主要目的是通过实际的嵌入式应用系统开发实例掌握嵌入式系统设计和开发的技能和专门知识,积累实践和工程经验。

本课题设计尝试移植嵌入式服务器上广泛使用的网络服务器中称为“GoAhead”的网络服务器。并且,利用CGI程序,尝试在网络上控制HBE-EMPOSIII-SV210的LED,7-Segment,TextLCD。1.2课程设计要求本课题所设计的系统要求实现以下功能。 1.将“GoAhead”网络服务器移植到实验箱目标板Linux系统上; 2.创建作为网络服务器的索引文件使用的index.html文件; 3.完成编写利用Web的LED,7-Segment,TextLCD的控制程序。一.课程设计目的和意义

1.1课程设计目的49二.课程设计的需求与方法2.2需求分析

2.2.1功能需求分析

远程控制是当前信息技术领域的热点,使用远程控制技术,我们可以克服因地域差异而造成的操作不便,让网络的效率得到更大的发挥。随着技术的发展与网络的普及,目前远程控制技术的应用领域已经相当广泛。我们不仅可以通过远程控制技术管理远端电脑,解决远端电脑的故障,与其他同事通过网络实现远程协作,一起编辑一份文档或者与其他团队成员交流信息,还可以在家里或旅途中使用公司内部网络的数据与办公设备,实现远程办公。

2.2.2性能需求分析

(1)准确性与及时性

(2)灵活性

(3)响应速度二.课程设计的需求与方法50

2.2.3课题任务目标

(1)将“GoAhead”网络服务器移植到实验箱目标板Linux系统上;

(2)创建作为网络服务器的索引文件使用的index.html文件;

(3)完成编写利用Web的LED,7-Segment,TextLCD的控制程序。

2.2.4输入输出的要求

(1)鼠标点击WEB输入,通过键盘输入两个16进制的数,通过CGI程序将其转换成8位二进制数来控制开发板中的LED0~8的暗灭。(1为亮0为灭)

(2)鼠标点击WEB输入,通过键盘输入6位16进制的数,在开发板的七段码中显示出来。

(3)鼠标点击WEB输入,通过键盘在网页的Line1和Line2中输入一串字母或数字,在开发板的TextLCD中将输入的这些字符对应的显示出来。

2.2.5系统运行环境

硬件环境:pc机、HBE-EMPOSIII-SV210hardware、串口线、网线等

软件环境:windows、ubuntu等一些应用软件

宿主机开发环境:交叉编译环境、调试环境

2.2.3课题任务目标512.3软硬件平台设计2.3.1硬件平台设计以太网接口S5PV210(ARMCortexTM-A8Core)SDRAMNANDFLASHNORFLASHSD卡接口系统电源

嵌入式网络控制系统通过串行接口直接传送到S5PV210微处理器上的Web服务器,之后通过浏览器,用户可以方便的监测控制。硬件平台设计框图如图所示:2.3软硬件平台设计以太网接口SDRAMNANDF522.3.2软件平台设计

嵌入式网络控制系统通过RS-232串行接口直接传送到SamsungS5PV210微处理器上的WEB服务器,之后通过浏览器,用户可以方便的监测控制。

因此系统软件部分主要由数据采集、数据传输、服务器数据处理和CGI程序访问等几大部分。系统工作流程如下图所示:PCIECGI应用程序驱动程序HTML网页数据采集程序2.3.2软件平台设计PCIECGI应用程序驱动程序H532.3.3Goahead服务器的特点以及使用方式

Goahead服务器是一款主要面向嵌入式系统的Web服务器。 GoAheadWebserver是跨平台的服务器软件它的特点是: 1、很小的内存消耗 2、支持认证功能DigestAccessAuthentication(DAA) 3、支持安全的通信,例如SSL(安全的套接字层) 4、支持动态Web页面,如ASP页面 5、可以使用传统的C语言编程定制Web页面里的HTML标签 6、支持CGI(公共网关编程接口) 7、嵌入式的JavaScript脚本翻译器 8、独特的URL分析器2.3.3Goahead服务器的特点以及使用方式 Goah54三.课程设计的步骤与实现3.1GoAhead网络服务器移植 1.下载Goahead源码 2.GoAhead源码复制及解压缩 3.为了GoAhead编译的源码修改对“Makefile”进行修改

main.c和misc.c文件 4.GoAhead编译生成了“webs”网络服务器执行文件和“libwebs.a”库 5.创建作为网络服务器的索引文件使用的index.html文件 6.创建在目标板上连接网络服务器时出现的网页目录(/web),创建包含cgi的目录(/web/cgi-bin)。 7.向目标板下载GoAhead执行文件及main.html 8.在目标板上运行GoAhead 9.通过主机PC的网页浏览器连接网络服务器

三.课程设计的步骤与实现3.1GoAhead网络服务器移植553.2通过HTML中的CGI接口完成对开发板的链接开始编译HTML文件(如:first.html)编译.c文件(如:first.c)通过gcc.将c文件生成CGI文件将HTML.cgi文件用TFTP指令下载到开发板并运行结束 CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的交互,也就是CGI程序接受Web浏览器发送给Web服务器的信息,进行处理,将响应结果再回送给Web服务器及Web浏览器。CGI程序一般完成Web网页中表单(Form)数据的处理、数据库查询和实现与传统应用系统的集成等工作。CGI接口标准包括:1标准输入

可通过标准输入(stdin)从Web服务器得到输

入信息2环境变量 Web服务器和CGI接口设置了自己的一些环

境变量,用来向CGI程序传递一些重要的参数3标准输出

通过标准输出(stdout)将输出信息传送给Web服务器(html形式),就在命令行状态调试CGI程序,并且得到它们的输出。3.2通过HTML中的CGI接口完成对开发板的链接开始编译H56虚拟机及超级终端截图:虚拟机及超级终端截图:57Goahead网络远程设备控制程序设计课件58Goahead网络远程设备控制程序设计课件59通过HTML中的CGI接口完成对开发板的链接

实验截图:通过HTML中的CGI接口完成对开发板的链接60Goahead网络远程设备控制程序设计课件613.3嵌入式Web服务器的实现

3.3.1利用Web的LED控制程序

LED控制程序创建创建8bitled.html;8bitled.c文件LED控制程序编译8bitled.html和8bitled.cgi复制到/tftpboot目录中向目标板下载LED控制程序通过tftp下载8bitled.html和8bitled.cgi,并复制到/web和/web/cgi-bin接下来,通过主机PC的网页浏览器连接网络服务器

并向地址栏中输入“65/8bitled.html”并连接,则8bitled.html网页运行。

向地址栏中输入“http://65/8bitled.html

向文本框中输入两位十六进制数并单击input按钮。在这里,输入“1a”后,单击“input”按钮。3.3嵌入式Web服务器的实现LED控制程序创建创建8b62

LED控制页面运行确认及测试

实验截图:

63Goahead网络远程设备控制程序设计课件64Goahead网络远程设备控制程序设计课件65Goahead网络远程设备控制程序设计课件663.3.27-Segment设备驱动程序7Segment控制程序创建vi7segment.htmlvi7segment.c7Segment控制程序编译将7segment.html和7segment.cgi文件复制到/tftpboot目录中。向目标板下载7Segment控制程序通过tftp下载7segment.html和7segment.cgi文件,向/web和/web/cgi-bin目录中复制文件。接下来,通过主机PC的网页浏览器连接网络服务器。

如果运行网页浏览器并向地址栏中输入“65/7segment.html”并连接,则7segment.html网页运行。

向地址栏中输入“65/7segment.html”。

向文本框中输入六位十进制数并单击input按钮。在这里,输入”123456”后单击“input”按钮。3.3.27-Segment设备驱动程序7Segment67

7segment控制页面运行确认及测试

实验截图:Goahead网络远程设备控制程序设计课件68Goahead网络远程设备控制程序设计课件693.3.3利用Web的textlcd控制程序

Textlcd控制程序创建创建textlcd.html创建textlcd.c编译textlcd控制程序将textlcd.html和textlcd.cgi文件复制到/tftpboot目录中。向目标板下载textlcd控制程序下载textlcd.html和textlcd.cgi文件,向/web和/web/cgi-bin目录中复制文件。接下来,通过主机PC的网页浏览器连接网络服务器。

如果运行网页浏览器并向地址栏中输入“65/textlcd.html”并连接,则textlcd.html网页运行。

向地址输入栏输入“65/textlcd.html”。

输入文本框的Line1和Line2文字并单击“input”按钮。

如果画面上出现“LCDDone”消息窗,则可以清楚/web/cgi-bin中的textlcd.cgi程序顺利运行。3.3.3利用Web的textlcd控制程序Text70

textlcd控制页面运行确认

实验截图:Goahead网络远程设备控制程序设计课件71Goahead网络远程设备控制程序设计课件72Goahead网络远程设备控制程序设计课件73textlcd控制页面运行确认

实验截图:赵震玺周凯亮*查伟王俊杰textlcd控制页面运行确认赵震玺周凯亮*查伟王俊杰74四

总结4.1实验认知与发现的问题

本次课程设计是嵌入式开发与应用,虽然只有短短的两个星期,但在这两个星期里我们学到了很多。首先,我们对计嵌入式开发有了进一步的掌握。基本掌握了Goahead网络远程设备控制并在网络上控制HBE-EMPOSIII-SV210的LED,7-Segment,TextLCD。但在完成这些题目的同时,我们也发现了自己的很多问题:

第一,比如很多的专业术语都没有听说过,只好在同学的帮助和网络的帮助下,勉勉强强完成了任务,我们也知道了自己的很多不足,在往后的时间中还要继续研究。

第二,在我们使用tftp传送文件的时候忘记修改虚拟机IP地址导致没有传送文件成功。

第三,在我们将文件传送成功的时候,网页文件已经能在goahead中显示出来,但是输入数据的时候,开发板并没有显示出来,后面才发现是传送文件时,忘记用chomd命令给CGI文件加上权限,我们通过分析及时的解决了这个问题。第四,我们在完成实验后的第二天再次开启虚拟机并不能将这些网页文件打开,原来是每次启动虚拟机它的IP地址都是原地址,要将它改成00并通过超级终端运行网页文件。

第五,在运行网页文件的时候,首先要查看进程,要将进程中bin目录下的webs进程杀除再运行网页文件才能将它打开。

最后,通过本次实验我们知道了团队力量的重要性,有的题目单靠单人的力量是很难完成的,但是经过大家的合作,相比一个人来说完成的容易了点。四 总结4.1实验认知与发现的问题754.2实验效果分析

本次实验虽然能将开发板中的LED,7-Segment,TextLCD成功显示出来。但是本次实验的效果仍有几点不足。

第一:通过goahead网页服务器编写LED,7-Segment,TextLCD的网页较为简单。

第二:控制开发板中7-Segment的显示时间没有进行精确的控制。4.3课程设计心得体会

本次课程设计也获得一个经验:在写一个程序的时候,一定要事先把程序原理方框图化出来。以前总觉得这样做没必要,很浪费时间。但是,这次课程设计完全改变了我以前的那种错误的认识。这次课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的,因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。

经过本次试验我们这次做的实验还算是比较成功的,因为我们同时也在不知不觉中提高了动手能力和独立分析思考问题、解决问题的能力。

这两个星期的嵌入式应用的课程设计,使我们更加系统的认识和了解Goahead网络远程设备控制的工作原理,更深层次的认识了嵌入式开发,相信在今后的学习以及相关工作上会有很大帮助。致谢

感谢孙老师和范老师在课设中给予的指导和鼓励。感谢学校提供机会,能够让我们在实践中培养动手能力,将理论与实际结合再一起。4.2实验效果分析76五.代码附录参考资料5.17segment实验代码附录

/*********************************************************************** 7-SegmentCGIProgram**********************************************************************/#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/mman.h>#include<sys/stat.h>#include<fcntl.h>#include<sys/ioctl.h>#include<termios.h>#defineFPGA_BASEADDRESS 0x88000000#defineSEG_GRID_OFFSET 0x30#define SEG_DATA_OFFSET 0x32typedefstruct{ charname[128]; charval[128];}entry;五.代码附录参考资料5.17segment实验代码附录/77voidgetword(char*word,char*line,charstop){ intx=0,y=0; for(x=0;((line[x])&&(line[x]!=stop));

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论