




已阅读5页,还剩81页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于IP网络公务电话系统设计与实现毕业论文目 录前 言1第一章 绪 论2第一节IP网络电话发展历史及趋势2一、IP网络与IP网络协议2二、基于IP网络协议的IP电话3三、网络IP公务电话的需求以及模拟方式3第二节 课题主要工作4第三节本章小节4第二章 相关技术及原理5第一节Visual C+ 6.0开发平台及MFC简介5一、Visual C+6.0开发平台5二、MFC Windows程序设计6第二节网络通信知识6一、IP 地址6二、TCP/IP 四层模型6三、网络组建方式7四、C/S模式7第三节基于Windows套接字的网络应用程序编程8一、套接字接口8二、Socket套接字网路编程步骤9三、基于消息的异步套接字12第四节链表结构12第五节多线程编程13第六节 本章小结14第三章 开发可行性及需求分析15第一节开发的可行性15第二节需求分析15第三节本章小结16第四章 IP网络公务电话系统总体设计17第一节设计目标17第二节系统框架设计17一、界面操作层18二、业务逻辑层18三、数据传输层18第三节类的设计19一、类设计的基本情况19二、各个类的基本介绍19三、类设计图20第四节信令机制设计22第五节界面操作设计23第六节话机状态设计25第七节系统程序线程设计26第八节本章小节27第五章 IP网络电话关键程序实现28第一节用于语音传输的面向非连接的套接字28第二节用于信令传输的面向连接的套接字29第三节通话过程的实现30一、单呼处理30二、组呼处理31第四节本章小节32第六章 IP网络电话系统测试33第一节界面操作介绍33第二节初始化配置35第三节拨号流程37第四节 单呼通话过程的建立37第五节 组呼通话过程的建立44第六节 本章小节46结 论47致 谢48参考文献49附 录50一、英文原文:50二、英文翻译:55三、源程序(关键代码):59 - 83 -前 言Internet是人类在20世纪创造的最庞大、最复杂的通信系统,在过去的几十年里,一批又一批的人在不断的为这个属于全世界人类的系统增添新的技术,使它能够适应现代社会的发展,让世界融合成为一个信息一体化的整体。Internet与传统电话网络有着本质的区别,也是它最突出的优点,那就是设计上的通用性和开放性。各种各样的应用程序以及不同类型的业务都可以通过这个网络来承载,它不仅采用了标准的开放的TCP/IP协议,还提供开放的API。这使得Internet成为越来越多的行业和产业首选的业务承载网络。传统的公务电话需要用有线设备将话机介入PSTN中,并且业务开发会受到传统电话网络的各种限制,不具备开放性和通用性,而且不能够方便灵活,只能在有电话线路的地方,而且在规定的局域网内才能够进行单呼和组呼。然而,基于IP网络的Internet的应用程序公务电话,则可以很好的克服这一点。只要一台电脑里面安装了设计好的应用程序,连接到Internet的,不论接入方式,不论组网方式,只需要能够分配到一个IP地址,就能和另外的任意台电脑进行通信,很好的完成公务电话的各种功能。这样的公务电话不仅方便灵活,而且设备简单。本文根据这一优点进行了一种基于Socket套接字的网络IP公务电话的应用程序开发研究。实现了在Internet上进行公务电话的单呼功能和组呼功能。论文分为四个部分:第一章综合阐述了本次设计运用到的IP网络系统以及Windows的程序设计;第二章介绍了本次程序开发的总体设计;第三章介绍了程序的操作流程;第四章对这次程序设计的关键代码和实现进行了分析和讨论。最后在结论中提出了对程序的进一步扩展的方案。第一章 绪 论第一节 IP网络电话发展历史及趋势一、IP网络与IP网络协议IP网络,即是基于Internet protocol的网络。它的主导思想是在没有发送端和接收端帮助的情况下,具有源地址和目的地址的的数据包能够独立地穿越由路由器构成的网络1。从物理上看,Internet是由不同类型的物理组件作为节点,通过传输线路相互连接而构成的网络,这些物理组件主要有主机、交换机和路由器。近年来为了解决网络安全问题,又加入了必要的安全设备,例如防火墙,ICS/IPS等2。整个网络都是通过寻址的方式将各个数据包从一个节点传向下一个节点,最终传到指定的地址上。IP网络最大的特点就是它在路由的时候,没有指定的路线,而是各个路由器通过自己当时的网络拓扑结构和网络线路情况,根据特定的某种算法决定下一个路由的方向,也就是说,同样一个数据包从一个节点传到另一节点在不同时候可能会有多种路径。就像交通运输一样,人们一直在努力去寻求一种最为理想的运输方式,使得在同样的时间内,最有效的使用交通资源。为了制定一个统一的网络协议标准,1977年,国际标准化组织制定了OSI七层模型,但由于这个系统过于庞大、复杂,后来的TCP/IP协议栈获得了技术人员的广泛应用12。TCP/IP模型分为四层,物理层、网络层、传输层和应用层。每一层都是在原有的数据包外附加了一部分开销,用来完成特定的功能。其中在网络传输中,路由器可以通过处理网络层的开销字节来完成路由的功能。在IP网络的协议栈中,网络层的IP协议完成的功能最为简单,标准最为统一,这也是IP网络能够承载各式各样的业务的原因。在协议栈的传输层中,有两种服务质量不同的协议:面向连接的TCP协议和面向非连接的UDP协议。这两种协议有各自的优缺点,但同时通过这两种协议的综合使用,能够满足不同用户的需求。TCP协议是通过一种面向连接的,可靠的数据传输服务,它具有:向应用进程提供面向连接的服务;通过三次握手,提供全双工数据传输服务,但不支持广播和组播。提供面向字节流的服务3。UDP协议则是一种面向无连接的、不可靠的数据传输。但它具有自己的特点:不存在连接上的时延;一台服务器可以向多个用户同时传输数据;UDP的开销比TCP断;吞吐量不受流量算法的控制。 二、基于IP网络协议的IP电话IP网络虽然具有良好的开放性和通用性,但由于它的网络层是用数据报形式以面向无连接的方式传输的,所以IP网络只能提供“尽最大努力”的服务,不能保证数据何时到达以及能提供多少数据,导致传输的可靠性和时延成为了它必有的内伤,这一缺点对于语音数据传输以及可视通信是致命的。随着科技的发展,人们实现了基于IP网路的电话,也就是VOIP。这种技术将语音信息转化为可在IP网络上传输的数据包,并且能够通过对IP网络的优化,增加了传输的可靠性,降低了时延。到目前,这项技术已经成熟,通过IP电话网关,我们就能实现IP网络与PSTN的融合,实现传统电话与IP电话、以及电脑的通信。三、网络IP公务电话的需求以及模拟方式公务电话是传输设备的一种基本功能,随着无线通信技术的普及和覆盖,基于PCM方式的传统公务电话的重要性在不断的降低。然而在比较偏远的山区还有一些特殊的场合,将公务电话在IP网络中实现,能够发挥非常重要的作用。有了公务电话,我们能在任何一个能够连接IP网络的用户终端通过公务电话的应用程序进行通信。图1.1 IP公务电话网络示意图如图所示,通信设备的网元组成一个通信网络,提供第一层和第二层的路由和报文转发。我们可以将这些网元当作是二层或三层交换机或者路由器,由它们组成的IP网络。每个公务电话板卡和网元的接入就是一个网络接口,每个公务电话分配一个IP地址,这些公务电话可以完全用电脑的windows开发系统设计程序来模拟。第二节 课题主要工作本次课题是在研究IP网络、网络组建以及应用程序编程的基础之上,进行的一次网络应用程序的开发。这次程序能够完成IP公务电话的单呼以及组呼的功能,即能够使联网的任意两台电脑相互进行语音通信,并且能使一个组内的所有电脑进行通话。在编写程序之前,我进行了系统框架设计、类设计、信令机制设计、界面设计、话机状态设计以及线程设计,此外,为了完成单呼和组呼的功能,我还分别做了单呼和组呼通话过程的流程分解,具体的描述了通话过程中逻辑流程。本文主要介绍了本次开发中所运用到的相关技术和原理,需求分析,总体设计以及测试过程,并且对关键部分的程序代码进行了分析和解释。第三节 本章小节本章首节主要介绍了Internet Protocol 网络的基本情况,并且对TCP/IP协议栈、VOIP技术进行了简要的介绍,最后分析了IP公务电话的需求以及实现方式。第二节对本次设计以及本次论文进行了概括。本次设计是一个IP网络的网络应用程序的开发。第二章 相关技术及原理第一节 Visual C+ 6.0开发平台及MFC简介一、Visual C+6.0开发平台VC+是微软公司开发的一种功能强大的软件开发工具,它不仅是一个C+编译器,而且也是一个基于Windows系统的集成开发环境(IDE)16。因此,它可以将高级语言转换为机器语言,并且可以提供包括APPWizard、Class Wizard等工具,方便程序员进行自己的编程。我们可以很轻松的编写完C/C+程序代码后进行编辑、调试和运行。不仅如此,这个软件可以轻松调用MFC这个数据库,从而使你能够很轻松的驾驭windows的程序设计。如果你新建一个MFC的工程,你会发现开发环境里面已经自动生成了许多MFC的框架文件,里面已经封装了你所需要的在windows系统里面能够涉及到的所有框架结构,你只需要专心将你的程序逻辑编写完成,整个框架设计就不需要你自己去设计了。VC+主要由三个部分组成:Developer Studio、MFC、PlatformSDK。其中Developer Studio是一种集成开发环境,它能提供包括VC+、VC、VB、VJ以及VID的编译器,而且可以提供很多Wizard,它就是我们完成很多功能的幕后英雄17。PlatformSDK是一个Windows操作系统的开发包,它配合MASM,能够方便编程人员查阅关于MFC在内的开发函数。由于VC+是用C+语言来编写程序,所以它也是面向对象的程序编程。所谓面向对象,就是以对象为基础,以事件或消息来驱动对象执行处理的程序设计技术。它的结构特点是程序可分为类的定义和类的调用两部分。程序中通过向对象发送消息来实现一切操作,对象接受到消息后,进行消息响应,完成操作17。二、MFC Windows程序设计MFC(MicrosoftFoundationClasses) 是微软公司开发的一个C+的类库,它里面封装了大部分基于windows操作系统的 API函数。MFC是由很多类组成的这些类之间有继承和派生的关系,其中Cobject类作为很多类的父类,CCmdTarget和CWnd是其派生出来的两个大类。这样,对我们程序员编写windows的应用程序节省了许多重复复杂的步骤并且节约了时间。Cdialog是CWnd类派生出来的一个重要的类,也就是对话框窗口类,本次的应用程序设计的界面操作类都是基于这个类派生出来的。因为这个类里面包含的成员函数、成员变量已经足够我们去开发一个基于对话框的应用程序了。我们只需要在这些对话框里面进行我们所需要的程序逻辑设计就能完成所需功能。第二节 网络通信知识一、 IP 地址在IP网络中传输的数据包中,最外层是一个20字节的开销字段,在这里面有一个很重要的信息,那就是源IP地址和目的IP地址。这两个地址代表了发起主机和目的主机,是传输过程中的路由中一个很重要的参数、IPv4的IP地址是一个32位的二进制数,通常被分割为4个8位二进制数,但通常用4个0到255的整数来表示,并用点来进行分割2。通过与子网掩码相与,我们能够得到相应的网段以及同一网段内的不同主机号。从而区分不同的用户。IPv4中采用分类编址,一般分为5类地址,另外还有特殊地址以及保留地址,通过这样的分配,能够较为合理的为接入IP网络中的主机分到IP地址。二、TCP/IP 四层模型前面已经介绍了IP网络的一些基本知识,我们可以知道,TCP/IP协议分为四层,即应用层、传输层、网络层和网络接口层。应用层包含了所有网络中的高层协议,也就是能够提供一组应用程序,这些协议包括远程登录协议Telnet、文件传输协议FTP、域名服务DNS、超文本传输协议HTTP、简单邮件传输协议SMTP等2;传输层则是使应用程序之间能够进行通信,前面第一章第一节已经详细说明,不再累述;网络层就是让不同的主机进行交互;网络接口层是负责成帧以及怎样将帧放在IP网络上面进行传输。三、网络组建方式网络是由通信节点以及节点之间的连接构成的,不同的节点和连接方式构成了不同的网络。因此,要开发一个网络应用程序,首先应该决定网络的组建方式。如图所示,一般有三种组网的方法:图a为一对一的客户端接入服务器的方式;图b为多端通信的客户端接入服务器方式;图c为集服务器客户端一体的自组织特性网络方式。图2.1 网络的组建方式考虑到本次软件是由任意两台电脑接入网络后就能进行通信,因此选用第三种方式,即自组织特性网络方式,只要需要通信时,主叫端就为客户端,被叫为服务器端,这样就能实现我们的单呼和组呼功能。四、C/S模式在网络连接中,有一种常用的模式是客户机/服务器网络12。其中客户机和服务器都是网络中的一种终端设备,甚至可以一个电脑可以同时充当一个客户机和另外的客户机的服务器。客户机必须要服务器对其提供所需的网络资源,服务器也需要接受客户机的指令来完成相应的动作。它是软件系统体系结构,通过它可以充分利用两端硬件环境优势,将任务合理分配到客户端和服务器端来实现,降低了系统的通讯开销3并且提高了效率。服务器的程序必须在客户机的程序的启动之前开始,并且是在客户机的响应结束之后整个进程才完全结束。这种程序设计方式适用于目前的Web网络程序的开发,是目前应用程序的发展方向。第三节 基于Windows套接字的网络应用程序编程前面已经提到过,IP网络公务电话实际上就是一个网络应用程序。所谓的网络应用程序就是通过IP网络协议,也就是TCP/IP协议栈来进行通信。网络应用程序要使用TCP/IP协议来实现自己的功能,只能通过由系统提供给用户的TCP/IP协议编程接口来实现4。也就是说,网络应用程序要通过API来完成,在windows系统中,我们采用windows Socket,也就是套接字来完成接口功能。一、套接字接口 套接字接口也叫套接口, 它就像无线终端要进行通话时,要首先连接到各自一个基站一样,当应用程序要进行通信时,它们都要找到到各自的一个接口13。然后它们把要传达的信息输入到即将发送的Socket中,然后由这个Socket通过一个网络接口卡,从而能够通过IP网络来承载传输。这样就实现了套接字的传输模式,如图2.2所示5。图2.2 Socket套接字传输原理图根据不同的网络应用程序的不同需求,一般的网络系统提供的网络接口,有三种不同的类型:流式套接字(SOCK_STREAM)这是一种面向连接的、可靠的Socket服务,它可以实现数据的传输错误,没有重复。在TCP/IP协议栈中,它使用TCP协议进行字节流的传输。这种方式可以运用到可靠性高的用户中,在本次程序设计中,运用在对信令的传输中;数据报套接字(SOCK_DGRAM)是一种无连接,不可靠的TCP / IP套接字服务,协议栈,它使用UDP协议进行通信14。在轻负载的网络,你可以使用数据报套接字和提高沟通效率;原始套接字(SOCK_RAM)这主要是用于测试或安装网络设备时使用。二、Socket套接字网路编程步骤对于不同类型的网络接口,我们有不同的套接字程序编写流程。1用于无连接的Socket系统调用流程Socket套接字是采用客户/服务器模式(C/S)工作的。即开始通讯前,服务器预先启动,不断监测客户对其的请求,一旦客户发送一个请求,它将作出相应的反应。如图2.3,是用于无连接的Socket系统调用流程图5。图2.3 UDP的 Socket系统流程图首先,服务器预先启动,用Socket()函数创立一个Socket套接字,再用bind()函数将套接字和本地地址绑定在一起,然后用recvfrom()函数和sendto()函数用于发送和接受UDP的数据包。最后,用closeSocket()和WSACleanup()函数来关闭套接字,终止服务5。在面向无连接的Socket套接字流程中,客户端的流程和服务器端的流程是一样的。当要进行一次通信时,首先同样用Socket()函数来建立一个客户端的套接字,调用bind函数将套接字和本地地址绑定在一起。然后用recvfrom()函数和sendto()函数用于发送和接受UDP的数据包。最后,用closeSocket()和WSACleanup()函数来关闭套接字,终止服务5。2.用于面向连接的Socket系统调用流程图2.4 TCP的 Socket系统流程图首先,服务器预先启动,用Socket()函数创立一个Socket套接字,再用bind()函数将套接字和本地地址绑定在一起,然后通过listen()函数监听客户端的连接请求。等到监听到客户端的connect()的指令时,就立即调用accept()函数接受连接请求。注意,这时没有连接请求时,服务器是阻塞状态,陷入死循环,与异步套接字相区别6。在accept()函数调用完毕后,用recv ()函数和send()函数用于发送和接受TCP的数据包。最后,用closeSocket()和WSACleanup()函数来关闭套接字,终止服务5。客户端的流程就比较简单了。当要进行一次通信时,首先同样用Socket()函数来建立一个客户端的套接字,调用bind函数将套接字和本地地址绑定在一起。用connect()函数用于向服务器端发送连接请求,并且建立TCP连接。然后进入通信状态,用recv ()函数和send()函数用于发送和接受TCP的数据包。最后,用closeSocket()和WSACleanup()函数来关闭套接字,终止服务7。三、基于消息的异步套接字Windows系统的套接字有两种执行I/O的操作模式:同步阻塞方式和异步非阻塞方式。“同步”是指进程在函数功能执行完成之后再返回,“异步”是指函数只执行一些简单功能,具体实现是在消息循环或其他进程里完成10。同步阻塞方式的套接字设计简单易用,但效率较低,而异步非阻塞方式的使用相对复杂,但效率很高。在本次程序设计中,我们采用的是异步套接字的方法。异步套接字的使用步骤是:加载套接字库,进行版本协商;创建套接字,并绑定到指定的端口;调用WSAAsynSelect函数请求一个windows基于消息的网络事件通知,调用成功后,开始准备接收数据;在消息响应函数中申请调用recvfrom()函数接受数据;建立发送Socket和INADDR_ANY绑定;调用WSASendto发送数据。第四节 链表结构链表结构是一种数据结构,它能够储存一系列的数据,是数据结构研究的一个重要课题,也是数学建模里面重要的一个组成部分,应用的领域非常广泛15。单链表是链表中的一种,它能够帮助我们存储、查阅、添加表项,本次程序设计在添加信息的时候运用到了单链表的知识。图2.5 单链表结构单链表是用于数据元素之间是线性关系的时候14。如图b所示,它可以看成是一个节点连接另一个节点,这样连成一个链子的形状,于是我们形象的把它叫做单链表。如图a所示,单链表的每个节点是由两部分构成。第一部分是存放在里面的元素,第二部分则是下一个节点的存放地址,我们可以通过名叫next的地址内容寻找的我们所需要的下一个节点,这就是单链表的结构特点,也是我们解决表格问题的很好的方法。第五节 多线程编程进程是在计算机的程序自身地址中的一次执行活动,是程序的一个实例;线程是进程中一个单一顺序的控制流8。进程由两部分构成,内核对象和地址空间;线程也是两部分,内核对象和线程栈。进程就像是一个容器,储存着所有执行模块和动态内存分配空间,但不会执行代码。所有的程序代码执行都是在进程中的线程中执行的9。由于线程能够记录的东西很少,但消耗比进程小很多。所以我们一般希望在一个进程中,调用多个线程,从而能够实现预期的功能。如图2.6是单线程与多线程的运行过程,由图可见,多个线程同时访问进程中的虚拟地址空间、全局变量以及其他资源,这样,多线程就能够实现在同一个进程中进行操作,并且能够方便的进行相互通信11。图2.6 单线程与多线程运行过程示意第六节 本章小结本章简要介绍了开发IP网络公务电话应用程序所用到的原理和实现平台。MFC是微软公司提供的基于windows系统下程序开发的一种应用程序设计类库。我们有了这个库就能在VC+6.0上很轻松的设计基于windows的应用程序设计了。本章第一节介绍了VC+6.0的开发平台,并且对MFC做了重点介绍。IP网络将这个世界连接成了一个信息一体化的整体。TCP/IP协议是我们网络程序实现在IP网络承载下进行通信所要遵守的重要协议。因此本章第二节介绍了TCP/IP的四层模型,并且对包括IP地址、网络组建方式以及C/S模式进行了简要的介绍。在这个MFC库中,定义了一种windows Socket的套接字,这种套接字能够实现在windows操作系统上通过IP网络进行程序间的通信。因此,这是网络应用程序设计中必不可少的一步。本章第三节介绍了Socket的编程过程,并且,分析两种不同的套接字,即面向连接的流式套接字和面向无连接的数据报套接字。最后介绍了异步套接字的基本知识。本章第四节介绍了链表结构的知识,单链表能够帮助我们进行网络信息的存储、添加、修改以及查询等功能。本章最后一节介绍了多进程以及多线程编程,对进程和线程进行了介绍并且分析了多线程的好处和弊端。第三章 开发可行性及需求分析第一节 开发的可行性本次软件开发是基于Virtual C+6.0的平台,这个平台能够不仅能够实现编译、调试等功能,而且还包含了MFC,也就是说,在这个平台下进行开发,我们能够享受MFC的所用类以及类里面的成员函数。MFC中包含了CDialog以及CAsyncSocket类,因此可以进行对话框设计并且能够调用异步套接字来完成相应的通信功能。通过本科四年的学习,我掌握了C+语言的程序编程,并且对IP网络的知识有一定的了解。对于开发这次的网络应用程序,在技术层面开发这次软件是可行的。另外,基于这次的程序开发是在VC+6.0上面,只需要一个计算机就能进行开发。因此开发成本很低。而且由于运用了MFC,很多Windows的框架结构的编程过程可以轻松的省去,大大降低了开发所用的时间并且缩短了代码,降低了时间成本。在程序测试的工程中,我们也只需要两台或三台电脑进行相互的单呼和组呼通信,就可以保证测试的可靠性,成本也不高。由此我们可知,在成本层面上开发这次软件是可行的。第二节 需求分析所谓需求分析,就是要明确设计出来的系统能够做什么。只有首先明确了这一点,我们才能更好的完成对软件功能的设计,才能保证完成的软件最终的质量。本次的课题是基于Socket的IP公务电话的设计与实现,这是在VC+6.0平台下进行的网络应用程序设计。这个程序应该能够在IP网络中进行即时语音通讯。对于所设计的网络,我们不仅需要它能实现组播通信,还能实现一个节点与网内的另一个节点能够进行一对一的通信,因此,我们必须选择具有自组织特性的网络,也就是第二章图2.1中的C图的类型。当一个节点需要与另一个节点通信时,软件就应该让这个节点作为客户端,要呼叫的那个节点就作为服务器端,这样就能实现客户/服务器之间的通信。对于这个软件的性能,我们还应该满足实用性、安全性、可移植性、可扩展性。也就是说,我们做出的这个软件,能让用户方便的操作,并且能够安全可靠的进行即使语音传输,而且能够直接拷贝,不需要安装就能在Windows的电脑上运行。另外这个程序还应该能够进行优化和扩展。这个程序设计的预期结果就是能够实现IP公务电话的单呼和组呼的即时通信功能。当对每一个接入网络的电脑的信息配置成功的时候,任意一台电脑通过拨打另一台电脑的公务号码,就能进行一对一的网络电话通信;当一台电脑播出“000”的时候,就能与同该电脑在同一组的所有电脑进行通话。第三节 本章小结本章的主要内容是对设计整个软件的开发可行性的研究以及及需求分析。其中开发可行性主要对程序的开发成本、测试成本以及掌握的知识进行了分析,证明了该课题具有很强的可行性。需求分析主要介绍了网络组建的要求以及对软件设计结果的预测。第四章 IP网络公务电话系统总体设计第一节 设计目标本次设计的目标是设计一个IP网络公务电话系统,这个系统能够实现包括拨号、振铃、接通、通话、挂断在内的单呼公务电话的功能,以及实现一个群组之内的公务电话呼叫的组呼功能。通过这个软件,用户可以将电脑作为公务电话进行所需通信。第二节 系统框架设计图4.1是整个IP公务电话系统的系统框架设计图。从图中我们可以看到整个模拟系统分为这样几个部分:界面操作层、业务逻辑层和Socket通信层,下面分别介绍各个层的功能及程序设计架构。图4.1 IP公务电话系统系统框架设计一、界面操作层主要负责话机界面信息的显示、消息的提示、业务音的播放、话机按键操作及配置文件的设计及修改。用户通过界面层的拨号按键的操作,可以发起单呼和组呼请求;通过对话机记录的操作可以查看话机历史记录;通过对系统配置的操作可以完成对话务系统的系统配置工作。这些配置包括对IP地址、公务号码、公务编号、组号的配置。二、业务逻辑层业务逻辑层位于界面层和数据传输层之间,它主要完成对话机信令的采集、处理和发送等功能,完成对语音数据的采集压缩和语音播放功能。在界面操作层执行的每一个操作都有具体的消息来对应进行下发,信令处理模块通过对信令的分析和处理作出相应的响应,语音模块通过对语音的采集和处理完成相应的功能,对于需要网络传输的则进行数据的封装。通过各线程之间的数据交互,实现了各自的功能,并交给下一层进行处理。三、数据传输层该层是利用Socket进行数据传输,创建面向连接的套接字处理信令和非面向连接的套接字处理语音数据。同时,该层利用到了socket的异步机制,从而更灵活的实现对数据的操作。该层也是我们能够实现通信的核心层。第三节 类的设计一、类设计的基本情况为了实现上述三层的功能,按照VC+编程的思想,我们需要将完成不同功能的操作规划成不同的类以及类里面的成员函数或构造函数。当我们想完成某项功能时,直接启用一个我们已经编写好的此功能的类的对象,并按照其相应的成员函数的所需参数对应写好,就能即方便又清晰的完成我们的逻辑关系,实现所需功能。对于这三层功能实现,本次设计一共设计了12个类和3个结构体来实现。其中,CIPPHONEDlg、CSysSettingDlg、CHistoryDlg是实现界面操作层的类,他们都是继承了MFC的Cdialog类,也就是说,它们都是对话框类的派生出来的。CSignalDeal、CNumberList、CManageSound、CCaptureSound、CPlaySound类是实现业务逻辑层的类。其中,CNumberList类利用了单链表实现了对列表以及信令包的管理功能;CSignalDeal类则实现了信令处理模块的功能;CManageSound、CCaptureSound、CPlaySound类则是实现的语音数据的采集压缩和语言播放功能。CSignalSerSocket、CSignalCliSocket、CSignalAcpSocket和CSoundSocket类实现了数据传输层的功能。CSignalSerSocket、CSignalCliSocket、CSignalAcpSocket都是由MFC的CAsyncSocket类派生出来的,也就是说,它们能够使用异步套接字的相关函数。能够更高效的实现面向连接的套接字操作,交互客户机/服务器之间的信令,当交互完成之后,交给CsignalDeal类来完成相应的信令处理;CSoundSocket则是实现对包括单呼和组呼的套接字数据传输,这是面向无连接的套接字操作,能够更快速的传输数据,满足语音通信功能。另外,本次设计还定义了三个重要的结构体:SignalPacket、NumberListNode和Numberlist。SignalPacket实现了对信令包的设计,本次设计的所有信令都是用的这个结构体的结构;NumberListNode和Numberlist利用了单链表结构实现了对系统配置中的列表的设计。二、各个类的基本介绍下面简要介绍一下各个类所完成的功能:CIPPHONEDlg类:首页的对话框类。这是整个程序的入库函数,即程序每次从开启到终止时经历的全过程。在这个类中我们实现了对每个类的逻辑调用和各线程的实现,从而完成IP公务电话的所有功能。CSysSettingDlg类:系统配置的对话框类。它通过对话框,让用户通过控件完成对包括IP地址、公务号码、公务编号、组号的配置。并能使用户可以添加、修改、删除、清空和显示配置情况,CHistoryDlg类:通话记录的对话框类。它能显示用户通过这个软件所进行的通话时间、通话时长以及通信对端的用户信息等相关信息。CNumberList类:号码列表类,负责号码表的维护。CCaptureSound类:负责语音数据的采集及发送。首先创建并初始声音采集设备,创建语音采集缓冲区,设置缓冲区的通知位置,创建一个发送线程,把缓冲区中的语音数据发送到指定的用户(单呼),或着小组中其他用户(组呼)。CPlaySound类:负责语音数据的接收及播放。首先创建并初始化因声音播放设备,创建多个声音缓冲区,创建一个接收线程,把接收到的语音数据存入到对应的声音缓冲区中,循环播放缓冲区中的语音数据。CManageSound类:负责管理语音采集和播放设备的创建和释放。CSignalSerSocket类:异步套接字类,负责数据发送接收。CSignalAcpSocket类:异步套接字类,负责数据发送接收。CSignalCliSocket类:异步套接字类,负责数据发送接收。CSignalDeal类:信令处理类,负责信令处理。CSoundSocket类:负责语音数据的发送及接收,采用UDP方式,单呼和组呼的语音数据都使用这个类来传输。三、类设计图如图4.2是本次设计类设计图。该图显示了所有类之间的关联,以及每个类里面一部分构造函数、构析函数、成员函数和成员变量。图4.2 类图设计第四节 信令机制设计在信令包格式中我们设计了包括标志位、子标志位、IP地址、掩码、公务编码、号码、组号、话机状态、缓存顺序等,其中通过前两种标志共同完成对信令包类型的确定,以完成话机工作下的各种信令。具体实现是在CsignalDeal类中定义了SignalPacket的结构体。图4.3 信令包格式在信令标志位中,我们将详细列出标志位所代表的各个含义,其中信令消息主要分为三类,请求信令、回复信令和通知信令。具体标志位含义如下:表4.1 信令标志标志位标志位类型数值设计中规定的代表含义REQUESTINGFlag0x01通话请求消息REQUEST_SINGLEChilFlag0x02单呼请求消息REQUEST_GROUPChilFlag0x03组呼请求消息REQUEST_BOARDChilFlag0x04广播请求消息REPLYINGFlag0x05通话回复消息REPLY_WAITTINGChilFlag0x06回复等待消息REPLY_REFUSEREQUESTChilFlag0x07回复拒绝消息NOTIFYINGFlag0x08通话告知消息NOTIFY_ACCEPTChilFlag0x09通知接收消息NOTIFY_REFUSEChilFlag0x0A通知拒绝消息NOTIFY_ENDINGChilFlag0x0B通知结束消息UPDATINGFlag0x0C通知更新消息(暂未使用)第五节 界面操作设计为了实现公务电话的功能以及各种功能,我设计出了三个界面来用于用户的交互。设计如下:首先是拨号界面,也就是主界面的设计:该界面分为了信息提示区、拨号键盘区、功能键盘区和本机信息区。图4.4 主界面系统设置界面的设计:图4.5 系统配置界面通话记录界面:图4.6 通话记录界面第六节 话机状态设计在话机状态设计中,我们充分考虑了公务IP电话的各个状态,设计了话机的状态标志。在话机的工作中,通过对状态的判断完成对铃音的播放和信令的处理,同时又将信令的处理结果通过话机状态来显示出来。在本系统的设计中,以下是具体的状态设计。表4.2 状态标志状态标志标志值设计中规定的代表含义IDLE0x01空闲状态(挂机状态)IDLE_PHONERING0x02空闲振铃状态IDLE_BEFOREEND0x03空闲状态(特定主动挂机情形下)HOLDING0x04摘机状态HOLDING_DIALING0x05摘机拨号状态HOLDING_WAITING0x06摘机拨号后等待状态HOLDING_DELAYING0x07摘机拨号延迟状态HOLDING_BACKRING0x08摘机拨号收到回铃音状态HOLDING_BUSY0x09摘机拨号收到忙音状态HOLDING_TALKING0x0A通话状态HOLDING_TALKING_SINGLE0x0B单呼通话状态HOLDING_TALKING_GROUP0x0C组呼通话状态HOLDING_TALKING_BOARD0x0D广播通话状态HOLDING_TALKING_ENDING0x0E通话结束状态(特定被动话机情形下)在话机的众多状态中,用户的操作可以改变当前话机的状态,在信令的传送和处理后都能导致状态的转变,下面将展示状态的转移图。图4.7 状态转移图第七节 系统程序线程设计本系统设计中,我们采用了多线程技术对语音采集、语音播放、信令处理、铃音播放、拨号采集、信息提示等等进行处理,利用多个线程协同完成话机的各个功能。下面展示的是本系统的线程处理。图4.8 线程设计第八节 本章小节本章详细介绍了本次仿真系统的设计思路。设计目标是仿真一个IP公务电话系统,其系统框架分为界面操作、业务逻辑、数据传输三层。并分析了12个类和3个结构体在系统结构中所完成的功能,介绍了信令机制设计,界面设计、话机状态设计以及线程设计。第五章 IP网络电话关键程序实现第一节 用于语音传输的面向非连接的套接字本次设计用CSoundSocket类来实现语音数据的传输,该类是用异步套接字的方式进行的一系列套接字操作。它完成了套接字中版本协商、套接字创建、绑定端口以及单呼和组呼的接收和传输,并且关闭套接字的操作。该类的主要成员函数有:create(UINT LocalPort,UINT RemotePort,char * pAddr)、Bind()、JoinMulticast()、SendTo(char *pBuf,int iLen)、RecvFrom(char *pBuf,int iLen)和Close()。以下是实现以上函数所实现的功能介绍:Create(UINT LocalPort,UINT RemotePort,char * pAddr):首先进行了版本协商,规定使用2.2版本的套接字,这也是最高版本,支持异步套接字的函数。然后利用WSASocket函数创建一个支持组播和单呼的异步套接字接口,其套接字类型为SOCK_DGRAM,也就是说是面向无连接的套接字。最后将本地端口、对端端口和目的IP地址用传入的参数传给自己的成员变量。 Bind():这是用于单呼的套接字绑定,先定义一个SOCKADDR_IN的对象sockadd,然后对里面的成员进行赋值,最后用bind函数将套接字绑定到LocalPort端口上。 JoinMulticast():这是用于组播的套接字绑定,先定义一个SOCKADDR_IN的对象addr,然后对里面的成员进行赋值,然后进行了组播的设置,并且屏蔽掉本机数据,最后绑定各端口的套接字。 SendTo(char *pBuf,int iLen):先重新定义一个SOCKADDR_IN的对象ADDr,然后对里面的成员进行赋值,最后返回一个sendto函数,实现发送数据的功能。 RecvFrom(char *pBuf,int iLen):先定义一个整型变量存放送来的SOCKADDR_IN对象的长度,再定义一个SOCKADDR_IN的对象RemoteAddr,最后返回一个recvfrom函数,实现接受数据的功能。 Close():用closesocket函数关闭所用的套接字。第二节 用于信令传输的面向连接的套接字由第一章我们可以发现,面向非连接的套接字的客户机与服务器的流程是一样的,所以在编写面向非连接的套接字时,我们可以将所有客户服务器操作用同样的函数完成。但面向连接的套接字则比较麻烦,所以这次就采用了将客户机,服务器的程序分成不同的类来完成:CSignalCliSocket、CSignalAcpSocket和CSignalSerSocket类分别完成自己的功能。它们都是从CAsyncSocket类继承过来的。CAsyncSocket类为我们使用Socket套接字简化了许多繁琐的过程,大大提高了我们编程的效率。对于Socket的WSAStartup和bind的绑定,可以用create函数调用替代,IP地址类型转换、主机名和IP地址转换的过程中许多复杂的变量类型都被简化成字符串和整数操作。CAsyncSocket:Create()有一个参数指明了你想要处理哪些Socket事件,这个Socket默认就被用作了异步方式,并且创建了一个CSocketWnd窗口对象,并且将这个SOCKET与该窗口对象关联,以让该窗口对象处理来自Socket的事件(消息),然而CSocketWnd收到Socket事件之后,只是简单地回调虚函数。所以我们只需要在虚函数中添加所需的代码。CsignalCliSocket类CsignalCliSocket是客户端的套接字程序,它的成员函数有OnConnect(int nErrorCode)、OnReceive(int nErrorCode)和OnClose(int nErrorCode)。OnConnect(int nErrorCode):调用了CasyncSocket的成员函数OnConnect,实现客户机向服务器套接字的连接请求。 OnReceive(int nErrorCode):先调用了CasyncSocket的成员函数OnReceive,通知套接字缓冲中有数据,再用Receive函数接收数据,调用成功时,返回接收到的字节数。再将数据存入SignalPacket的信令包中交给CsignalDeal类处理。OnClose(int nErrorCode):调用了CasyncSocket的成员函数OnClose,通知该套接字连接上的对应套接字已经被相关进程终止了。CSignalAcpSocket和CsignalSerSocket类CSignalAcpSocket和CsignalSerSocket类是服务器端的程序它们的主要成员函数有:OnAccept(int nErrorCode)、OnClose(int nErrorCode) 和OnSend(int nErrorCode) OnAccept(int nErrorCode):调用了CasyncSocket的成员函数OnAccept(nErrorCode),通知监听套接字现在可以调用Accept成员函数来接收悬挂的连接请求,再调用Accept成员函数接受请求。 OnSend(int nErrorCode):调用了CasyncSocket的成员函数OnSend,通知套接字现在可以调用Send成员函数发送数据。 OnClose(int nErrorCode):通知该套接字连接上的对应套接字已经被相关进程终止了,释放内存。第三节 通话过程的实现由第二章的第四节和第五节,我们简单了解了我们通话的流程,本节介绍这些流程在程序中的实现。由流程图我们可以知道,用户摘机,拨号,挂机等操作都是在用户的拨号界面(主界面)进行的,所以我们要实现通话流程,就应该在IPPHONEDlg类中的按键函数中实现。于是,我们首先应该在摘机按下是添加一个拨号进程DialingThread,然后再拨号进程中实现拨号超时、送忙音等操作,最后拨号成功后判断是单呼还是组呼,并进行单呼处理或组呼处理。下面分别介绍单呼和组呼处理的实现一、单呼处理单呼处理分为主叫和被叫,一台主机可能是主叫也可能是被叫,所以要分为主叫和被叫来编写程序。1主叫端处理首先创立一个信令包结构体的对象,然后将本机的信息写入这个信令包中,然后在列表中找到拨出的号码,在信令包中添加对端的ip号和单呼请求以及本机状态,创建一个CsignalCliSocket类的对象,绑定单呼端口和对端ip地址后,调用create函数创建套接字,并用connect函数向对端服务器发出连接请求,等连接成功后将信令包发出,然后进入单呼主叫端通话进程。在单呼主叫端通话进程中,我们首先也是将本机的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年临沂沂南县教育系统部分事业单位公开招聘教师(5名)模拟试卷及完整答案详解一套
- 员工个人工作总结15篇
- 2025年合肥市骨科医院招聘41人考前自测高频考点模拟试题及1套参考答案详解
- 2025年下半年甘肃省事业单位招聘分类考试笔试临夏考区考前自测高频考点模拟试题附答案详解(典型题)
- 2025年河南投资集团-大河智运物流(河南)有限公司招聘10人考前自测高频考点模拟试题附答案详解(模拟题)
- 2025年数字水印技术在工业互联网平台数据安全监控与预警报告
- 2025年多式联运信息平台运营效率提升策略报告
- 2025年快时尚模式在时尚零售行业的数字化营销研究报告
- 2025年工业互联网平台微服务架构性能测试与跨平台兼容性分析报告
- 2025年工业机器人在柔性制造系统中的应用安全与风险控制报告
- 食品行业创新与研发
- 电力各种材料重量表总
- 樊荣-《医疗质量管理办法》核心制度要点解析与案
- 男性不育症诊治指南课件
- 《声声慢》省赛一等奖
- 消防安全教育培训记录表
- 国家开放大学《实用管理基础》形考任务1-4参考答案
- 2023混凝土结构耐久性电化学修复技术规程
- 变压器主保护基本知识测试题
- 食品有限公司制冷机安全风险分级管控清单
- 转型中的地方政府:官员激励与治理(第二版)
评论
0/150
提交评论