毕业设计(论文)-一个Windows下基于电话线路的数据通信程序的设计与实现.doc_第1页
毕业设计(论文)-一个Windows下基于电话线路的数据通信程序的设计与实现.doc_第2页
毕业设计(论文)-一个Windows下基于电话线路的数据通信程序的设计与实现.doc_第3页
毕业设计(论文)-一个Windows下基于电话线路的数据通信程序的设计与实现.doc_第4页
毕业设计(论文)-一个Windows下基于电话线路的数据通信程序的设计与实现.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

一个一个WindowsWindows下基于电话线路的数据通信程序下基于电话线路的数据通信程序的设计与实现的设计与实现摘摘要要电话网络是最大的通信网络,但是我们通常只是用来进行语音传输。为了更好的发掘电话网络的潜力,以及解决一些在没有互联网地区的数据的传输需要,开发一种可以通过电话线路进行数据传输的软件是很有必要的。微软的电话应用程序接口(TAPI)是一种标准的应用程序接口(API),使得个人电脑能够通过运行微软的Windows系统来使用电话服务。TAPI里面封装了所有的对MODEM进行操作的AT指令,从而我们只需要调用TAPI的函数而不需要知道底层的具体操作就可以执行一个呼叫和应答一个呼叫,以及其他的线路操作,从而快速开发出一个基于Windows平台的通过电话线路进行数据传输的程序。本文介绍了开发次程序需要的理论基础包括Windows平台软件开发的基础、TAPI的概述、TAPI的基本概念。详细的介绍了软件开发的的思路和流程,阐述了整个呼叫的生命周期内的线路上所产生的状态消息,以及依据这些消息而应该进行的具体操作。根据软件开发的思路的指导以及整个线路消息为程序开发的脉络,本文最后介绍了一个可以在Windows下面拨打对方的电话号码,当双方连通后可以通过电话线路进行数据传输的程序的编码开发过程并且最后程序进行了测试。关键词:关键词:Windows;电话线路;数据通信;TAPITheDesignandImplementationofaTelephone-LineBasedCommunicationPrograminWindowsOperatingSystemAbstractThetelephonynetworkisthelargestcommunicationsnetworkanditsgenerallyusedforvoicetransmission.TobetterutilizetheadvantagesofthetelephonynetworkandmeettheneedofdatatransmissioninplaceswhereInternetisinaccessibleitisdefinitelynecessarytodevelopasoftwarewhichcouldtransmitdataoverexistingtelephonelines.MicrosoftstelephoneApplicationProgramInterface(TAPI)astandardapplicationprograminterface(API)canhelppersonalcomputersrunningMicrosoftsWindowssystemtotakeuseoftelephoneservices.TAPIhasencapsulatedallATcommandsODEMoperationwhichwillonlyneeduserstocalltheTAPIfunctiontoinitiateandansweracallratherthantoknowthedetailoperationontheimplementationnorotheroperationsonthelines.ThiswouldlargelyhelptodevelopaprogramthroughtelephonelinesfordatatransmissiononaWindows-basedplat.ThepaperfirstlydescribesthetheoreticalbasisforthedevelopmentofsubprogramsincludingthesoftwaredevelopmentbasisonWindowsplatTAPIoverviewanditsbasicconcepts.Thepaperthendescribesthedetailideasandprocessesonthesoftwareimplementation.Thepaperalsorepresentsanentirecalllifecyclewithitspossiblestatemessagesandthecorrespondingoperationsneeded.FinallyontheonebelowintheWindowsCalleachothersphonenumberswhenthetwosidescanconnectthroughtelephonelinesfordatatransmissionproceduresforthedevelopmentofthecodingprocessandinthefinalprocessofthetest.Keywords:WindowstelephonelinesdataCommunicationsTAPI目目录录论文总页数:17页1前言.12设计开发的基础理论.12.1WINDOWSSDK简介.12.2WINDOWS程序的基本结构.12.2.1概述.12.2.2消息处理函数.12.2.3窗口的建立.22.2.4消息循环.22.3MODEM的控制.32.4TAPI通信编程.32.4.1TAPI的含义.32.4.2TAPI的体系结构.42.5TAPI的基本概念.43程序设计思想与流程.63.1使用TAPI开发的基本思路.63.2各功能模块的设计.83.2.1TAPI的配置阶段.83.2.2TAPI的连接阶段.83.2.3数据传送阶段.93.2.4关闭连接阶段.104编码实现.104.1程序主类的的定义.104.2线路操作的实现.114.3呼叫的发起和应答的实现.124.4数据操作的实现.135软件测试.14结论.14参考文献.14致谢.16声明.17第1页共17页11前言前言当今计算机网络十分普及,但仍有不少地区无法安装网络,相比之下电话线网比internet发达很多,我们用的宽带也是在电话线网的基础上建立起来的。因此在网络不发达地区,在无网络的情况下能用电话线进行数据通讯就十分有意义了。用电话线进行数据通讯不仅可以方便的接收和发送数据,比起internet数据通讯,安全性也是非常可靠的。MODEM曾经被广泛用于拨号上网,通过几年的迅速发展,已经取得了极大的成功。随着技术的发展和认识的提高,人们拓宽了MODEM的应用领域,把它用于远程数据通信。MODEM能从计算机接收串行数据,通过PSTN电话网传送给另一端的MODEM,所以使用MODEM可以实现两台远程计算机的互联,就像组成一个广域网络系统一样。当两台计算机通过MODEM拨号连接成功后,它们之间的通信就像串行通信一样方便。22设计开发的基础理论设计开发的基础理论2.12.1WindowsSDK简介简介SDK即softwaredevelopekit(软件开发工具包),它包含了进行Windows软件开发的文档和API函数的输入库、头文件(因为API在动态链接库中,这些动态链接库是系统的组成部分因此不用再提供,而输入库和头文件则必须,这样才能在你的程序中使用API函数)。早期SDK是一个单独发放的包,现在在VisualC+和其他一些开发环境中已经包含了它。SDK编程就是直接调用Windows的API进行编程,API由上千个API函数组成。2.22.2WindowsWindows程序的基本结构程序的基本结构2.2.12.2.1概述概述Windows程序具有相对固定的结构,对编写者而言,不需要书写整个过程,大部分过程由系统完成。程序中只要按一定的格式填写系统留给客户的那一小部分。所需要完成的有:窗口类的定义、窗口的建立、消息函数的书写、消息循环。2.2.22.2.2消息处理函数消息处理函数Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。每个窗口都有一个消息处理函数。在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,就会去调用这个消息处理函数。通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,其他的,则送回到系统的缺省消息处理函数中去。第2页共17页消息处理函数的原型如下:参数:窗口句柄,消息,消息参数,消息参数LRESULTCALLBACKWndProc(HWNDhwndUINTmessageWPARAMwParamLPARAMlParam)处理感兴趣的消息switch(message)case.case.其他消息交给由系统提供的缺省处理函数return:DefWindowProc(hwndmessagewParamlParam)2.2.32.2.3窗口的建立窗口的建立客户需要自己建立窗口,建立后会得到系统返回的窗口句柄(HWND)后继的针对窗口的操作都针对句柄进行。1.注册窗口类建立窗口前,需要制定好这个窗口的相关属性,最主要的就是将自己定义的消息处理函数与窗口关联,其他的属性还包括:菜单、图标等等。这个属性指定步骤是通过指定窗口类来完成的。对于自己建立的窗口,这个窗口类需要自己制定,也即自己填充一个WNDCLASS结构然后向系统注册。对于一些特殊窗口,如按钮等控件,他们的行为是系统制定好了的,所以不需要自己注册,直接使用对应的“窗口类”名称就行了。2.建立窗口建立窗口时,注册的窗口类名称作为参数传入。这样,当有针对该窗口的消息时,将调用“窗口类”中指定的消息处理函数,在其中得到处理。2.2.42.2.4消息循环消息循环系统会将针对这个程序的消息依次放到程序的“消息队列”中,由程序自己依次取出消息,在分发到对应的窗口中去。因此,建立窗口后,将进入一个循环。在循环中,取出消息、派发消息,循环往复,直到取得的消息是退出消第3页共17页息。循环退出后,程序即结束。2.32.3MODEMMODEM的控制的控制目前模拟电话线路被广泛用于数据传输。调制解调器(MODEM)被用来实现数字信号到模拟信号和模拟信号到数字信号的相互转换。MODEM通过PSTN(publicswitchedtelephonenetwork公用交换式电话网)来传输数据。目前计算机控制调制解调器有两种方法:一种方法是向MODEM发送AT指令,另一种方法是使用TAPI(telephonyapplicationprogramming)即电话应用程序接口。AT指令集是由Hays公司首先推出的用于控制自己开发的smartmodem系列产品的命令集合,AT命令集推出后得到广泛的应用,很快其它生产调制解调器的公司也都使用与Hays公司AT指令集兼容的AT指令集。开发者利用串行通信API再加上基本的Hays兼容的AT命令,就可以实现对MODEM的控制。但这种方法在windows中用起来很不方便。原因如下:许多MODEM制造商已向标准的AT指令集中添加了许多变种,这就使应用程序与市售的所有MODEM保持完全兼容很困难。而Windows维护了一个数据库,其中包含了商用调制解调器以及每个MODEM支持的AT命令集变种,使用TAPI则可以访问该数据库,所以使用标准TAPI函数生成呼叫和控制MODEM的应用程序不需要知道AT命令集的详细内容。2.42.4TAPITAPI通信编程通信编程2.4.12.4.1TAPITAPI的含义的含义计算机电话集成(ComputerTelephonyIntegration缩写CTI)是计算机技术和电信技术相结合的产物。电子通信行业配备了各种各样的硬件系统,仅仅收集这些系统的标准、文档和接口规范就是很复杂的任务,要设计一个考虑所有情况的任务就更加困难。为了减轻开发者的负担,Microsoft公司和Intel公司联合起来创建了WindowsTelephonyAPI(TAPI)给应用程序编程者提供一个接口,并且允许应用程序无需改变就可以适应多种多样的电信系统。TAPI是Microsoft公司的Windows开放式服务结构中的一部分,它包括两个接口:开发人员使用的应用程序接口和用于连接某种电话网络的接口。TAPI为通信应用程序提供控制通信的功能,包括数据、传真、语音,以及处理计算机与电话网之间的信号灯。TAPI服务为通信应用程序提供了一种与设备无关的方法,避免了使用AT指令直接访问硬件可能造成的冲突,并且让应用程序可以与包括数字综合服务网(IntergratedServicesDigitalNetwork)在内的各种通信网络通信;同时还提供了访问通信端口和设备的通用机制。这样,多个应用程序就可以共享这些设备,TAPI管理对各个设备的访问,让通用程序协调使用这些设备。TAPI第4页共17页的设计本身是可以扩展的,从而可以满足未来通信网络多方面的需求。2.4.22.4.2TAPITAPI的体系结构的体系结构图1是TAPI体系结构示意图。作为中间层的TAPIDLL提供对服务提供者的管理,并在服务提供者与应用程序之间进行信息传递。TAPI可以保证多个服务者和应用程序能够同时存在,并且不会发生相互冲突。图1TAPI的体系结构在底层将TAPI和实际的电话硬件连接是TAPI服务提供者(TAPIServiceProvider缩写为TSP).TSP一般都由硬件生产厂商提供。2.52.5TAPITAPI的基本概念的基本概念(1)设备ID设备ID是从零开始按顺序分配给每个设备的ID;也就是说,如果安装了4个线路设备,这些线路没备的设备ID相应为0、1、2、3。(2)长度变化的数据结构TAPI使用的大多数的复杂数据结构是变长的数据结构。这些结构的组织如图二所示。最前面l的3个域分别是dwTotalsizedwNeededsize和dwUsedSize。在这三个域后面是固定长度的域,对每个给定的结构类型固定长度的域都具有同样的长度。一般而言,长度范围从0到300个字节或者更长字节的结构。存储在结构中的可变部分的信息总是通过相对于结构定长部分的一个偏移量来引用,以字节为单位的偏移量指出变长数据的起点的位置。信息量大小就是变长数据所占用的字节数。其大小包括字符串末尾的空字符。这些结构的内存总是由应用程序分配。但是数据结构需要多大的内存空间,应用程序并不总是知道,这就是设置前三个域的原因。将结构传送给TAPI之前,应用程序可使用缓冲区的大小填充dwTotalsize域。TAPI首先证实该结构有足够大空间容纳其定长部分,然后填充定长域,接着填入变长项。TAPI填入变长项直到没有空间为止。最后TAPI用为获得所有数据所需的空间量来填充dwNeededsize域,而dwUsedsize域用TAPI实际使用的空间量来填充。第5页共17页当应用程序得到该结构时,它首先应该检查dwNeededsize助和dwUsedSize域。如果两者相等,TAPI就能够找出用于所有变长数据的控件。如果dwusedsize小于dwNeededsize,应用程序可以检查相应的偏移量和域大小看是否有需要的变长数据,如果这些数据域都被设置为零,那么应用程序必须分配一个更大的缓冲区并且重试上述过程。图2TAPI所用到的数据结构(3)逻辑线路设备线路(Line)指的是物理电话线路。线的终端位置一般称为站(station)。线路设备(Linedevice)是任何连接计算机到电话线或者线路的物理设备,如调制解调器或ISDN卡等。线路设备不必位于应用程序运行的计算机上。逻辑线路设备(logicallinedevice)代表一根电话线。逻辑线路设备的性能取决于它所代表的实际电话线的性能。典型的电话线路称为POTS(PlainoldTelephoneservice普通老式电话服务)。在Windows中,POTS线通过单一逻辑线路设备表示。一些数字电话线(例如ISDN)包含了多个“信道”或者信息通路,可用来同时传送不同类型的数据,这些多信道数字线路通常由多逻辑线路设备表示,一个逻辑线路设备代表一个信道。逻辑电话(Logicalphone)表示电话。一部典型的电话包括叉簧和转换器组成。叉簧是可以将电话与线路连接或挂断的开关,转换器是一种由扬声器和话筒组成的设备,话筒可以将声能转换为电能,或将电能转换为声能。(4)地址第6页共17页地址(Address)是字母、数字和控制字符组成的字符串,它们定义到电话、调制解调器或计算机的路径。线路、电话和地址是静态的,他们有一定程度的持久性,线路或与计算机连接的电话不经常改变,线路的电话号码也一样。(5)呼叫呼叫(call)是当两个线路设备由电话网络连接在一起时存在的一种交互状态。呼叫方(callingparty)是发起呼叫的一方,而被呼叫方(calledparty)则是应答呼叫的一方。对呼叫可以进行连接、置于保持状态以及传送、召开会议、暂停、恢复等操作。每个呼叫在期生存期都会经历许多状态。在呼叫改变状态时,Windows会通知控制应用程序。呼叫状态包括DAILTONE、RINGING和CONNECTED等。在这几个状态中,CONNECTED状态尤为重要,因为一旦呼叫转换到这种状态,数据就可以通过线路发送出去,到达信宿方。已经拆接的呼叫和还没有开始的呼叫所处的状态都是IDLE。33程序设计思想与流程程序设计思想与流程3.13.1使用使用TAPITAPI开发的基本思路开发的基本思路使用TAPI能够比较方便地发出一个呼叫和应答一个呼叫,它对呼叫的操作简单方便,给开发者带来了很大的方便。总的来说使用TAPI开发MODEM呼叫控制通信程序流程如下所示:(1)初始化TAPI:通过调用linelnitialize()函数来完成。TAPI通过调用这两个函数来加载Tapi32.dll和有关的电话设备驱动程序,并且指定检测线路设备的状态和事件的回调函数。(2)协商TAPI版本:IineNegotiateAPIVersion()函数将找出对应于用户的应用程序及线路设备服务者通用的TAPI的最高版本。(3)获取线路设备的性能:应用程序通过调用lineGetDevCaps()函数来确定所使用的TAPI版本提供的线路设备能力。(4)打开线路设备:应用程序调用lineOpen()函数打开一条线路设备并返回一个线路设备的句柄,这个句柄用于完成以后对这个设备的各种操作。(5)转换电话号码:使用lineTranslateAddress()将要拨打的号码转换成可以直接在计算机上拨打的号码格式。(6)开始呼叫或是应答:应用程序调用lineMakeCall()函数进行呼叫,调用完成后它将返回带有拥有者特权的呼叫句柄,此句柄可用在对该次呼叫所进行的进一步操作。应用程序通过调用lineAnswer()函数来自动应答呼叫。(7)挂断呼叫:在呼叫完成后,lineDrop()函数将用来挂断呼叫,但是在上一步中得到的拥有者的呼叫句柄并不会因此释放,因为在呼叫被挂断以后,第7页共17页呼叫的句柄还有可能被用在一些后续的操作中。可以通过lineDeallocate()来释放呼叫句柄。(8)关闭线路设备:应用程序调用lineClose()函数来关闭被lineOpen()函数打开的线路设备,如果一条线路被应用程序打开后始终没有被关闭,那么其它的应用程序将无法访问该线路。(9)结束TAPI的使用:在一切有关TAPI的操作完成之后,调用lineShutdown()函数来终止TAPI的使用,它会隐含地关闭所以打开的线路设备。根据TAPI的开发基本思路整个程序的设计思路流程如图3图3程序流程图第8页共17页3.23.2各功能模块的设计各功能模块的设计3.2.13.2.1TAPITAPI的配置阶段的配置阶段TAPI的置阶段配置阶段包括对线路的配置和对MODEM的配置,只有正确地配置并打开线路设备之后,才能对MODEM进行配置。以下函数完成对TAPI的配置:TAPI类成员函数telephonylnitialize分配支持逻辑线路设备的使用所必须的某些内部资源,并返回应用程序一个TAPI句柄,同时传递了一个回调函数的地址作为参数,此函数处理对整个线路状态进行处理。然后使用TAPI的类成员函数lineNegotiateAPIVersion与Windows协商TAPI版本。TAPI类成员函数mylineGetDevCaps获得有关逻辑线路的性能的信息Windows把这些信息填充到一个名为LINEDEVCAPS的只读结构中,应用程序检查这个结构就可以了解哪些设置是驱动程序所允许的TAPI类成员函数lineOpen打开线路。3.2.23.2.2TAPITAPI的连接阶段的连接阶段TPAI在连接阶段MODEN会产生很多消息,消息的处理TAPI由回调函数进行消息处理,回调函数在初始化TAPI时创建,消息的处理在TAPI的使用过程中是至关重要的。以下是一些主要的消息(1)LINECALLSTATE_IDLE没有呼叫,为空,此时应断接,释放掉占用的资源;(2)LINECALLSTATE_DIALING拨号中,正在拨号。(3)LINECALLSTATE_BUSY线路忙或设备忙,此时应断接,释放掉占用的资源。(4)LINECALLSTATE_SPECIALINFO特别的消息,此时应断接,释放掉占用的资源;(5)LINECALLSTATE_OFFERING应答方已收到呼叫方信号,此时应进行应答,调用lineAnswer函数;(6)LINECALLSTATE_CONNECTED已连接成功,此时可进行数据的传输,但必须先得到MODEM的句柄(7)LINECALLSTATE_DISCONNECTED已断接,此时应释放掉占用的资源。TAPI类成员函数MakeCall被用于发起呼叫,产生呼叫后依次进入图4状态:第9页共17页图4状态流程图新生成的呼叫处于IDLE状态,随后依次进入PROCEDING,OFFERING,CONNECTED和DISCONNECTED最后回到IDLE状态。这些状态都通过在调telephonylnitialize函数初始化TAPIDLL的时候传递的回调函数来处理。3.2.33.2.3数据传送阶段数据传送阶段TAPI并不提供数据传输的函数。因为MODEM通过控制计算机串口来进行通信,所以MODEM的数据通信与串口数据通信的方法一样,采用ReadFile和writeFile函数来接收数据和发送数据。传送数据的时候要用到MODEM的句柄,此时调用TAPI的类成员函数lineGetID得到MODEN的句柄后就可以通过ReadFile和WriteFile函数来进行数据传输。ReadFile与WriteFile有两种模式,一种是等待模式,一种是非等待模式。等待模式下必须完成了所有读写操作函数才会返回,最后一个参数必须为NULL。非等待模式下要先定义一个OVERLAPPED变量,并且作为函数的最后一个参数传递进去。非等待模式下函数会马上返回,OVERLAPPED变量在初始化的时候会调CreateEvent函数产生一个事件,当函数返回后我们调用WaiForSingObject(Event)函数让线程阻塞,当数据传送完以后操作系统会给应用程序发出一消息,当应用程序得到此消息以后程序继续往下运行。一旦呼叫进入CONNECTED数据链路连通状态,则表明连接已经建立。此时第10页共17页我们就可以进行数据传输了,不过在传送数据之前我们要得到MODEN的句柄,此时调用TAPI的类成员函数lineGetID,此函数会把MODEN的名称和句柄保存到一个VARSTRING类型的变量里面。通过次句柄我们就可以利用WriteFile和ReadFile来读写数据了。3.2.43.2.4关闭连接阶段关闭连接阶段当我们数据传送完成后需要退出程序的时候。我们会对线路进行挂断操作,TAPI的类成员函数LineDrop来断开连接,然后调用LineClose来关闭一条打开的线路,同时释放前面阶段操作所用到的一些缓存以及复位一些信号型变量。44编码实现编码实现4.1程序主类的的定义程序主类的的定义为了使程序的结构更为清晰和易于维护和升级,我把程序所要使用的数据结构封装成一个类。类的定义如下:classCTapiLineprotected:HLINEAPPm_hLineAppTPAIDLL的句柄HLINEm_hLine线路的句柄HCALLm_hCall呼叫的句柄intm_nDevID设备号HANDLEm_hLineEvent线路改变事件DWORDm_dwLineMsg线路消息boolm_bConnected是否连接HANDLEm_hEventFromThreadHANDLEm_hLineMsgThreadTAPI事件监听线程boolm_bStopLineEventThreadstaticDWORDWINAPILineEventThread(LPVOIDlpVoid)longm_lEventThreadResultpublic:HANDLEGetHandle(constcharszClassTypelonglError)intPickupIncomingCall()voidGetErrorString(intnErrorchar&szErrText)intMakeOutgoingCall(constcharszAddress)第11页共17页intGetIncomingCall()intClose()intOpen(intnMode=0)CTapiLine()virtualCTapiLine()类里面定义了整个程序运行所需要用到的变量。在进行线路操作时调用TAPI的类成员函数需要同时取得设备和线路的状态,所以我对TAPI的类成员函数进行了封装,使这些操作都模块化。4.2线路操作的实现线路操作的实现线路的操作定义为Open和Close两个类成员函数,里面封装了TAPI的lineInitializeEx(TAPI初始化)、lineNegotiateAPIVersion(版本协调)、lineOpen(打开一条线路)、lineDrop(挂断呼叫)、lineClose(关闭一条线路)四个类成员函数进行线路操作,同时封装了在线路操作时需要用到的设备性能的取得函数lineGetDevCaps(取得设备性能)。intCTapiLine:Open(intnMode)初始化TAPI.lRet=lineInitializeEx(&m_hLineAppNULLNULLCallAnswer&dwNumDevs&dwTAPIVer&stInitParams)m_hLineEvent=stInitParams.Handles.hEvent得到事件的句柄m_nDevID=-1通过循环取得可以传送数据的设备号for(inti=0idwMediaModes&dwMediaMode)free(lpDevCaps)m_nDevID=ibreakfree(lpDevCaps)if(m_nDevID=0)0:lRet第13页共17页intCTapiLine:GetIncomingCall()应答.lRet=lineSetNumRings(m_hLine05)设置响铃次数lRet=lineAnswer(m_hCallNULL0)4.4数据操作的实现数据操作的实现在程序中数据的读取单独创建一个线程,定义了一个回调函数ReadThread封装了WriteFile和ReadFile来实现数据的发送。DWORDWINAPICMyTapiDlg:ReadThread(LPVOIDlpVoid)接收数据OVERLAPPEDovov的初始化设置for(!pcDlg-m_bStopReadThread)ReadFile(pcDlg-m_hSerialHandleszBuff51

温馨提示

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

评论

0/150

提交评论