即时消息系统的设计与实现语音通讯模块的实现毕业论文_第1页
即时消息系统的设计与实现语音通讯模块的实现毕业论文_第2页
即时消息系统的设计与实现语音通讯模块的实现毕业论文_第3页
即时消息系统的设计与实现语音通讯模块的实现毕业论文_第4页
即时消息系统的设计与实现语音通讯模块的实现毕业论文_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

46/46即时消息系统的设计与实现语音通讯模块的实现摘要:3Abstract:3第一章引言41.1论文背景41.2国外研究现状与发展趋势51.2.1研究现状51.2.2发展趋势5第二章关键技术72.1XMPP协议72.1.1XMPP协议简介72.1.2XMPP协议基本网络结构72.1.2选择XMPP协议的理由72.2网络通信协议82.3Socket网络编程92.4音频捕获技术92.5音频回放技术92.6音频采样技术102.7音频压缩/解压技术102.8P2P技术10第三章语音通讯系统的分析113.1语音通讯系统可行性分析113.2语音通讯系统需求分析113.2.1项目总述123.2.2市场需求分析123.2.3用户需求分析123.2.4软件性能要求133.2.5软件功能需求133.3语音通讯系统流程分析143.4语音通讯系统数据流图15第四章语音通讯系统的设计174.1系统结构174.2开发工具174.3流程设计184.4语音通讯系统总体设计194.5语音通讯系统详细设计194.5.1登录模块194.5.2建立连接模块204.5.3音频捕获模块214.5.4音频回放模块23第五章语音通讯系统的实现265.1构建语音通讯系统的用户登录系统265.2连接建立模块的实现265.2.1麦克风相关操作265.2.2建立通信连接285.3音频捕获模块325.3.1确定音频格式325.3.2建立音频捕获对象并为其分配缓冲区325.3.3打开录音设备335.3.4开始录音335.3.5音频压缩并发送给远程主机335.3.6结束录音345.4音频回放模块的实现355.4.1确定音频格式355.4.2建立音频回放对象355.4.3循环接收音频数据355.4.4打开回放设备365.4.5音频解压并回放375.4.6结束回放375.5常用结构体定义与介绍385.5.1WAVEHDR385.5.2WAVEFORMATEX385.6常用winmm.dll方法参数介绍385.6.1waveOutOpen395.6.2waveInOpen395.6.3waveOutWrite395.6.4waveOutPrepareHeader405.6.5waveInAddBuffer405.7本系统的开发难点与解决技巧405.7.1通信连接的建立405.7.2语音捕获、压缩、解压、回放415.7.3音量大小的调节415.7.4委托、回调和异步41结语42参考文献:43致44即时消息系统的设计与实现语音通讯模块的实现永忠西南大学计算机与信息科学学院,400715摘要:本论文主要讨论了语音通讯系统的研究与实现,笔者在探讨即时通讯系统在国外研究现状与发展趋势的基础上,结合当前计算机技术的发展情况,选择使用了Vistudio2005开发环境和当前比较流行的C#编程语言,结合语音捕获和回放相关知识和Socket相关知识开发了此语音通讯系统。本系统主要包括连接建立、音频捕获、音频回放三大模块,实现了用户登录、通信连接建立、音频数据捕获、数据压缩与发送、数据接收与解压、音频数据回放等功能,重点介绍了通信连接建立、音频数据捕获和回放的实现。在实现方法上,主要采用面向对象编程基本思想,利用C#编程语言将系统分为接口类、音频捕获类、音频回放类、音频压缩与解压类和异常处理类,再加一个公用的结构体类进行实现,并采用了现代比较流行的XMPP协议进行消息发送和建立其语音连接,通过Socket技术实现最终音频数据的发送和接收。最后,本论文对基于C#技术的语音通讯系统的开发设计进行了总结和展望。关键字:音频捕获;音频回放;音频数据压缩;XMPP协议;InstantMessagingSystemDesignandImplementationtheimplementationofAudiocommunicationsmoduleLIUYongzhongComputerandinformationsciencecollegeofSouthwestUniversity,Chongqing400715,ChinaAbstract:Thisthesismainlydiscusstheresearchandimplementationofaudiocommunicationsystem.Basedontheresearchanddevelopmenttrendofinstantmessagingathomeandabroad,combinewiththecurrentcomputertechnology,theauthoruseVisualstudio2005developmentenvironment,C#programminglanguage,audiocaptureandplaybacktechnology,aswellastherelevantknowledgeofSocketdeveloptheaudiocommunicationsystem.Thissystemmainlyintroducethreemodules,includingtheconnectionestablishment,audiocapture,andaudioplayback,aswellasthedetailedimplementationoftheuserlogon,theestablishmentofcommunicationlinks,audiodatacapture,datacompressionandtransmission,datareceptionanddecompression,audiodataplaybackandsoon,focusingontheimplementationoftheestablishmentofcommunicationlinks,audiodatacaptureandplayback.Ontherealization,mainlyusingbasicideaofobject-orientedprogramming,andC#programminglanguagetodividethesystemintosomeclassesasInterface,Audiocaputure,Audioplayback,Audiocompressionanddecompression,Exceptionhandler,andacommontypeofstructure,thenuseXMPPmessagingprotocoltoestablishtheaudioconnections,sendandreceivedataviaSockettechnique.Finally,thethesissummarizeandoutlookthedevelopmentanddesignofC#-basedaudiocommunicationsystems.Keyword:Audiocapture;Audioplayback;Voicedatacompression;Xmppprotocol第一章引言1.1论文背景随着移动互联网的发展,即时通信技术也得到飞速的发展。自1998年面世以来,特别是近几年的迅速发展,即时通信的功能日益丰富,逐渐集成了电子、博客、音乐、电视、游戏和搜索等多种功能。即时通信不再是一个单纯的聊天工具,它已经发展成集交流、资讯、娱乐、搜索、电子商务、办公协作和企业客户服务等为一体的综合化信息平台。近年来,即时通信市场用户规模增长迅速,市场规模前景广阔。随着互联网用户的快速增长,即时通信用户也日益增长,2004年中国即时通信用户数达7000万人,2005年达到9300万人。中国即时通信市场规模在2005年约为6200万美元,2006年达到7700万美元,到2010年将达到1.14亿美元。目前在互联网上受欢迎的即时通讯软件包括、MSNMessenger、AOLInstantMessenger、YahooMessenger、NETMessengerService、ICQ等。在这具大的市场份额的诱惑下,众多公司都希望在这一领域有所突破,各大门户纷纷挤入即时通信市场跑马圈地;国的电信运营商也是虎视眈眈。基于即时通信在现实生活中广泛的运用场景和发展趋势,考虑到其在生活中的实用性以与现在市场上流行的即时通信系统的局限性,我们考虑到很多公司其部的交流需求,所以我们开发了一个可以在局域网实现在线交流、文件传输、实时语音通讯和视屏通讯等功能的一个即时通信系统。语音聊天是此即时通信系统的一个核心子模块,它采用现代比较流行的网络编程技术,面向各类企事业部门等局域网用户,利用即时通信协议以与相关技术实现在局域网的实时语音聊天,方便部人员进行实时交流,共同解决工作生活中遇到的困难,为企事业以与其它的局域网用户带来方便。而传统的一些诸如飞鸽传书之类的局域网聊天工具虽然实现了在局域网文字聊天、文件传送等一系列功能,但其在语音方面却尚未涉足,给用户的实时交流带来一定的影响。所以,本系统以现在即时通信在现实生活量应用为契机,实现了局域网实时语音聊天,为人们的生活、工作,学习带来了极大的便利。1.2国外研究现状与发展趋势1.2.1研究现状即时通信(IM)是指能够即时发送和接收互联网消息等的业务。自1998年面世以来,特别是近几年的迅速发展,即时通信的功能日益丰富,逐渐集成了电子、博客、音乐、电视、游戏和搜索等多种功能。即时通信不再是一个单纯的聊天工具,它已经发展成集交流、资讯、娱乐、搜索、电子商务、办公协作和企业客户服务等为一体的综合化信息平台。随着移动互联网的发展,互联网即时通信也在向移动化扩。目前,微软、AOL、Yahoo等重要即时通信提供商都提供通过手机接入互联网即时通信的业务,用户可以通过手机与其他已经安装了相应客户端软件的手机或电脑收发消息。2006年6月,中国移动已经推出了自己的即时通信工具——Fetion,中国联通也将推出即时通讯工具“超信”,但由于进入市场较晚,其用户规模和品牌知名度还比不上原有的即时通信服务提供商。1.2.2发展趋势目前即时通信行业仍处于高速发展期,通过调查发现,即时通信在未来的发展中呈现出整合多种业务、扩移动平台、渗透企业用户、融入收费容的发展趋势。1.整合多种业务随着宽带的普与,即时通信的涵也开始变化。与过去的纯文本交流不同,新型的即时通信业务融合了视频、音频交流等宽带应用元素。目前各种即时通信除提供了基本的即时互动交流外,还能提供视频、语音通信服务,在短信收发、文件共享、数据传输、游戏、娱乐、个性化设置等方面也都有大的开拓和创新。总之,多媒体化是即时通信未来的发展方向,未来即时通信将捆绑更多的互联网和电信增值业务功能。以腾讯为例,它目前正在大力发展游戏、音乐、用户定制等业务,今后还可能推广新的通信录、博客服务、视频音频等服务。同时,已经是个成熟的容,现在访问量已经排名第四,它会和客户端形成一纵一横互相支持的业务模式。2.扩移动平台移动通信业务的迅速发展使得传统的互联网即时通信服务商将移动用户作为下一步市场发展的重点,这在移动增值服务成为即时通信服务商收入的主要来源之后体现尤为突出。即时通信业务承载的设备也趋于多样化,用户通过PC、手机、PDA以与其他设备等都可以使用即时通信。MSN和国的手机厂商如:多普达、联想等合作,推出自带即时通信业务的手机;腾讯也推出移动的即时通信服务。3.渗透企业用户即时通信从个人通信向企业综合通信发展是其发展史上的重要一步。随着企业信息化建设步伐的加快,企业即时通信工具(EIM)也将作为联系和沟通的方式被有针对性地应用在企业的日常生产中,作为企业外沟通方式之一。企业即时通信应用包括综合信息服务、部即时通信、在线客户支持服务、在线呼叫、在线广告等。2003年全球企业即时通信市场收入1.19亿美元,随着企业对EIM的了解日益加深,这个数字会继续增长。据预测,全球的即时通信服务用户到2007年将增长至14.39亿户,其中企业用户数量将成倍增长,到2007年将增至3.49亿户。另据Gartner的调查数字显示,2004年在所有使用即时通信的用户中,有约50%是商业用户。4.融入收费容在互联网这个以免费、自由、互通为生存法则的世界里,即时通信从一个免费聊天工具不断生长壮大,吸引聚集了一些忠诚用户。在此基础上,开始搭建网络广告、无线增值等一系列各种潜在的交易平台,增加了收费的容。未来即时通信行业的盈利点在互联网与增值业务、移动与固网增值业务、广告业务三个方面。其中,互联网与增值业务包括两部分,核心业务主要是即时通信服务,包括传输文本信息、图像、视频、音频以与会员服务、服务、电子等;另外还有娱乐资讯门户的建设,包括向用户提供新闻、体育、娱乐等多类资讯,还包括游戏中心、交友中心、校友录、电子贺卡等多种娱乐服务。而移动与固网增值业务则主要是短信互通和部分2.5G产品,如彩信、彩铃下载和自写短信、短信订阅、新闻等多种服务。也就是说,当用户通过手机短信与即时通信软件上的好友聊天,下载或订阅短信、彩信等产品时,通过电信运营商的平台付费,电信运营商收到费用之后再与SP结算分成。第二章关键技术语音实时通讯涉与到很多方面的技术,在开发的过程中受到诸多方面的制约,在本系统的实现过程中主要运用的关键技术有:2.1XMPP协议2.1.1XMPP协议简介XMPP(ExtensibleMessageingandPresenceProtocol:可扩展消息与存在协议)的前身是Jabber,一个开源形式组织产生的网络即时通信协议。XMPP目前被IETF国际标准组织完成了标准化工作。标准化的核心结果分为两部分:核心的XML流传输协议和基于XML流传输的即时通讯扩展应用。(1)XMPP的核心XML流传输协议的定义使得XMPP能够在一个比以往网络通信协议更规的平台上。借助于XML易于解析和阅读的特性,使得XMPP的协议能够非常漂亮地完成相关工作。(2)XMPP的即时通讯扩展应用部分是根据IETF在这之前对即时通讯的一个抽象定义的,与其他业已得到广泛使用的即时通讯协议,诸如AIM,等有功能完整、完善等先进性。2.1.2XMPP协议基本网络结构XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。2.1.2选择XMPP协议的理由XMPP是目前主流的四种IM(IM:instantmessaging,即时消息)协议之一,其他三种分别为:即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)。在这四种协议中,XMPP是最灵活的。XMPP用传送与即时通讯相关的指令是用TCP传XML流,在以前这些命令要么用2进制的形式发送(比如),要么用纯文本指令加空格加参数加换行苻的方式发送(比如MSN)。而XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了,人也容易阅读了,方便了开发和查错。XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以与在XMPP的顶端建立如容发布系统和基于地址的服务等应用程序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。这一切也是笔者选择此协议的原因。2.2网络通信协议网络中不同的工作站,服务器之间能传输数据,源于协议的存在。随着网络的发展,不同的开发商开发了不同的通信方式。为了使通信成功可靠,网络中的所有主机都必须使用同一语言,不能带有方言,因而必须开发严格的标准定义主机之间的每个包中每个字中的每一位。这些标准来自于多个组织的努力,约定好通用的通信方式,即协议。TCP/IP协议是目前在网络中应用得最广泛的协议,TCP/IP实际上是一个关于Internet的标准,并随着的Internet广泛应用而风靡全球,它也成为局域网的首选协议。TCP/IP协议中的核心协议有TCP(传输控制协议)、UDP(用户数据报协议)和IP(因特网协议)。TCP协议可以在网络用户启动的软件应用进程之间建立通信会话,并实现数据流量控制和错误检测,这样就可以在不可靠的网络上提供可靠的端到端数据传输。UDP协议是一种无连接的协议,它在传输数据之前不建立连接,也不提供良好的可靠性和差错检查,只仅仅依赖于校验来保证可靠性。UDP不进行流量控制,没有序列或者确认,因此它处理和传输数据的速度快,还被用来传输关键的网络状态消息。IP协议的基本功能是提供数据传输、数据包编址、数据包路由,分段等。通过IP编址约定,可以成功地将数据通过路由传输到正确的网络或者子网。每个网络站点具有一个32位的IP地址,它和48位MAC地址一起协作,完成网络通信,IP协议也是一种无连接的协议。因为考虑到语音数据音比较大(与你的采样频率密切相关),而且丢失一小部分数据并不会影响双方进行正常通讯,所以本系统中的语音通讯模块采用了无连接、不可靠、没有流量控制但处理和传输数据的速度快的UDP进行实现。2.3Socket网络编程利用Socket编程实现典型的网络通信程序,特别是在实时性要求比较高的项目中,Winsock编程方法是非常实用的。在此必须了解怎样建立一个Socket,并怎样用用Socket建立两台计算机之间的连接,最终实现两台计算机之间的数据传送等一系列问题。2.4音频捕获技术语音通讯最先要解决的就是怎样捕获说话者从麦克风中传进来的语音,本系统中主要是采用Windows多媒体相关应用程序接口winmm.dll中所提供的一系列系统函数进行音频捕获。其中主要运用的函数有:waveInOpen为录音而打开一个波形输入设备(即得到一个麦克风句柄)。waveInPrepareHeader为波形输入设备准备一个输入缓冲区。waveInAddBuffer向波形输入设备添加一个输入缓冲区。waveInStart启动在指定的波形输入设备的输入,开始录音。waveInUnprepareHeader清除缓存。waveInClose关闭设备,停止录音。2.5音频回放技术当本面接收到远程主机捕获发送过来的音频数据后,还必须经过回放,才能将音频数据从音响中播放出来,从而达到语音通讯的目的。本系统中主要是采用Windows多媒体相关应用程序接口winmm.dll中所提供的一系列函数进行音频回放。其中主要运用的函数有:waveOutOpen打开回放设备,并得到其句柄。waveOutPrepareHeader为回放设备准备一个波形缓冲区(存块)。waveOutWrite向指定的波形输出设备发送一个数据块。waveOutRest停止放音。waveOutClose关闭回放设备。2.6音频采样技术由于计算机只能处理离散的二进制信息,而人的语音又是连续的模拟信号,所以我们必须通过采样把模拟信号转换成离散信号。实现这个步骤使用的设备是模/数转换器(A/D),它以每秒上万次的速率对声波进行采样,每一次采样都记录下了原始模拟声波在某一时刻的状态,称之为样本。将一串的样本连接起来,就可以描述一段声波了。把每一秒钟所采样的数目称为采样频率或采率,单位为HZ(赫兹)。采样频率越高所能描述的声波频率就越高。采样位数可以理解为采集卡处理声音的解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实。本系统中采用PCM(脉冲编码调制)进行模/数转换,样频率采用8000HZ,采样位数采用16位。2.7音频压缩/解压技术为了保证语音不失真,必须保证达到一定的采样频率(当然也不能过高)和一定的采样位数。这样,音频数据量将非常大,若不加以压缩而直接传输,很可能会导致网络阻塞、数据大量丢失等情况,所以必须采用适当的技术对采样到的数据进行压缩再进行传送,在接收端得到数据后再经过解压还原得到原来的音频数据。本系统主要采用了G729.dll中包含的压缩与解压算法对音频数据进行压缩、解压。2.8P2P技术P2P就是点对点。当在两台主机之间语音通讯连接已经建立后,就不需要再用到服务器了。因为语音数据不会再经过服务器传送到另一台主机上去,这样既消耗服务器的资源,又增加了数据的传送时间。所以,在连接建立之后,两台主机之间就进行数据的点对点传输,既节省资源,又加快了数据的传输速度。第三章语音通讯系统的分析3.1语音通讯系统可行性分析1.技术可行性分析对于当前的语音通讯系统,在技术上有很大的选择,但其根本都会用到网络编程的基本知识。根据对目前比较流行的编程语言以与通信协议的比较,笔者在技术上选择Visualstudio2005作为IDE,以VisualC#作为编程语言,结合网络编程技术以与XMPP即时通信协议进行此次开发。Visualstudio2005的集成性与功能强大性、VisualC#的便捷性与灵活性、XMPP协议的可扩展性和对网络编程的支持性保证了本次系统开发在技术上的可行性。2.经济可行性分析从论文背景中可知,随着互联网用户的快速增长,即时通信用户也日益增长,2004年中国即时通信用户数达7000万人,2005年达到9300万人。中国即时通信市场规模在2005年约为6200万美元,2006年达到7700万美元,到2010年将达到1.14亿美元。即时通信的市场需非常大的,而系统采用小团队方式开发在局域网的即时通信系统,在局域网实现在线交流、文件传输、实时语音通讯和视屏通讯等功能。面向各类企事业部门等局域网用户,利用网络实现在局域网的实时语音聊天,方便部人员进行实时交流,共同解决工作生活中遇到的困难,为企事业以与其它的局域网用户带来方便。研发成功后即可在企事业以与其它局域网用户中得到普遍运用,而相对来说研发成本就比较低。而且此系统的运行环境即局域网的组建也比较简单,费用也较低,所以运行环境的配置费用比较低,可以获得广泛的运用。所以其带来的经济效益远远超过开发成本,在经济上也具有可行性。3.操作可行性分析通过对周边人群的调查显示,决大部分人现在都在使用即时通信工具,本语音通讯系统采用与现代比较流行的即时通信工具相似的操作方式,在用户发出请求并经对方同意后,方可进行语音聊天,并且在聊天过程中可以随意调整音量大小,也可以随时结束语音通讯,这种操作方式合乎人们生活习惯,也具有可行性。3.2语音通讯系统需求分析3.2.1项目总述随着互联网技术的发展,网上办公、网上购物、网上交友等正在以飞快的速度走进大众的生活中,人们可以在网上做在现实生活中做的很多事情,而现实生活中最重要的一件事情就是交流,人与人的交流莫过于口头直接进行交流最为直观最为快捷。在这个“互联网世界”的今天,为了方便部人员进行实时交流,共同解决工作生活中遇到的困难,为企事业以与其它的局域网用户带来方便;为了解决以前人们通过计算机只能用文字进行交流的局限性,实时语音通讯已经成为现实生活中不可缺少的一部分。实现在局域网语音实时聊天,是人们在互联网上便利生活、工作,学习的基础。语音聊天是此即时通信系统的一个核心子模块,它采用现代比较流行的网络编程技术,面向各类企事业部门等局域网用户,实现实时语音捕获,音频数据压缩与发送,音频数据接收与回放等功能,从而达到了实时语音通讯的目的,方便部人员进行实时交流,共同解决工作生活中遇到的困难,为企事业以与其它的局域网用户带来方便。3.2.2市场需求分析近年来,即时通信市场用户规模增长迅速,市场规模前景广阔。随着互联网用户的快速增长,即时通信用户也日益增长,2004年中国即时通信用户数达7000万人,2005年达到9300万人。2006年中国即时通信用户增长29%,达到1.2亿人。另外,iResearch根据MorganStanley发表的研究数字整理发现,中国即时通信市场规模在2005年约为6200万美元,在2006年达到7700万美元,到2010年将达到1.14亿美元。移动即时通信市场有着更加巨大的成长空间和诱惑力。据iResearch2006年5月发布的调查报告显示,2005年我国移动即时通信的用户已达到500万;而在2006年,我国移动即时通信注册用户量达到700万;未来几年移动即时通信用户规模将呈现快速增长,预计到2010年中国移动即时通信用户将达到2000万人。上面这些数字表明,即时通信系统的市场需求量是非常大的,而语音作为即时通信的一个核心模块,也将广泛的应用。而且随着企事业单位以与其它局域网用户对语音通信的使用,其市场将越来越大,对其的需求也将随之增大。3.2.3用户需求分析在本系统中主要采用问卷调查以与与当前比较流行的即时通信系统(如)作比较而得到用户对语音通信的一些基本要求:一是速度要快(也就是要实时),二是质量要好(不能出现太大的杂音而影响正常通信),三是应该能在通信过程中动态调节音量的大小,并能进行静音操作等。3.2.4软件性能要求实时语音通讯系统的两大性能要求就是速度和质量。在速度上不能出现太大的延迟,因为延迟太大可能会丢失很大一部分用户,另外就是质量上的要求,语音通讯质量是一个与速度一样重要的问题,在通信过程中不能出现太大的杂音,也不能出现语音失真的现象。3.2.5软件功能需求图3-1语音通讯系统用例图F图3-1语音通讯系统用例图Fig.3-1:TheUseCasediagramofAudiocommunicationsystem(1)请求方:可以把其看成是一个人,也可以看作是一台主机。请求方最先发出语音通讯请求,然后等待接收方的处理反馈信息,只有在接收方同意之后才能进行相关的语音通讯准备工作,进而进行语音聊天,最后可以点击“结束”按钮结束语音通讯。(2)服务器:一台主机。其中转请求方发送过来的请求消息给接收方,在接收方进行处理之后,再将其反馈信息中转给请求方。在连接建立完成之后,通信双方进行点表3-1:各个角色相关的功能Table.3-1Variousrole-relatedfunctions编号名称描述主要路径前置条件1请求方发出请求双方要想进行语音通请求方必须先发出请求点击发送请求按钮->据对方IP发发送请求聊天窗口已经打开2请求方处理反馈信息当请求方发出的请求经对方处理之后,根据其反馈信息进行相应操作接收反馈信息->根据对方反馈信息类型进行处理收到对方反馈信息3请求方语音通讯准备接受请求方的请求后,自己应完成语音通讯相应的准备工作建立音频捕获/回放对象->开始音频捕获与回放对方接受请求4结束语音通讯当请求方/被请求方点击“结束”按钮即可结束本次语音通信点击结束按钮->发送结束的消息给对方->关闭设备,结束通信正常的语音通信中5服务器中转信息当服务器接收到通信双方传给另外一方的消息时,进行消息转发给对方接收客户端发送来的消息->根据其中包含的ID进行消息转发客户端发送了消息6服务器查找用户服务器在进行消息转发时,会根据其ID查找到此条消息应该发送给谁在所有的在线用户中进行查找ID与接收此消息ID一样的人即可有消息通过服务器7被请求方处理请求接收到请求方的请求后要进行相应的处理,并将处理结果反馈对请求方接收对方的请求->进行相应的处理->信息反馈被请求方收到请求8被请求方语音通讯准备接受请求方的请求后,自己应完成语音通讯相应的准备工作建立音频捕获/回放对象->开始音频捕获与回放接受对方请求对点通信,将不再使用服务器。(3)接收请求方:当对方发出请求后,接收请求方可以进行“接受”或者“拒绝”处理,并将其处理反馈信息回发给请求方。若此处点击“接受”则还要进行相应的语音通讯工作然后开始正常语音通讯,最后可以点击“结束”按钮结束语音通讯。3.3语音通讯系统流程分析语音通讯是即时通信系统中的一个核心模块,是实现人们即时交流的重要工具,而传统的一些诸如飞鸽传书之类的局域网聊天工具虽然实现了在局域网文字聊天、文件传送等一系列功能,但其在语音方面却尚未涉足,给用户的实时交流带来一定的影响。所以,本系统以即时通信在现实生活量应用为契机,实现了局域网两台台主机实时语音聊天。只要其中任意一个用户发出语音聊天的请求,对方就会接收到一个请求,若同意之后双方就可以进行随意的语音聊天了,并且在聊天过程中可以设置音量的大小,最后点击结束键结束语音聊天。首先对语音通讯流程进行分析,流程分析是整个系统的基础,它给出了语音是怎样从一台主机捕获并发送到另一台机的整个过程。一般语音通讯系统应该包括:建立连接,音频捕获,音频发送(包括音频压缩),音频接收,音频回放(包括音频解压)五个部分。其基本流程为:建立连接→打开麦克风→捕获音频→音频压缩→音频传送→音频接收→音频解压→音频回放。3.4语音通讯系统数据流图本语音通讯系统主要是是实现在局域网的实时语音聊天,需要一台主机充当服务器,另外的计算机连接到这台服务器上。当通信双方中的一方给对方发出语音聊天请求后,服务器进行转发最后双方建立通信连接。在双方通信连接建立后就可以在两台计算机之间进行点对点音频数据传输。本地主机捕获音频设备中的音频数据,并经过压缩然后发送给对方,在对方接收到此音频数据之后经解压回放。具体数据流走向是:一方(A方)发出请求经过服务器转发到另一方(B方),经过B方对A方提出的请求进行处理,然后将其反馈消息返回给A方(此处假设B方选择了接受),则A方将得到对方的IP地址并打开自己语音设备开始进行音频捕获、压缩并发送,而B方在进行音频捕获的同时进行音频接收、解压与回放。所以可以得到顶层数据流图见图3-2:图3-2:顶层数据流图Fig.3-2TheTop-levelDFD在上面顶层数据流图中,有处理语音请求、捕获音频与发送、音频接收与回放三大处理,这三个处理分别表示:1.处理语音请求:请求方提出的语音聊天请求,经服务器进行转发给对方,然后经过对方的处理再通过服务器将其反馈消息转发到请求方,请求方根据对方的应答消息完成相应的动作,若对方是接受了此语音请求,则将此应答消息发送给音频捕获与发送处理开始此次语音通信。2.捕获音频与发送:当请求方接收到对方“接受”语音请求的应答消息后,就会打开自己的音频设备启动音频捕获处理,并将捕获到的音频数据进行压缩处理之后发送给对方。在发送给对方的过程中会用到处理语音请求过程中所得到的对方的IP地址。3.音频接收与回放:当对方(B)收到A方传过来的音频数据后,首先其会通过解压处理而得到最初的音频数据然后在接收方的音频设备中进行回放。根据以上分析与顶层数据流图可得细化数据流图见图3-3:图3-3:细化数据流图Fig.3-3ThedetailedDFD第四章语音通讯系统的设计4.1系统结构即时通信系统采用C/S结构模式,即:服务器/客户端模式。但语音通讯模块只是依靠服务器进行两个客户端连接的建立,当两个客户端的连接建立以后,将不使用服务器,而是采用P2P模式进行通信。因为语音数据不会再经过服务器传送到另一台主机上去,这样既消耗服务器的资源,又增加了数据的传送时间。所以,采用这种结构,两台主机之间就进行数据的点对点传输,既节省资源,又加快了数据的传输速度。系统结构图见图4-1:图4-1:系统结构模式Fig.4-1Systemarchitecturemodel4.2开发工具由于开发基于网络的语音通讯系统,所以现在比较流行的几中语言就是C++、JAVA和C#,基于几种平台和语言的比较,最终选择了VisualStudio2005作为IDE,选择VisualC#语言来实现此语音通讯系统,选择VS2005和VisualC#的理由如下:VisualStudio是一套完整的开发工具集,用于生成ASP.NETWeb应用程序、XMLWebServices、桌面应用程序和移动应用程序。VisualBasic、VisualC++、VisualC#和VisualJ#全都使用一样的集成开发环境(IDE),利用此IDE可以共享工具且有助于创建混合语言解决方案。另外,这些语言利用了.NETFramework的功能,通过此框架可使用简化ASPWeb应用程序和XMLWebServices开发的关键技术。而VisualC#是微软推出的一种比较新的一种面向对象编程语言,它使得程序员可以快速地编写各种基于Microsoft.NET平台的应用程序,Microsoft.NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。因此选择VS2005作为IDE来进行此次开发。相对以前的编程语言来说,C#语言在效率与安全性上得了很大的改善,并且支持现有的网络编程新标准,它使程序员快速便捷地创建基于Microsoft.NET平台的解决方案。这种框架使C#组件可以方便地转化为XML网络服务,从而使任何平台的应用程序都可以通过Internet调用它。还有,C#增强了开发者的效率,同时也致力于消除编程中可能导致严重结果的错误,使得C/C++程序员可以快速进行网络开发,同时也保持了开发者所需要的功能强大性和灵活性。于是笔者选择VisualC#语言来进行此次开发。4.3流程设计一般语音通讯系统的流程应该包括:建立连接,音频捕获,音频发送(包括音频压缩),音频接收,音频回放(包括音频解压)五个部分。其基本流程为:建立连接→初始化麦克风(打开音频设备)→捕获音频→音频压缩→音频传送→音频接收→音频解压→音频回放。其流程具体设计如下:(1)建立连接:两台计算机之间进行语音通讯,首先就是要在双方进行连接的建立,然后双方才能够进行通讯,确定数据发送到什么地方。本系统中一方先发出语音聊天请求,并通过XMPP协议根据对方的ID把请求发送给对方,在接收方接收到请求并点击“接受”后,接收方完成自己语音通讯相关的工作,并且再根据发送方的ID发送一个消息回去,表示自己已经接受,在最初发出请求的主机接收到对方已接收请受后,此主机也完成自己语音通讯相关的工作,至此双方的连接建立完毕,可以正常进行通信了。(2)音频捕获:先初始化麦克风,再打开本机的“混音器”并得其句柄,根据此句柄调用winmm.dll中所提供的一系列函数进行捕获音频,并把其存放在一个数组中(因为采用PCM,所以捕获到的音频是一此离散的数字)。(3)音频发送:建立Socket连接(UDP协议),利用socket的BeginSendTo()函数将数据发送给远程主机。这个过程中会用到G729提供的压缩算法对存放于数组中的数据进行16:1的压缩,减少网络传输的数据量。(4)音频接收:建立Socket连接(UDP协议),利用socket的BeginReceiveFrom()函数从指定的远程主机接收数据并存放于一个数组中。(5)音频回放:本机通过音频接收已经将远程主机发送来的音频数据保存在了一个数组中,这里只需根据本机的“混音器”句柄调用winmm.dll中所提供的一系列函数进行即可实现语音回放功能。当然,这里在回放之前会先调用G729提供解压算法对保存于数组中的音频数据进行解压。4.4语音通讯系统总体设计本语音通讯系统采用面向对象的基本知识,再结合系统的需求分析和基本流程,将系统主要分为如下四个模块:登录模块,连接建立模块,音频捕获模块,音频回放模块。其中音频捕获模块和音频回放模块又可以分为若干小的模块,最后其每一个小的模块都采用一个类来进行实现。总体设计见图4-2:图4-2:功能模块的总体设计图Fig.4-2Totaldesignoffunctionmodule4.5语音通讯系统详细设计4.5.1登录模块这个模块是整个即时通信系统所共用的一个模块,是进入本即时通信系统的界面,图4-3:登录模块流程图Fig.4-3Flowchartofloginmodule在这个模块中主要是根据用户ID和PASSWORD(把其存放XmppClientConnection的一个对象中)图4-3:登录模块流程图Fig.4-3Flowchartofloginmodule4.5.2建立连接模块图4-4:建立通信连接流Fig.4-4Flowchartoferectcommunicationlink两个用户要进行语音通讯必须在一方发送请求而另一方接收请求,然后建立其连接的情况下才能发生。此模块主要完成两个功能:一个是初始化麦克风,另一个就是建立通信连接,从而能进行正常语音通信。1.初始化音频设备语音的大小可以通过音频设备进行控制,所以我们必须得到音频设备的句柄最终实现对声音大小的控制。所以我们必须初始化音频设备(其实是建立类的一个对象),并在聊天过程中可以改变音量的大小。此初始化过程是用户点击另一个用户想进行聊天的时候进行实现,主要是通过在我们自己定义的一个自定义控件中进行调用AV.dll中的Mixer类进行实现。其中Mixer类主要完成:根据给定的窗口句柄打开混音器,获取混音器设备指定的线路信息,获取关联音频线路的一个或多个控制器并从控制器中得到其音量等信息,获取指定控制器的详细信息,设置指定控制器的详细信息。这样我们其对象来调节麦克风以与扬声器音量的大小。2.建立通信连接图4-5:音频捕获模块流程图Fig.4-5Flowchartofaudiocapturemoudle系统中一方先发出语音聊天请求(将自己的IP放于一个Oob对象(Oob类是XMPP协议提供的一个表示语音聊天的专用类)中,并将此Oob对象存于IQ的对象中,并设置IQ的相关属性(to,Type),通过XmppClientConnection对象发送给指定的用户,在服务器接收到此IQ信息后,判断这是发给哪一个用户的IQ进而转发给该用户,在接收方接收到此请求后,并根据发送方的ID进行判断是否要与此人进行语音聊天,若选择图4-5:音频捕获模块流程图Fig.4-5Flowchartofaudiocapturemoudle其中上面双方建立通信连接时,当接收方接受请求后,双方会完成自己一些语音通信相关准备工作,这些准备工作是:通过建立语音通信类(AV)对象,并调用AV类所提供的接口IniChanel()和IniAudio()建立Socket连接并建立相关对象和完成一系列初始化工作,进而开始双方的正常通信。4.5.3音频捕获模块音频捕获在整个语音通讯系统中占据核心地位,这个模块核心功能就是完成音频捕获并发送给远程主机。其主要步骤有:确定音频格式,建立音频捕获对象,打开录音设备,为设备分配足够的存做缓冲区,将缓冲区与设备相关联,开始录音捕获音频,将捕获到的音频压缩并发送给远程主机。其流程图见图4-5,此模块的功能主要由以下类进行完成:图4-11:WaveIn类图Fig.4-12ClassDiagrameofWaveIn图4-12:WaveOut类图Fig.4-13ClassDiagrameofWaveOutAV类:此类是此系统面向对象知识体现之所在,它把所有与语音通讯相关的东西都进行了封装,只提供了几个接口给用户进行调用即可实现语音通讯,体现了面向对象编程的思想,对用户来说简单,对系统来说也比较安全(避免用户直接操作其中的数据)。这个类在用户调用其构造函数创建其一个对象后,主要提供了两个接口给用户,即IniChanel()和IniAudio()。在IniChanel()中,首先建立一个AVChannel类的一个对象,此对象用于完成Socket的建立以与接收来自远程主机发送来的音频数据。在图4-11:WaveIn类图Fig.4-12ClassDiagrameofWaveIn图4-12:WaveOut类图Fig.4-13ClassDiagrameofWaveOut图4-9:AVException类图Fig.4-9:ClassDiagrameofAVException图4-7:AV类图Fig.4-7ClassDiagrameofAVofAV图4-8:AVChanel类图Fig.4-8ClassDiagrameofAVChanel图4-10:g729类图Fig.4-10ClassDiagrameofg729AVChannel类:此类主要用于完成一系列准备工作。首先建立Socket对象并绑定(使用UDP协议建立),初始化音频编码器和音频解码器,然后将WaveIn类捕获到的音频数据经过压缩后通过Socket的BeginSendTo()方法发送给特定的远程主机。图见4-8:G729类:此类在音频捕获模块里主要是完成音频数据的压缩功能。由于通过采样得到的语音数据量比较大,所以必须经过压缩传送才能减少网络负担。此类通过调用g729.dll里面提供的函数实现音频数据16:1的压缩。其类图见图4-10:Struct类:这个类主要是指明整个系统中所共用的一系列结构体。其中与音频捕获相关的结构体有两个:一个是WAVEHDR,其主要是用于指明音频捕获过程中所用到的缓冲区的格式与一系列参数。另一个是WAVEFORMATEX,这个结构体主要是指明波形的格式,包括采样频率,采样位数等一系列重要的参数。图4-6:音频回放模块流程Fig.4-6FlowchartofaudioplaybackWaveIn类:这个类是音频捕获的核心类,主要的音频捕获工作都是在这个类中进行完成的。这个类主要会利用winmm.dll中提供的一系列函数完成工作,其中主要的工作有:图4-6:音频回放模块流程Fig.4-6FlowchartofaudioplaybackAVException类:主要是对上面一系列工作中所出现的异常进行简单的处理。其类图见图4-9:4.5.4音频回放模块要实现语音聊天,只把进行语音捕获是远远不够的,还必须在接收端把其接收到的音频数据进行回放,才能达到真正意义上的实时语音通讯的目的。这个模块主要就是完成接收从远程主机发送来的数据并进行回放。其主要步骤有:确定音频格式,建立音频回放对象,打开与此主机相关的回放设备(混音器设备)并得到其句柄,为回放设备准备一个波形缓冲区(存块),向指定的波形输出设备发送一个数据块,停止放音,关闭回放设备。其流程图见图4-6,此模块功能主要由以下类进行完成:AV类:此类是此系统面向对象知识体现之所在,它把所有与语音通讯相关的东西都进行了封装,只提供了一个接口给用户进行调用即可实现语音通讯,体现了面向对象编程的思想,对用户来说简单,对系统来说也比较安全(避免用户直接操作其中的数据)。这个类在用户调用其构造函数创建其一个对象后,主要提供了两个接口给用户,即IniChanel()和IniAudio()。在IniChanel()中,首先建立一个AVChannel类的一个对象,此对象用于完成Socket的建立以与接收来自远程主机发送来的音频数据进行回放,并进行一些委托的初始设置。在IniAudio()方法中,首先会确定此次回放波形的格式(即设置WAVEFORMATEX结构体的一系列参数),然后根据此波形格式建立一个建立一个音频回放类(WaveOut)的对象,并调用其Start()方法让此对象开始音频回放。其类图见图4-7:AVChannel类:此类主要用于完成一系列准备工作。首先建立Socket对象并绑定(使用UDP协议建立),初始化音频编码器和音频解码器,然后使用Socket的BeginReceiveFrom()方法,接收远程主机发送过来的音频数据并存于缓冲区数组中,当缓冲区满后执行其回调函数与其相关委托,最终调用WaveOut类的Wirte()方法实现语音回放。其类图见图4-8:G729类:此类在音频回放模块里主要是完成音频数据的解压功能。为了减少网络负担,发送方已经将音频数据进行了压缩,所以接收端进行音频回放时应该进行数据解压。其类图见图4-10:Struct类:这个类主要是指明整个系统中所共用的一系列结构体。其中与音频回放相关的结构体有两个:一个是WAVEHDR,其主要是用于指明音频捕获过程中所用到的缓冲区的格式与一系列参数。另一个是WAVEFORMATEX,这个结构体主要是指明波形的格式,包括采样频率,采样位数等一系列重要的参数。WaveOut类:这个类是音频回放的核心类,主要的音频回放工作都是在这个类中进行完成的。这个类主要会利用winmm.dll中提供的一系列函数完成工作,其中主要的工作有:打开回放设备,并得到其句柄,为回放设备准备一个波形缓冲区(存块),向指定的波形输出设备发送一个数据块(此音频数据已经在AVChannel中接收),停止放音,关闭回放设备。其类图见图4-12:AVException类:主要是对上面一系列工作中所出现的异常进行简单的处理。其类图见图4-9:根据以上分析可以得到对象模型为图4-14:图图4-14:语音通讯系统的对象模型Fig.4-14Voicecommunicationsystemobjectmodel第五章语音通讯系统的实现5.1构建语音通讯系统的用户登录系统图5-1:图5-1:登录界面Fig.5-1Thelogininterface在这里主要是用到XMPP协议提供的IQ和其提供的XmppClientConnection来进行实现。首先将用户输入的ID和PASSWORD保存在XmppClientConnection对象connect的Usernamt和Password属性中,并设置此次连接服务器的IP和端口号,然后使用其open()方法把数据发送到服务器之后查询数据库,若存在则登录成功,若数据库中没有相关数据则返回登录页面表示登录失败。其关键代码如下:connection.Username=tbx_user.Text;//设置IDconnection.Server=server;//设置服务器IPconnection.Password=tbx_pwd.Text;//设置PASSWORDconnection.Port=5222;//设置端口号connection.Open();//使用打开方法把数据发送到服务器进行验证5.2连接建立模块的实现在系统功能模块设计中已经分析此模块由两部分功能组成:初始化麦克风和建立通信连接。其具体实现如下:5.2.1音量调整相关操作1.初始化麦克风与本机音量调节器初始化过程是用户点击另一个用户想进行聊天的时候进行实现,也就是加载这个聊天主窗体(frmchat)时就会初始化麦克风,回为在这个窗体中用到了我们的一个自定义控件,而在此自定义控件中进行调用Mixer类建立了其对象并执行了打开操作,所以就将麦克风和本机音量调节器进行了初始化,其具体实现如下:在加载frmchat窗体调用自定义控件audiochat时,定义了一个audiochat对象,并调用其setcon(XmppClientConnectioncon,stringname)设置此麦克风与音量调节对象中所需要的XmppClientConnection对象和对方ID(name)。在audiochat类的构造函数中调用InitializeMixing()进行麦克风的初始化,并建立一个用于控制输出(本机音量)音量大小的MixerControlDetail对象outdtl和一个用于控制输入(麦克风音量)音量大小的MixerControlDetail对象indtl,以后改变音量的一系列操作都与这两个对象有关。此InitializeMixing()函数代码如下:privatevoidInitializeMixing()//初始化声卡麦克风{mixer=newMixer(this);//this用作窗口句柄this.outdtl=newMixer.MixerControlDetail//用于控制本机音量大小(mixer,Mixer.MIXERLINE_COMPONENTTYPE_DST_SPEAKERS);this.trackBarOut.Minimum=this.outdtl.Min;//得到本机音量最小值this.trackBarOut.Maximum=this.outdtl.Max;//得到本机音量最大值this.trackBarOut.Value=this.outdtl.Volume;//得到本机当前音量if(!this.outdtl.Mute)//根据本机是否是静音决定显示哪一图片{this.pbMuteVolume.Visible=true;//若不静音,则显示静音图片this.pbNormalVolume.Visible=false;}else//否则就显示音量图片{this.pbNormalVolume.Visible=true;this.pbMuteVolume.Visible=false;}this.indtl=newMixer.MixerControlDetail//用于控制麦克风音量大小(mixer,Mixer.MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE);this.trackBarIn.Minimum=indtl.Min;//得到麦克风音量最小值this.trackBarIn.Maximum=indtl.Max;//得到麦克风音量最大值图5-2调整音量界面F图5-2调整音量界面Fig.5-2Theinterfaceofadjustvolume//得到麦克风音量当前值2.调整音量大小1.当用户改变作为参数传给Mixer类的窗口audiochat中表示音量大小的控件(其中一个trackBarIn表示本机麦克风音量的大小,一个trackBarOut表示本机音响音量的大小)时,就会改变音量的大小,当点击音量扬声器的图片时,就会在静音与非静音之间进行转换,但这两个调节条以与这静音按钮必须在双方通信连接建立之后激活才能进行调节与改变,其界面如图5-2:当用户拖动trackBarIn控件时,就表示在调节自己麦克风的音量大小,此音量值大小影响对方回放时音量的大小,若选择最小则对方在回放音频数据时将听不到声音。而拖动trackBarOut就相当于调整本机音量值的大小,会使对方传过来的声音在本机上的回放音量改变。在这里主要是通过AV.dll中提供的音量大小控制函数以与在初始化麦克风时所定义的用于控制输出音量大小的MixerControlDetail对象outdtl和一个用于控制输入音量大小的MixerControlDetail对象indtl来共同进行实现,当用户拖上面的音量调节条时,会触发trackBarOut_Scroll()事件从而实现音量大小的调节。其中调节麦克风音量值的关键代码:this.indtl.Volume=this.trackBarIn.Value;此句代码通过MixerControlDetail对象indtl设置其Voluem,则可自动对麦克风音量值进行控制。其中调节本机输出音量值的代码:this.outdtl.Volume=this.trackBarOut.Value;此句代码通过MixerControlDetail对象outdtl设置其Voluem,则可自动对本机输出音量值进行控制。在用户双击另一个用户弹出聊天窗口时就会初始化对音量图标,若用户本机当前就是静音,则显示静音图片;相反就显示音量图片。当用户点击静音按钮或者音量按钮图片时,就会在静音与非静音之间进行转换,并会随之切换相应的提示图片。对其的实现主要是通过AV.dll中对this.outdtl.mute进行设置为true或者false即可。5.2.2建立通信连接发送语音聊天请求当A用户点击“语音聊天”请求按钮后,会向对方发送一个请求消息,此处发送消息主要是通过XMPP协议提供的IQ类的对象进行发送,可以通过IQ设置此消息是发送给谁以与消息的类型等一系列参数。在这里先通过GetHostAddresses()得到本机的IP存放于一个标志语音聊天的Oob的对象oob中,然后将此对象作为iq的一个孩子,这样相当于设置了iq.Query.Type为Oob,有利于服务器转发消息以与对方处理消息时判断这是语音聊天相关的消息。最终确定其消息类型与发送的目的地,采用con.send()进行发送.设置iq的Type属性为get表示发送请求,等待B用户的处理,其关键代码如下://获取本机IPIPAddress[]hostip=Dns.GetHostAddresses(Dns.GetHostName());Ooboob=newOob();//新建一个标志语音聊天的对象oob.Value=hostip[0].ToString();//oob.Value中存放好自己的IDIQiq=newIQ();//新建一个IQ消息对象iq.AddChild(oob);//设置iq.Query的Type为Oobiq.To=newJid(name,"localhost","resourse");//指定对方的ID(name)iq.Type=IqType.get;//Type设置为get表示发送请求con.Send(iq);//通过XMPP将此消息发信服务器服务器进行消息转发A用户发送的建立连接请求指定了其接收此消息用户的ID,但这两个用户现在完全独立没有联系,所以这个消息必须通过服务器进行转发。服务器通过判断iq.Query!=null且iq.Query.GetType()==typeof(Oob)说明这是语音聊天的请求消息,然后在服务记录的所有的在线用户列表(一个ArrayList)中进行查找,若发现一个在线用户的ID等于这

温馨提示

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

评论

0/150

提交评论