FTP客户端的设计与实现毕业设计_第1页
FTP客户端的设计与实现毕业设计_第2页
FTP客户端的设计与实现毕业设计_第3页
FTP客户端的设计与实现毕业设计_第4页
FTP客户端的设计与实现毕业设计_第5页
已阅读5页,还剩50页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

PAGEXLV毕业设计(论文)题目:FTP客户端的设计与实现学生姓名学号201022080243班级通信102202H所属院(系)电子信息工程系指导教师2014年5月20日PAGEXLVPAGEIVFTP客户端的设计与实现摘要(随着嵌入式系统开发的迅速发展,嵌入式系统应用从传统的工业和设备拓展到了家用电器,通信设备,汽车电子等领域,使得嵌入式系统、图形用户界面(GUI)得到了广泛应用。实时嵌入式系统对GUI的需求越来越明显,而这一切均要求有一个高性能、高可靠的GUI支持。QT作为一种先进的跨平台语言,可以在Windows、Linux以及Android和众多的嵌入式场合发挥作用。本文从QT架构和特点以及Ftp通信协议的原理出发,在需求分析的基础上详细论述了利用QT设计出Ftp下载工具的具体方法。该下载工具实现了给出计算机名称或者IP地址进行Ftp登陆,并能查看本地和服务器端的文件信息列表,从而对指定文件进行下载功能,并具有一定的实用性和便捷性。关键词:嵌入式,QT语言,FTP,下载

TheDesignandImplementationofFTPClientABSTRACT(Withtherapiddevelopmentofembeddedsystemdevelopment,embeddedsystemapplicationisexpandedfromindustryandthetraditionalequipmenttohouseholdappliances,communicationequipment,automotiveelectronicsandotherfields,theembeddedsystems,thegraphicaluserinterface(GUI)hasbeenwidelyapplied.Real-timeembeddedsystemonGUIismoreandmoreobvious,allofwhichrequireahighperformance,highreliableGUIsupport.QTasanadvancedcross-platformlanguage,canbeWindows,LinuxandAndroidandembeddedoccasionsmanyplayarole.AccordingtotheprincipleoftheQTarchitectureandthecharacteristicsofFtpcommunicationprotocol,onthebasisofthedemandanalysisindetailusingQTtodesignaspecificmethodofFtpdownloadtool.ThedownloadtoolisthecomputernameorIPaddressoftheFtplogfileinformation,andcanviewthelistoflocalandserveroff,thendownloadanduploadfunctiontothespecifiedfile,andhascertainpracticabilityandconvenient.Keywords:Embedded,QTlanguage,FTP,Download

目录9290第1章引言 -1-25080第2章系统分析 -3-89692.1需求分析 -3-168912.2功能分析 -3-3432第3章系统设计 -5-16043.1概要设计 -5-200853.2详细设计设计 -5-207363.2.1系统界面 -5-76073.2.2登陆验证功能设计 -6-188143.2.3文件检索浏览设计 -12-91113.2.4下载功能设计 -12-8813.2.5上传功能设计 -13-179603.2.6进度条显示功能设计 -14-43843.3关键技术简介 -15-23173.3.1QT介绍 -15-82513.3.2FTP通信协议 -17-385第4章系统实现 -19-159174.1QT工程的编译步骤 -19-102054.2登陆验证功能实现 -19-20814.3下载功能实现 -21-230514.4上传功能实现 -21-27672第5章系统构建与移植 -23-160685.1建立交叉编译环境 -23-30055.2H-JTAG烧写U-BOOT -23-306035.3内核移植 -27-58575.4构建文件系统 -33-16330第6章总结 -37-25281参考文献 -38-18804致谢 -39-27777附录 -40-276741外文资料翻译 -40-103712外文资料原文 -45- 太原科技大学华科学院毕业设计(论文)PAGE50-第1章引言21世纪是网络时代,是信息时代,随着互联网技术的迅猛发展,推动了全世界范围内的信息传输和信息交流。而随着计算机民用化普及,大众主要使用的网络服务有:电子邮件(E-mail),文件传输(FTP),远程登录(Telnet),聊天系统(Chat)等等,其中FTP更是功不可没。用户只需敲几个字,便能得到自己想要的文件信息,全世界已有1000多个FTP文件服务器对所有互联网用户开放,用户可以通过与互联网相连的计算机,把自己需要的文件传过来即可。目前有许多互联网站点都建立了可供大众访问的资料库,这些信息资料可以通过FTP获取。匿名的FTP用户有机会存取到世界上最大的信息资料库,这个信息库是日积月累起来的,而且还在增长,永不关闭,而且,这些服务是永远免费的。Ineternet之所以能发展迅猛,是因为人们使用通过标准协议提供标准服务的程序,这个标准协议在全球范围内有效。“嵌入式系统”一词最早是使用于工业和交通设备内部的控制装置,例如数控机床中的工业控制器、飞行器的自主导航装置,是一种完成专门功能的特殊计算机,其核心功能是控制,同时也有一定的计算功能。随着上世纪90年代末以来,嵌入式处理器,嵌入式操作系统和嵌入式应用开发环境及开发工具的飞速发展,特别是与网络通信技术、信号处理技术、多媒体技术等不同技术领域的融合,嵌入式技术已经成为一种集自动控制,网络通信,信号处理,分布式计算,人机互动,智能感知等功能为一体的综合性技术,其应用范围越来越广泛,从传统的工业和设备逐步拓展到家用电器,通信设备,汽车电子,医疗卫生,个人娱乐,智能家居,楼宇控制,办公自动化,商业设施,银行终端等与人们日常生活、工作密切相关的很多领域。而在嵌入式操作系统中,Linux操作系统是用途最广,装备产品最多的,特别是最近两年间,从智能手机和数字机顶盒到很多行业终端和工业控制设备,应用越来越普及。本课题的目的是尝试将已经逐渐在网络发展中成熟的技术,应用到当前快速发展的新兴科技产业--嵌入式系统上,探索适应当前科技发展的软硬件结合方式,以及各行业复杂业务逻辑在嵌入式系统上的统一出发点。FTP是因特网络上历史最悠久的网络工具,从1971年由专家AKBHU提出第一个FTP的RFC(RFC114)至今30多年FTP凭借其独特的优势一直都是因特网中最重要、最广泛的服务之一。FTP是TCP/IP提供的标准机制,实现从一台主机向另一台主机传送类似DOS的黑屏之下进行FTP操作,操作繁琐,效率低,目前很少使用文件的任务。在网络发展初期,文件传输协议(FTP)是惟一可行的选择。现在,可以使用很多种并非专门为文件传输设计的技术来传输文件,如电子邮件、即时消息、互联网中继聊天、甚至网络服务器等。这些技术当中的每一种技术都能够利用人们每天为某种目的使用的非常熟悉的单一的界面。虽然这些技术非常方便,但是,每一种技术都缺乏某种无法形容的强大功能。例如,电子邮件服务器通常限制附件容量的大小,网络服务器对于批量下载比较麻烦,而且大型文件的下载很容易出错。然而,在众多的文件传输的选择中,成熟的FTP服务器在继续发展,并且发展得比以往任何时候都要强大。现在,任何胜任文件传输任务的FTP服务器都有很多旨在管理其应用的功能。这些功能包括用户身份识别、文件传输策略,并且使用与保密网站相同的加密技术。采用SSL/TLS技术,FTP服务器能够为FTP客户机和服务器之间的控制命令加密以及为文件数据本身加密。拥有了WS_FTPPro等软件中的支持PGP加密功能,文件数据使用公共密钥加密就更安全了,只有要求为这个文件加密的用户才能够为这个文件解密。广泛的身份识别资源进一步提高了安全性。SurgeFTP和SecureFTP这两种软件都能够通过咨询外部的活动目录或者ODBC(开放数据库互联)资源来验证用户的身份。包括SecureFTP、RaidenFTPD和TitanFTP在内的一些FTP服务器软件支持S/KEY身份识别系统。S/KEY是一种一次性口令系统,能够最大限度提高安全性。在我国,客户所使用的的FTP客户端软件很多,大致我们可以把它们分为三类:第一类是传统的FTP客户机,这类客户机是在类似DOS的黑屏之下进行FTP操作,操作繁琐,效率低,目前很少使用;第二类是图形化用户界面的FTP软件,常用的如CuteFTP、WS-FTP等等,界面友好,功能强大,方便使用,是目前最常使用的FTP专用软件;第三类是Web浏览器,如IE、Netscape均支持FTP协议,通过浏览器同样能登录FTP服务器,但速度较慢。第2章系统分析2.1需求分析要设计一个具有界面的并且能够友好交互的FTP客户端,基本的需求分析如下所示:(1)连接需求根据用户所提供的IP、FTP服务器域名,用户账户和密码与所选择的服务器进行连接,如果连接成功则显示连接成功的提示信息;如果失败则显示连接失败的提示信息。(2)文件浏览需求能够改变当前文件目录,登陆到指定的服务器后能够查看服务器的文件信息,包括目录、文件名称、文件大小等信息。(3)文件下载与上传需求用户能够从服务器端下载所需要的文件到指定的本地目录,也能够把本地目录的文件上传到服务器端的特定目录里。(4)进度提示功能能够用进度条的形式告诉用户当前上传和下载的进度。(5)选择保存路径能够对下载的文件进行指定路径保存。2.2功能分析FTP下载客户端的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)查看远程计算机有哪些文件,然后把文件从远程计算机上拷贝到本地计算机,或者把本地计算机的文件送到网络上一台远程计算机去。而最原始的FTP下载需要很多参数设置,对于设计开发有一定困难。本系统是利用QT4所带的QFTP类库设计出具有良好友好交互界面,从而简化用户操作的难度,使用户能够轻松简单的使用FTP,主要功能包括:用户登录,从根目录或指定位置获得文件目录列表,下载或上传等。(1)用户登录功能分析首先作为使用客户端的用户,需要提供FTP服务器域名,服务器可用账户,服务器可用账户对应的密码,只有完成这三个基本条件后,才能够连接并登录FTP服务器端,如果任意一个为空或者账户密码对应不上,则以弹出警告窗口的形式提醒用户。图2.1登陆界面设计(2)文件浏览功能分析当用户成功登陆到FTP服务器时,对于文件浏览的操作要求有两部分,一个是浏览用户计算机本地文件的需求,另一个是登录到服务器要浏览服务器文件的需求。如图所示,左边为本地文件浏览,右边为登录到服务器的文件浏览。图2.2浏览文件界面设计(3)文件上传下载功能分析作为客户端的核心功能上传和下载,首先应该登陆服务器才能实现功能,对于下载功能来说,通过浏览服务器的文件,选定好文件后,选择下载功能,对于上传功能来说,则选择好本地文件,选定好服务器目录,选择上传功能即可。第3章系统设计3.1概要设计软件平台:基于跨平台Qt类库在Linux下运行的FTP客户端设计开发工具:Linux下QTCreator4.5.3版本进行开发功能模块:验证登录,文件浏览,上传功能,下载功能。QTftpQTftp客户端验证登陆文件浏览上传功能下载功能验证登陆文件浏览上传功能下载功能图3.1功能模块划分示意图3.2详细设计设计3.2.1系统界面FTP下载工具的界面设计具体如下:新建工程,双击QTCreator图标,点击CreateProject按钮,选择QtC++Project,接着输入文件名以及保存路径,然后点击“next”;这就进入QtCreator的设计界面。选择左上角的File菜单,在下拉菜单里选择NewFileOrProject命令,选择C++Project选项,创建新的工程。设计图形界面,工程新建完毕后,开始创建图形界面。首先,选择File-New命令,创建一个新的窗体,把新窗体的名字命名为“FTP客户端”,接着向窗体上添加控件,添加控件的方法简单,采用拖放的方式即可。根据功能需要,我往窗体上加入了4个Label,3个LineEdit,5个PushButton部件,1个TreeWidget(窗体),一个TollButton(返回按钮)及一个ProgressBar进度条部件。如图示将控件属性修改:将“服务器地址”Label后的LineEdit的objectName属性改为“ServerLineEdit”,其text属性改为一个奇趣的FTP网站地址,.将“用户名”label后的LineEdit的objectName属性改为“userLineEdit”,其text属性改为空,将其toolTip属性改为“默认用户名请使用:空,此时密码任意。”将“密码”label后的LineEdit的objectName属性改为“passWdLineEdit”,其text属性改为空,将其echoMode属性改为“ParentButton”。将“登陆”按钮的ibjectName属性改为“loadButton”。将“返回上一级目录”按钮的objectName属性改为“ParentButton”。将“下载”按钮的objectName属性改为“downButton”。图3.2系统界面设计3.2.2登陆验证功能设计这个事件是用来检查启动以及登陆FTP服务的状态,并把连接迅速显示在状态条上,由于QT槽函数是实时传输的,类似于C++的message,因为状态条的更新也是非常及时的,SlotLoginClient::slotLogin(){ QStringserverAddress=LineEditServer->text(); If(serverAddress.isEmpty()) { QMessageBox::warning(this,tr(“errot”),tr(“PLEASEinputserveraddress!”)); Return;}QStringuseName=LineEditUser->text();If(username.isEmpty()){ QMessageBox::warning(this,tr(“error”),tr(“pleaseinputusername!”));Return;}Qstringpassword=LineEditPssword->text();ftpClient=newQFtp();ftpClient->connectToHost(serverAddress);connect(ftpClient,SIGNAL(stateChanged(int)),this,SLOT(slotStateChange(int)));connect(ftpClien,SIGNAL(done(bool)),this,SLOT(slotDone(bool)));ftpClient->login(username,password);curStatus=LOGIN;}第1行到13行进行输入数据的获取和校验第14行创建一个QFtp对象。第15行通过connectToHost()方法连接服务器端,第16、17行连接信号与槽,done(boolerror)信号在最后一条命令处理完毕后发出.参数error提示是否有错误发生。如果为true,表示有错误发生没错误信息可以通过errorSting()方法得到。stateChanged(intstate)信号在连接状态发生变化时发出,参数state表示新的连接状态,可以使以下一个值。QFtp::Unconnected;表示主机未连接QFtp::HostLookup;表示正在查询主机。QFtp::Connecting;表正在尝试连接主机。QFtp::Connected;表示已成功连接主机。QFtp::Closing;表示正在断开(断开后的状态时Unconnected)。第18行以输入的用户名和密码登陆服务器。第19行设置当前的状态时登陆状态。这里只判断QFtp::LoggedeIn状态,如果已经成功登陆,则能“上传”和“下载”按钮。具体代码如下:VoidFtpClient::slotStateChanged(intstate){ If(state==QFtp::LoggedeIn) { PushButtonPut->setEnabeled(true);}}slotPut*()是创出按函数,根据用户名输入的文件名上传文件,QFtpdeput()方法实现文件的上传。Put()方法的函数原型如下:intput(QIODevice*dev,constQString*file,TransferTypetype=Binary)参数dev是一个QIODevice指针,在这里创建一个QFile对象,file参数指定文件名,type参数指定传输类型,可以使binary和ascii,默认采用二进制binary方式VoidFtpClient::slotPut(){ Boolok; QStringfilename=QInputFialogLLgetText(this,tr(“putfile”)),tr(“PLEASEINPUTFILENAME:”),QLineEdit::Normal,QString(),&ok); If(ok&&!fileName.isEmpty()){ QFile*remoteFile=newQFile(fileName); ftpClient->put(remoteFileName,fileName);} curStatus=PUT;}SlotGet()是下载方法,QFtpdget()方法实现文件的下载。Get()方法的原型如下:Intget(constQString&file,QIODevice*dev=0,TransferTypetype=Binary)参数file指定保存在本地的文件名,dev为一个QIODevice指针,这里是一个QFile对象指针,type指定传输类型。VoidFtpClient::slotGet(){ Boolok;QStringfilename=QInputDialog::getText(this,tr(“getfile”;)),tr(“Pleaseinputfilename:”),QLineEdit::Normal,QString(),&ok);If(ok&&!fileName.isEmpty()){ localFile=newQFile(fileName); localFile->open(QIODevice::WriteOnly); ftpClient->get(fileName,localFile);}

curStatus=GET;}slotDone()方法为相应done()信号的槽函数。具体代码如下:voidFtpClient::slotDone(boolerror){ If(error){ QMessageBox::warning(this,tr(error),ftpClient->errorString());Return;}If(curStatus==LOGIN){ PushButtonLogin->setEnabel(false); curStatus=None;}If(curStatus==PUT){ QMessageBox::warning(this,str(“succeed”),tr(“Putfilesucceed!”); curStatus=None;}If(curStatus==Get){ QMessageBox::warning(this,tr(“”succeed),tr(“getfilesucceed!”)); curStatus=None;}}以上代码中第1行到15行为处理过程中的错误处理。第6行到10行的作用是如果当前状态为“登陆”状态,则表示登陆成功,将“登陆”按钮编程不可用。第11行到第15行的作用是如果当前状态为“上传状态”,则表示上传成功。第16行到第21行的作用是如果当前状态为“下载状态”,则表示下载成功。本段代码主要用来检测QFtp类现在的状态,侦测文件是否下载完毕。VoidFtp::ftpCommandFinished(int,boolerror) //定义连接结束{ QDebug()<<”ftpCommandFinished”;#ifndefQT_NO_CURSOR setCursor(QT::ArrowCursor);#endif If(ftp->currentCommand()==QFtp::ConnerctToHost) { If(error) { qDebug()<<”1”; QMessageBox::information(this,tr(“ftp”),tr(“不能打开FTP服务器at%1请检验FTP服务器的地址是否正确。”).arg(ui->serverLineEdit->text())); connectOrDisconnect(); return;}qDevyg()<<”2”;ui->statusLabel->setText(tr(“正在登陆到%1.”).arg(ui->serverLubeEdut->text()));ui->downButton->setDefault(ture);ui->loadButton->setEnabled(ture);return} qDebug()<<”middle”;if(ftp->currentCommand()==QFtp::Login) ftp->list();if(ftp->currentCommand()==QFtp::get){ If(error) {Ui->statusLabel->setText(tr(“取消下of%l.”).arg(file->fileName())); File->close(); File->remove();} //如果错误取消下载Else{ Ui->statusLabel->setText(tr(“下载到当前目录%l”).arg(file->fileName())); File->close();} //正确下载到当前目录}Deletefile;enbleDownloadButton();if(ftp->currentCommand()==QFtp::List){ If(isDirector.isEmpty()) { Ui->treeWidget->addTopLevelItem(newQTreeWidgetItem(QStringList()<<tr(“empty”))); Ui->treeWidget->setEnabled(false);}}}3.2.3文件检索浏览设计CDtoParent()主要实现返回上一层文件系统,进行对上一层文件系统的浏览以及检索VoidFtp::cdToParent(){ qDebug()<<”cdToParent”; ui->treeWidget->clear(); //当返回父目录时,把当前列表内容清空 isDirectory.clear(); currentPath=currentPath.left(currentPath.lastIndexOf(“/”)) if(currentPath.isEmpty()) { Ui->parentButton->setEnabled(false); ftp->cd(“/”);} Else ftp->cd(currentPath); ftp->list();//如果当前路径内容为空,则返回上层,否则显示当前路径内容。}3.2.4下载功能设计实现下载功能源码如下:VoidFtp::downloadFile(){ qDebug()<<”downloadFile”; QStringfileName=ui->treeWidget->currentItem()->text(0); If(QFile::exists(fileName)) { QMessageBox::information(this,tr(“FTP”),tr(“therealreadyexitstsafilecalled%1inthecurrentdirectoru”).arg(fileName));//检查FTP服务器、用户名密码是否正确 Return:}File=newQFile(fileName);{ QMessageBox::information(this,tr(“FTP”),tr(“Unalbetosavethefile%1:%2.”).arg(fileName).arg(file->errorString())); Deletefile; Return;}ftp->get(ui->treeWidget->currentItem()->text(0),file);ui->statusLabel->setText(tr(“正在下载%1”));ui->downButton->setEnabled(false);}3.2.5上传功能设计实现功能代码如下voidFtp::uploadFile(){QStringlocalFile=QFileDialog::getOpenFileName(0,tr("uploadfiledialog"));//打开本地文件夹if(localFile.isNull())return;QFile*file=newQFile(localFile);fileList->clear();progressDialog->setLabelText(tr("Uploading%1...").arg(localFile));QFileInfofi(localFile.toUtf8());ftp->put(file,fi.fileName());progressDialog->show();isDirectory.clear();ftp->list();3.2.6进度条显示功能设计在此,将进度条的槽函数与下载的信号进行连接之后,进度条会根据欲下载数据的传输量同步更新,该链接函数如下:Connect(ftp,SIGNAL(listInfo(QUrlInfo)),this,SLOT(addToList(QUrlInfo))); //根据传输量a来更新进度条的状态VoidftpClient::updateTransFerProgress(qint64readBytes,qint64totalBytes) //根据数据的传输状态来更新的更新进度条槽方法{ Ui->progressBar->setMaxinum(totalBytes); //设置进度条的最大值 Ui->progressBar->setValue(readBytes); //设置进度条的当前值}3.3关键技术简介3.3.1QT介绍Qt是什么?Qt是一个用于桌面系统和嵌入式开发的跨平台应用程序框架。它包括一个直观的API和一个丰富的类库,以及用于GUI开发和国际化的集成工具,另外它支持Java和C++开发。利用它,我们无须重新编写源代码,便可以构建运行在不同桌面操作系统和嵌入式设备上的软件应用程序。借助Qt,我们可以更快速地构建先进的用户界面:它不仅提供了丰富的标准widgets库,动态布局引擎等GUI功能,还通过集成OpenGL与OpenGLES提供了先进的3D可视化支持,此外,它还具有强大的图形画布和Widgets样式表,使我们得以使用变焦、旋转和人机互动功能构建先进的用户界面,并且能用寥寥几行代码便可快速定制自己的用户界面。QT是Trolltech公司的一款图形开发产品,它采用完全的面向对象技术来进行图形应用的设计,允许真正的组件编程,Qt是一个全面的C++应用程序开发框架,它包含一个类库,和用于跨平台开发以及国际化的工具,可以开发高性能跨平台客户端,以及服务端的应用程序。QT的语言特性。Qt类库是一个拥有超过400个C++类,同时不断扩展的库。它封装了用于端到端应用程序开发所需要的所有基础结构。优秀的Qt应用程序接口包括成熟的对象模型,内容丰富的集合类,图形用户界面编程与布局设计功能,数据库编程,网络,XML,国际化,Opengl集成等等。Qt语言家是一套用来消除国际化工作流程中所带来障碍的工具。使用QT语言家,开发小组可把应用程序的翻译转换外包给非技术性翻译人员,从而可增大精确度,大大加快本地化处理过程。Qt助手是一个完全可自定义,重新分配的帮助文件或文档浏览器,可与基于Qt的应用程序运行。使用Qt助手,开发小组同样能够很大程度上加快文档的处理过程。使用QT语言编程的优点支持平台广泛QT应用程序接口与工具兼容于所有支持平台,让开发员们掌握一个应用接口,便可执行与平台非相关的应用开发与配置,其支持的平台有:QT/WINDOWS(WINDOWSXP.2000.NT4,ME/98,WIN7等),QT/MAC(MACOSX)、QT/X11(LINNX,SOLARIS\HP-UX,IRIX,AIX)等。2.封装多QT对不同平台的专门API进行了专门的封装(文件处理、网络等)。3.面向对象QT具有模块设计和注重软件构件或元素的可重用性的特点。4.构件支持QT提供信号(signal)和槽(slot)概念,这是一种类型安全的方法,它允许回调,并支持对象之间在彼此不知道对方信息的情况下进行合作,这就使得QT非常适合于真正的构件编程。5.友好的联机帮助QT提供了大量的联机参考文档,有超文本HTML方式,也有UNIX帮助手册和补充说明,并且对于初学者,其中的指南将一步步介绍如何进行QT编程。6.便利性由于QT是一种跨平台的GUI工具包,它对编程者隐藏了在处理不同系统时潜在的问题,QT定义了一些类来隐藏在不同操作系统上不同处理方式的系统问题。7.用户自定义使用其他的一些工具包经常会遇到这样的一种情况,没有真正适合需求的组件,生成自定义组件对于用户来说就是一个黑匣子,而在QT中生成用户自定义的组件非常简单,并且易于修改组件的行为。8.国际化QT为本地化应用提供了完全的支持,所有用户界面文本都可以基于消息翻译表被翻译成各国语言,QT还支持双自己16BIT国际字符标准。9.丰富的API函数QT为专业应用提供了大量的函数,在QT的API中包含大约250个C++类,大多数类都是GUI专有的。10.可用户化外观QT支持主题,基于QT的应用程序能够在WINDOWS外观,MOTIF外观,以及其他一些用户化主题之间切换。11.完整的一套组件工具QT编程的基本模块称之为组件,组件式用户界面的组成部分,QT含有用来创建外观的用户界面所需要的所有组件。QT/Embedded介绍。QT/Embedded为带有轻量级窗口系统的嵌入式设备提供了标准的API。QT/Embedded面向对象的设计思想,使得它能抑制向前支持鼠标、键盘、图形加速卡等附加设备。通过使用QT/Embedded,开发者可以感受到QT/X11、QT/WINDOWS和QT/MAC等不同的版本下使用相同的API编程带来的3.3.2FTP通信协议文件传输协议(英文:FileTransferProtocol,简称为FTp)是用于在网络上进行文件传输的一套标准协议,它属于网络传输协议的应用层。FTP是一个8位的客户端-服务端协议,能操作任何类型的文件而不需要进一步处理,就像MIME或Unicode一样。但是,FTP有着极高的延时,这意味着,从开始请求到第一次接受需要数据之间的时间会非常长;并且不时的必须执行一些冗长的登录进程。FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器端之间传输数据流,而端口21用于传输控制流,并且是命令通向FTP服务器的进口。当数据通过数据流传输时,控制流处于空闲状态。而当控制流,空闲很长时间后,客户端的防火墙会将其会话置为超时,这样当大量数据通过防火墙时,会产生一些问题。此时,虽然文件可以成功的传输,但因为控制会话,会被防火墙断开;传输会产生一些错误。FTP通信协议的作用:(1)促进文件的共享(计算机程序或数据)(2)支持间接或者隐式的使用远程计算机(3)向用户屏蔽不同职级中各种文件存储系统(Filesystem)的细节(4)可靠和高效的传输数据FTP通信协议的特点:密码和文件内容都使用明文传输,可能产生不希望发生的窃听事件,因为必须开放一个随机的端口以创建连接,当防火墙存在时,客户端很难过滤于主动模式下的FTP流量,这个问题,通过使用被动模式的FTP,得到了很大解决。服务器可能会被告知连接一个第三方计算机的保留端口,此方式在需要传输文件数量很多的小文件时,性能不好。FTP通信协议虽然可以被终端用户直接使用,但是它是设计成被FTP客户端程序所控制的。运行FTP服务的许多站点都开放匿名服务,在这种设置下,用户不需要账号就可以登录服务器,默认情况下,匿名用户的用户名是“anonymous”,这个账号不需要密码,虽然通常要求输入用户的邮件地址作为默认密码,但这只是一些细节或者此邮件地址根本不能被确定,而是依赖于FTP服务器的配置情况。FTP的使用。FTP有两种使用模式:主动模式和被动模式。主动模式要求客户端和服务器端同时打开并且坚挺一个端口以创建连接。在这种情况下,客户端由于安装了防火墙会产生一些问题。所以,创立了被动模式。一个主动模式的FTP连接创建要遵循以下步骤:客户端打开一个随机的端口(端口号大于1024,在这里称之为x),同时一个FTP进程连接至服务器的21号命令端口。此时,该TCP连接的来源地端口为客户端指定的随机端口x,目的端口(远程端口)为服务器上的21号端口。客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器21号命令端口),此命令告诉服务器客户端正在监听的端口号并且自己已准备好从此端口接受数据。这个端口就是我们所知的数据端口。服务器打开20号源端口号并且创建和客户端数据端口的连接。此时,来源地的端口为20,远程数据(目的地)端口为(x+1)。客户端通过本地的数据端口创建一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器它已经创建好了一个连接。第4章系统实现4.1QT工程的编译步骤QT程序的编译有两种方法,一种是命令行方式,还有一种是利用QT提供的qmake工具来对程序进行编译。我采用的是qmake工具的编译方法,编译步骤如下:在终端下依次运行如下命令:Qmake–project//用于生成项目文件.pro然后手动在生成的.pro文件里添加QT+=networkQmake //用于生成Makefile文件Make //编译Makefile文件可得到执行文件,前提是程序文件语法没有错误4.2登陆验证功能实现运行结果如下图所示图4.1运行界面演示图1如果没有输入FTP服务器地址,点击登录时会给出错误提示,如图:图4.2运行界面演示图2在登陆.tw在用户名和密码框中输入用户名密码点击登陆,连接到ftp服务器,结果如图图4.3运行界面演示图34.3下载功能实现选中所要下载的文件,点击“下载”,进度条读取到100%即下载完成,如下图4.4运行界面演示图44.4上传功能实现选中所要上传的文件,点击“上传”,进度条读取到100%即上传完成,但是由于我们使用的用户名是anonymous匿名用户,出于安全性考虑,大部分FTP服务器并不开启anonymous用户的上传权限。图4.5运行界面演示图5第5章系统构建与移植在ARM平台上移植linux操作系统已经成为实现设备小型化、智能化的一个重要元素,这部分将介绍把在LINUX系统中开发出的软件移植到arm2440板上。大体过程为:建立嵌入式Linux交叉开发环境,移植BootLoader引导程序,配置、编译、移植Linux内核,制作文件系统并对文件系统进行移植到开发板。我们可以根据内核所支持的文件系统类型制作文件系统本论文选择制作yaffs文件系统并移植。5.1建立交叉编译环境构建交叉编译环境有很多个版本的交叉编译器可供选择如2.95.3、3.3.2、4.3.2等等,最终选用了4.3.2版编译器编译内核而使用的3.3.2编译的U-Boot,因为很多商用软件都是在该环境下编译的,采用其它版本编译工具有可能编译不通会出现错误将cross-4.3.2-eabi.tar.bz2解压并安装到/usr/local/usr/arm/目录下。命令如下:#tar-jxvfcross-4.3.2-eabi.tar.bz2在/etc/profile中修改PATH环境变量添加工具链的路径。执行#vim/etc/profileexportPATH=/usr/local/arm/4.3.2/bin:$PATH如果出现在终端下输入arm-按tab键会出现arm-linux-就表示交叉编译环境搭建成功。5.2H-JTAG烧写U-BOOTU-Boot是德国DENX小组开发的用于多种嵌入式CPU的BootLoader程序是在ppcBoot以及ARMboot的基础上发展而来的,U-Boot不仅支持嵌入式Linux系统的引导它还支持NetBSD、VxWorkS、QNX、RTEMS、ARTOS、LynxOS等嵌入式操作系统。而且支持PowerPC、MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。它的功能也比较强大支持tftp、nfs等多种网络协议U-BOOT目录结构以及内容如图表所示。表5.1U-BOOT目录结构表将下载好的与ARM2440对应的uboot.bin用H-JTAG烧写到ARM2440中,这样就使的ARM2440开发板能够启动了,具体过程如图所示图5.1H-JTAG烧写步骤图1图5.2H-JTAG烧写步骤图2将图示RAM起始地址设置为0X30000000图5.3H-JTAG烧写步骤图3点击PROGRAM,然后读进度条结束显示successful即烧写成功。然后重启开发板DNW终端上会有如下所示图5.4DNW终端示意图5.3内核移植建立交叉编译环境。1.解压内核源码mkdir/opt/studyarmcd/mnt/hgfs/sharetar–jxvflinux-.tar.bz2–C/opt/studyarm2.进入内核目录,修改makefile,并对内核进行默认配置进行修改193ARCH?=armCROSS_COMPILE?=arm-linux-3.修改平台输入时钟找到内核源码arch/arm/mach-s3c2440/mach-smdk2440.c文件在函数staticvoid__initsmdk2440_map_io(void中,修改成s3c24xx_init_clocks(12000000)。4.修改machine名称(可以不改)修改文件arch/arm/mach-s3c2440/mach-smdk2440.c,在文件中找到MACHINE_START(),修改为MACHINE_START(S3C2440,“Study-S3C2440”)。5.修改Nandflash分区信息修改文件kernel.git/arch/arm/plat-s3c24xx/common-smdk.c。第一,修改分区信息:staticstructmtd_partitionsmdk_default_nand_part[]={[0]={.name="bootloader",.offset=0x00000000,.size=0x00030000,},[1]={.name="kernel",.offset=0x00050000,.size=0x00200000,},[2]={.name="root",.offset=0x00250000,.size=0x03dac000,}};第二,再修改s3c2410_platform_nand_smdk_nand_infosmdk_nand_info={….tacls=0,.twrph0=30,.twrph1=0,…};6.LCD参数修改这里用的是NEC3.5英寸屏液晶屏,大小为320x240,需要修改修改文件arch/arm/mach-s3c2440/mach-smdk2440.c。staticstructs3c2410fb_displaysmdk2440_lcd_cfg__initdata={….right_margin=37,.hsync_len=6,.upper_margin=2,.lower_margin=6,.vsync_len=2,};staticstructs3c2410fb_mach_infosmdk2440_fb_info__initdata={….default_display=0.gpccon=0xaa955699,.gpccon_mask=0xffc003cc,.gpcup=0x0000ffff,.gpcup_mask=0xffffffff,.gpdcon=0xaa95aaa1,.gpdcon_mask=0xffc0fff0,.gpdup=0x0000faff,.gpdup_mask=0xffffffff,.lpcsel=0xf82,};7.给内核打yaffs2文件系统的补丁cd/mnt/hgfs/sharetar–zxvf/mnt/hgfs/share/cvs-root.tar.gz–C/opt/studyarmcd/opt/stdudyarm/cvs/yaffs2/./patch-ker.shc/opt/studyarm/linux-/上面命令完成下面三件事情:修改内核fs/Kconfig增加一行:source"fs/yaffs2/Kconfig"修改内核fs/Kconfig增加一行:ojb-$(CONFIG_YAFFS_FS)+=yaffs2/在内核fs/目录下创建yaffs2目录将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;将yaffs2源码目录的Kconfig文件复制到内核fs/yaffs2目录下;将yaffs2源码目录下的*.c*.h文件复制到内核fs/yaffs2目录下.修改S3C2440的机器号由于Bootloader传递给Linux内核的机器号为782,为与Bootloader传递参数一致,修改arch/arm/tools/math-types文件。s3c2440ARCH_S3C2440S3C2440362修改为:s3c2440ARCH_S3C2440S3C2440782另外,还可以不修改内核中的S3C2440机器号,只需修改修改Bootloader传递给内核的参数中的机器号就可以了。在VIVI中菜单中,按s,再按s,输入mach_type,回车,输入362,w,保存配置内核参数。进入Linux-内核主目录,通过以下命令将2410的默认配置文件写到当前目录下的.config。S3C2410的配置和S3C2440差不多,,在这基础上进行修改。makes3c2410_defconfig配置内核模块的功能,有几种方式可以进行界面选择:makemenuconfig(文本选单的配置方式,在有字符终端下才能使用)makexconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用)makeoldconfig(文本配置方式,在原内核配置的基础修改时使用)这里使用makemenuconfig命令。3.[*]Enableloadablemodulesupport>[*]Forcedmoduleloading[*]Moduleunloading4.SystemType>S3C2410Machines>[*]SMDK2410/A9M2410选上其余不选S3C2440Machines>[*]SMDK2440[*]SMDK2440withS3C2440CPUmodule,其余不选其余的Machines下选项全部不选(如2400,2412,2442,2443)5、KernelFeatures>[*]UsetheARMEABItocompilethekernel注:由于所使用的的交叉编译arm-linux-gcc-4.3.2是符合EABI标准交叉编译器,对于浮点运行会预设硬浮点运算FPA(FloatPointArchitecture),而没有FPA的CPU,比如SAMSUNGS3C2410/S3C2440,会使用FPE(FloatPointEmulation即软浮点),这样在速度上就会遇到极大的限制,使用EABI(EmbeddedApplicationBinaryInterface)则可以对此改善处理,ARMEABI有许多革新之处,其中最突出的改进就是FloatPointPerformance,它使用VectorFloatPoint(矢量浮点),因此可以极大提高涉及到浮点运算的程序。6.Bootoptions-noinitrdroot=/dev/mtdblock2init=/linuxrcconsole=ttySAC07.Userspacebinaryformats>[*]KernelsupportforELFbinaries其它的可以全部不选。8.选择支持yaffs2文件系统Filesystem>Miscellaneousfilesystems><*>YAFFS2filesystemsupport[*]LetsYaffsdoitsownECCNativelanguagesupport<*>Codepage437(UnitedStates,Canada)<*>SimplifiedChinesecharset(GB2312)<*>TraditionalChinesecharset(Big5)<*>NLSISO8859-1(Latin1:WesternEuropeanLanguages)<*>NLSUTF-89.DeviceDrivers>Graphicssupport><*>Supportforframebufferdevices>[*]EnablefirmwareEDID[*]EnableVideoModeHandlingHelpers<*>S3C2410LCDframebuffersupportConsoledisplaydriversupport><*>FramebufferConsolesupport[*]Selectcompiled-infonts[*]VGA8x8font[*]VGA8x16font[*]Bootuplogo>[*]StandardblackandwhiteLinuxlogo[*]Standard16-colorLinuxlogo[*]Standard224-colorLinuxlogo在Bootuplogo>选择的那几项,将会在系统启动时在液晶上显示开机logo。编译内核。编译内核需要遵守以下步骤:1.makedepmakedep的意思就是说:如果你使用程序A(比如支持特殊设备),而A需用到B(比如B是A的一个模块/子程序)。而你在做makeconfig的时候将一个设备的驱动由内核支持改为module,或取消支持,这将可能影响到B的一个参数的设置,需重新编译B,重新编译或连接A如果程序数量非常多,你是很难手工完全做好此工作的。makedep实际上读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要编译。所以,你要makedep。makeclean清除一些以前留下的文件,比如以前编译生成的目标文件,这一步必须要进行。否则,即使内核配置改动过,编译内核时还是将原来生成的目标文件进行连接,而不生成改动后的文件。3.makezImageLinux内核有两种映像:一种是非压缩内核,叫Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。zImage是Image经过压缩形成的,所以它的大小比Image小。但为了能使用zImage,必须在它的开头加上解压缩的代码,将zImage解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的,所以一般的嵌入式系统均采用压缩内核的方式。编译完成后,会在内核目录arch/arm/boot/下生成zImage内核映像文件。5.4构建文件系统LINUX文件系统嵌入式Linux中都需要构建根文件系统,构建根文件系统的规则在FHS(FilesystemHierarchyStandard)文档中,下面是根文件系统顶层目录。bin存放所有用户都可以使用的、基本的命令。sbin存放的是基本的系统命令,它们用于启动系统、修复系统等。usr里面存放的是共享、只读的程序和数据。proc这是个空目录,常作为proc文件系统的挂载点。dev该目录存放设备文件和其它特殊文件。etc存放系统配置文件,包括启动文件。lib存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序。boot引导加载程序使用的静态文件home用户主目录,包括供服务账号锁使用的主目录,如FTPmnt用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。opt给主机额外安装软件所摆放的目录。rootroot用户的主目录tmp存放临时文件,通常是空目录。var存放可变的数据。构建根文件系统首先使用用Busybox创建文件系统。在LINUX下解压下载好的Busybox包[root@localhostbusybox]#ttar-xjvfbusybox-1.7.3.tar.bz进入Busybox主目录[root@localhostbusybox]#cdbusybox-1.7.3修改Makefile174行的arch和编译工具头。ARCH?=armCROSS_COMPILE?=/usr/local/arm/3.4.1/bin/arm-linux-执行makemenuconfig按照busybox指导手册对菜单配置文件进行配置。[root@localhostbusybox-1.7.3]#makemenuconfig编译busybox到指定目录Cd /opt/studyarm/busybox-1.13.3

make CONFIG_PREFIX=/opt/studyarm/rootfs install

在rootfs目录下会生成目录bin、sbin、usr和文件linuxrc的内容。建立etc目录下的配置文件1、etc/mdev.conf文件,内容为空。2、拷贝主机etc目录下的passwd、group、shadow文件到rootfs/etc目录下。3、etc/sysconfig目录下新建文件HOSTNAME,内容为”MrFeng”。4、etc/inittab文件:#etc/inittab::sysinit:/etc/init.d/rcS::askfirst:-/bin/sh::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount-a–r5、etc/init.d/rcS文件:#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=Sprevlevel=Numask022exportPATHrunlevelprevlevelecho"muntall"mount-aecho/sbin/mdev>/proc/sys/kernel/hotplugmdev-secho"***********************************************"echo"****************StudyingARM*********************"echo"Kernelversion:linux-"echo"Student:Zhoushenggui"echo"Date:2014.05.15"echo"***********************************************"/bin/hostname-F/etc/sysconfig/HOSTNAME使用以下命令改变rcS的执行权限:Chmod+xrcS6、etc/fstab文件:#device

mount-point

type

option

dumpfsck

orderproc

/proc

proc

defaults0

0none

/tmp

ramfs

defaults

0

0sysfs

/sys

sysfs

defaults0

0mdev

/dev

ramfsdefaults0

07、etc/profile文件:#Ashprofile#vim:syntax=sh#Nocorefilebydefaults#ulimit-S-c0>/dev/null2>&1USER="id-un"LOGNAME=$USERPS1='[\u@\h=W]#'PATH=$PATHHOSTNAME='/bin/hostname'exportUSERLOGNAMEPS1PATH制作根文件系统映像文件使用以下命令安装好yaffs文件系统制作工具:

cd/mnt/hgfs/sharetar–zxvfmkyaffs2image.tgz–C/在/opt/studyarm目录下,使用命令mkyaffs2imagerootfsrootfs.img生成根文件系统映像文件。第6章总结匆匆四年,白马过隙,完成毕业设计,也为大学画上一个完美的句号。三年校内所学理论,尤其是我所学的通信工程专业的理论知识,确实生硬较难,但却又是重要的基础,也未敢放弃。直到在校外杰普科技的实习期间,才真正让我学到了自己感兴趣的东西。这份毕业设计是通过理论研究和平时实践积累所完成的。通过完成毕业设计的这段日子里,使我加深了对QT语言的理解,同时也了解到开发一个应用程序所面对的困难,更大的收获是我面对这些困难,冷静的寻找解决困难的方法,使课程设计达到了预期的要求。在整个设计过程中,从基础阶段到进阶阶段,让我意识到了学习QT是需要方法,从C到C++基础的积累,再到了解QT类库以及qmake的编辑,各种图形界面的时候等等,每一个步骤都是不可或缺的。QT的最大便捷之处在于它的强大的可移植性,这是适应当前电子移动设备应用发展的,根据不同操作系统,可以方便的移植,更加体现了互联网应用宽容的特性,还有功能强大、便于操作的QT工程管理工具qmake,可以使每一个QT工程的界面,代码一览无余的展示,在调试错误上也很方便,这在软件开发中是有巨大意义的。参考文献[1]ArthurG.KDE2/QT编程宝典[M].北京:电子工业出版社,2002.27~30.[2]JasminBlanchette,MarkSummerfiled.C++GUIProgrammingwithQt4,SecondEdition[M].北京:电子工业出版社,2003.60~62.[3]BrianW.Kernigham,DennisM.Ritchie.TheCProgrammingLanguageSecondEdition[M].北京:机械工程出版社,2003.24~27.[4]NeilMatthew,RichardStones.BeginningLinuxProgramming4thEdition[M].NewYork:SpringerPress,2003.77~79.[5]陈金阳,蒋建中,张良胜.FTP协议分析及其客户端程序实现[J].计算机工程与应用,2005,21(2):17~39.[6]科波特(美).Linux设备驱动程序[M].北京:中国电力出版社,2006.66~68.[7]吴珂,卢秉,亮张磊.基于FTP协议客户端软件的实现[J].沈阳航空工业学院学报,2006,4(1):25~29.[8]黄世权.FTP协议分析和安全研究[J].微计算机信息,2008,2(3):21~35.[9]王田苗,魏洪兴.嵌入式系统设计与实例开发[M].北京:清华大学出版社,2008.56~70.55~59.[10]杨潇.基于Qt的富客户端软件设计与实现[D].西安:西安交通大学,2009.[11]詹百灵.C#的FTP客户端软件设计[J].漳州职业技术学院学报,2009,2(1):20~35.[12]谭显强,吴宁,范彩霞.基于S3C2410的LCD驱动系统设计[J].苏州科技学院学报,2009,22(3):70~74.[13]黄维通.面向对象程序设计与QT程序设计入门[M].北京:北京航空航天大学出版社,2010.23~29.[14]周恕义,徐晓亮.Qt构建北京市精品课程平台文件上传系统[J].计算机技术与发展,2011,5(1):7~10.[15]宋冲亚,李爱菊.QT局域网聊天项目制作[J].现代物业(上旬刊),2012,1(1):11~19.致谢历时几个月的毕业设计已经告一段落。在此,我要衷心感谢我的父母,感谢父母在我慢慢求学路上背后的支持,在这路上的艰难困苦,失败挫折,没有父母,我不不会这么轻易的坚强的走过来。感谢母校和学院,给我们在校一年时间的校外实践,让我们提前做好走出校园,走进社会的准备,在实践这个方面,让我们有了毕业后的第一个优势。在本次毕业设计过程中,通过自己不断的探索,努力的学习以及王羽老师,罗成果老师,谢璇老师,高帆老师等各位指导老师的耐心指导和帮助,本毕业设计圆满完成。在毕业设计和论文的撰写过程中,王羽老师为我提出了很多论文写作的可行性建议,提供了大量国内外最新资料来源,王老师热情幽默的感染力令我十分钦佩。谢璇老师的职业规划指导以及职场素质培养的指导,这是在校内学不到的,尤其是谢老师的优秀的交流能力和干练的工作作风,使我受益匪浅。王羽老师和罗成果老师是我在毕业设计技术层面的指导老师,王老师严谨的编程作风始终感染着我,面对每一个细节都要钻研清楚,不放过任何一个盲点,罗老师每天都在释放正能量,教导我编程并非枯燥、乏味、辛苦,每当看到罗老师嘻嘻哈哈的就帮我解决毕业设计中的问题是,收获的绝非仅仅是豁然明朗,更是对编程,对生活的一种积极向上,乐观开朗的情绪。另外,在QT的学习中,很多同学也给了我很大的帮助,大家一起交流,思考,想办法,查资料,一起解决问题,在此,我真的感谢我的这些可爱的同学们。毕业在即,回首这段时间,难忘亦感慨万千,所有的一切历历在目,感谢母校,感谢各位指导老师和同学。附录1外文资料翻译基于QT的LINUX网络设计作者:RaymondMcLeod,Jr·GeorgeSchellQFtp类的参考说明(QT网络模块支持)。该qftp类提供了FTP协议的客户端的实现。#include<QFtp>QFtp类继承了QObjectde的所有成员名,包括Qt3支持的成员。公共类型列举enum

Command

{None,SetTransferMode,SetProxy,ConnectToHost,...,RawCommand}enum

Error

{NoError,HostNotFound,ConnectionRefused,NotConnected,UnknownError}enum

State

{Unconnected,HostLookup,Connecting,Connected,LoggedIn,Closing}enum

TransferMode

{Passive,Active}enum

TransferType

{Binary,Ascii}公共函数列举QFtp

(QObject*

parent

=0)virtual

~QFtp

()qint64

bytesAvailable

()constint

cd

(constQString&

dir

)void

clearPendingCommands

()int

close

()int

connectToHost

(constQString&

host,quint16

port

=21)Command

currentCommand

()constQIODevice*

currentDevice

()constint

currentId

()constError

error

()constQString

errorString

()constint

get

(constQString

温馨提示

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

评论

0/150

提交评论