ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:117.16KB ,
资源ID:3290807      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3290807.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于VoIP的电话终端设备的设计与实现Read.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于VoIP的电话终端设备的设计与实现Read.docx

1、基于VoIP的电话终端设备的设计与实现ReadIP电话的设计与实现前言本文从VoIP相关知识入手,介绍了IP电话的软硬件结构设计及实现方案,并描述了IP电话基于SIP的呼叫流程,并通过设计杂项的方式详细描述了系统中的几个关键点。内容仅供大家参考,更详细内容可参见源代码,源代码是最好的老师。VoIP相关知识介绍什么是VoIPVoIP是 Voice over Internet Protocol的缩写,指的是将模拟的声音讯号经过压缩与封包之后,以数据封包的形式在IP 网络的环境进行语音讯号的传输。VoIP技术是目前互联网应用领域的一个热门话题,已经成为下一代网络发展的必然趋势。IP电话为广大电信用户

2、和运营提供了一个成熟的、可实现广泛多媒体业务的终端载体,是下一代网络技术先进性的重要体现,它为基础语音的业务拓展提供了美好灿烂的应用前景。VoIP的基本原理通过语音的压缩算法对语音数据编码进行压缩处理,然后把这些语音数据按 TCP/IP 标准进行打包,经过 IP 网络把数据包送至接收地,再把这些语音数据包串起来,经过解压处理后,恢复成原来的语音信号,从而达到由互联网传送语音的目的。 IP电话系统把普通电话的模拟信号转换成计算机可联入因特网传送的IP数据包,同时也将收到的IP数据包转换成声音的模拟电信号。经过IP电话系统的转换及压缩处理,每路IP电话传输速率可低达811kbps带宽,因此在与普通

3、电信网的传输速率为64kbps带宽相比,IP电话数是原来的58倍。VoIP的核心与关键设备是 IP 网关,它把各地区电话区号映射为相应的地区网关 IP 地址。这些信息存放在一个数据库中,数据接续处理软件将完成呼叫处理、数字语音打包、路由管理等功能。在用户拨打长途电话时,网关根据电话区号数据库资料,确定相应网关的 IP 地址,并将此 IP 地址加入 IP 数据包中,同时选择最佳路由,以减少传输时延, IP 数据包经 Internet 到达目的地的网关。在一些 Internet 尚未延伸到或暂时未设立网关的地区,可设置路由,由最近的网关通过长途电话网转接,实现通信业务。 VoIP的主要关键技术实现

4、VoIP的主要关键技术如下:1) 语音压缩技术:IP电话的技术基础是语音压缩技术。目前用于IP电话的标准是G.723.1,G.711alaw/ulaw和G.729a。2) 静噪抑制技术:又称语音激活技术,是指检测到通话过程中的安静时段即停止发送语音包的技术。通过静噪抑制技术,可大大节省带宽。3) 回声抵消技术:在PBX或局用交换机侧,有少量电能未被充分转换而沿原路返回,形成回声。4) 语音抖动处理技术:IP网络的一个特征就是网络延时与网络抖动,它们可以导致IP通话质量明显下降。网络延时是指IP包在网络上平均的传输时间,网络抖动是指IP包传输时间的长短变化。为了防止这种抖动,人们采用抖动缓冲技术

5、,即在接收端设置一个缓冲池,语音包到达时首先进行缓存,然后系统以稳定平滑的速率将语音包从缓冲池中取出并处理,再播放给受话者。5) 语音优先技术:语音通信对实时性要求较高,在带宽不足的IP网络中,一般需要语音优先技术,即在IP网络路由器中必须设置语音包的优先级最高。这样,网络延时和网络抖动对语音的影响均将得到明显改善。6) IP包分割技术:有时网络上有长数据包,一个包上千字节,这样的长包如不加以限制,在某些情况下也会影响语音质量。为了保证IP电话的通话质量,应将IP包的大小限制为不超过2556字节。7) VoIP前向纠错技术:为了保证语音质量,有些先进的VoIP网关采用信道编码以及交织等技术。V

6、oIP信令协议 目前构建IP电话系统结构的信令协议主要有H.323、SIP和MGCP(H.248)。H.323协议是为多媒体会议系统而提出的,由国际电联ITU 制定,该协议采用传统电信网络繁琐的信令概念,非常庞大,无论从实现技术手段,还是使用和管理方法上都十分复杂。MGCP是互联网工程任务组(IETF)定义发布的,基本思想就是网关分离。将H.323协议的IP网关分为媒体网关(MG)、信令网关(SG)和媒体网关控制器(MGC,又称CA)。其中MG仅负责媒体格式的变换;SG负责信令的转换;MGC才是真正的智能部分,根据收到的信令控制MG的连接建立和释放。这样的分离结构不仅可以大幅度提高中继MG的容

7、量,而且可以提供7号信令的支持,并提高了系统的可用性和鲁棒性。SIP(Session Initiation Protocol)会话初始协议是IETF制订的,用于多方多媒体通信。按照协议定义,SIP是一个基于文本的应用层控制协议,独立于底层传输协议TCP/UDP/SCTP,用于建立、修改和终止IP网上的双方或多方多媒体会话。SIP协议借鉴了HTTP、SMTP等协议,它尽可能的大量采用现有的协议,而不是重建标准,如 HTTP 、 LDAP 、 RADIUS 等,都是技术成熟、应用广泛的协议标准。SIP协议发展前景较好,正逐渐进入商业应用,而且相关的开源项目也比较多,如 VOCAL 、 OSIP 都

8、是比较成熟的、可商业化的 SIP 协议栈。SIP应用崭新的业务模式不断呈现,相关研发和项目投资增长迅速,终端产品价格不断下降,SIP协议正得到越来越广泛的支持,SIP协议以其更加开放、更易扩展、与Internet紧密结合等特性,战胜H.323、MGCP等协议成为VoIP的主流协议。SIP产品将主导未来VoIP通信市场已成为业界人士的共识,基于SIP的IP通信正在成为一个巨大的产业。因此我们采用了SIP协议。IP Phone设计方案 我们的IP电话方案是一款低成本,高性能的解决方案,该方案采用简约设计,主芯片采用Infelion的INCA-IP芯片,此芯片是为IP Phone应用设计的一款SOC

9、解决方案,内部集成32-BIT MIPS CPU、高性能dsp,SLIC,LCD控制器,MAC,PHY单元,CPU主频达到150MHz的主频,DSP达100MHz,在网络处理和语音方面可以达到很高的性能,是现有市场上比较先进的IP Phone Soc解决方案。 软件平台采用vxWorks嵌入式操作系统,vxWorks是世界上领先的嵌入式操作系统,因其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空和航天等高精尖技术及实时性要求极高的领域。信令协议采用SIP协议,主要是由于SIP协议正得到越来越广泛的支持,SIP协议以其更加开放、更易扩展、与Internet紧密结合等特性,战胜H.323

10、、MGCP等协议成为VoIP的主流协议,我们的SIP协议栈是移植的libosip2-2.2.2版本;另外根据国外的需求,后续将要支持IAX2协议。 硬件架构方案主芯片采用Infelion的INCA-IP芯片,内部集成了32-BIT MIPS CPU、高性能dsp,SLIC,LCD控制器,MAC,PHY单元,因此硬件则通过外接flash、SDRAM、手柄、耳机、LCD、键盘和以太变压器来实现。硬件系统构架见下面框图: 软件架构 我们的软件是在vxWorks操作系统的基础上自主开发完成,主要包括:驱动模块(DSP驱动、LCD驱动、以太驱动、键盘驱动等)、OSIP协议栈、ORTP协议栈、呼叫控制模块

11、、用户接口模块(menu、CLI、WEB)、扩展业务模块等。软件系统构架见下面框图: 其中: DSP驱动:Dsp驱动模块是语音、信号处理的核心,完成对语音,数据,信号的采集和发送,同时它还完成对dsp控制、管理的功能。在系统启动时,完成dsp初始化工作。 SLIC驱动:SLIC驱动主要实现对端口摘挂机状态的检测,同时通知上层对摘挂机事件进行相应的处理。 键盘驱动主要负责对键盘事件的检测,并将所检测的事件送到上层。键盘驱动层不负责解析键盘事件的具体含义,而是由上层根据当前话机类型找到相应的键盘布局表,将其转化为对应的按键,并进行处理。 LCD驱动:LCD驱动主要负责对LCD显示屏的操作,并为上层

12、提供统一的LCD操作函数,由上层完成LCD显示。 Ethernet驱动:以太驱动模块负责CPU上以太网控制器的初始化,PHY的初始化,状态检测,数据处理,访问控制。接受物理层的数据,并交给链路层进行处理;同时发送链路层数据到物理介质。 硬件接口层:主要负责本地端点的资源管理控制,将物理接口的事件转化为系统能够识别的事件,为核心控制层屏蔽具体的物理设备细节,保证除驱动层之外其它层的可移植性、硬件无关性。 呼叫控制层呼叫控制层维护端点状态转换关系,根据收到的SIP信令或硬件产生的事件来完成端点状态的转换及呼叫的处理。 SIP协议栈:SIP协议栈是SIP协议的具体实现,包括两部分,分别由开源项目li

13、bosip2-2.2.2及libeXosip2-2.2.3移植而来。 话机工作流程 话机的工作流程要结合SIP协议,SIP协议规定了用来建立,改变和终止基于 IP 网络的用户间的呼叫。 其中主叫端点表示主叫用户,UA1状态机表明了主叫侧呼叫状态的处理;被叫端点表示被叫用户,UA2状态机表明了被叫侧呼叫状态的处理; 假设主被叫用户均是我们的话机,则结合代码实现呼叫流程如下:(1) 主叫键盘检测驱动检测到用户按键,通过回调函数kbdEventCallback()上交,在kbdEventCallback()根据当前话机类型找到相应的键盘布局表,将按键事件转化为对应的按键,并最终调用kbdkey_jo

14、b_add()函数将事件加入到键盘事件处理任务队列中。任务tKbdTask的主处理函数kbdkey_task()被触发,将摘机事件通过函数endpoint_event_notify()通知到呼叫控制层,呼叫控制层判断出是摘机事件EV_OFFHOOK,则先打开DSP通道,然后在offhook_handler()处理函数中放拨号音,将端点状态由IDLE转换为等待拨号状态。(2) 用户拨号,在拨号处理函数dialup_handler()中收集用户号码(注:检测到第一个拨号时要关闭拨号音),并根据拨号规则判断用户是否拨号完毕,一旦检测到拨号完毕,则调用call_originate()发起SIP呼叫。(

15、3) call_originate()中会判断是IP地址拨号还是电话号码拨号,并根据dial-peer配置变换被叫号码,根据SIP配置获得SIP服务器信息,最后调用sip_invite()通过SIP协议栈提供的函数发出invite消息,并将端点状态由等待拨号状态转换为连接中状态。(4) tExosip任务负责处理从SIP获取到的消息事件,被叫先发送100 trying消息(1xx消息是临时消息,表明收到了SIP消息,正进行处理或已放到处理队列中,以告诉对端不必再重传此消息),然后通过call_new()函数通知被叫呼叫状态机进行处理,被叫振铃,发送180或183消息,并将端点状态由IDLE转换

16、到等待摘机状态。(5) 主叫呼叫控制层收到180或183消息,则调用call_ringing()进行处理,通知主叫回铃。(6) 被叫摘机,则调用offhook_handler()进行处理,由于被叫处于等待摘机状态,因此进入到相应的处理流程中,调用sip_200ok()发送200 OK消息;(7) 主叫呼叫控制层收到200 OK消息,则调用call_answered()处理,根据SIP消息进行ACK,并将端点状态由连接中转换为已连接状态。(8) 被叫收到ACK消息,通过函数call_ack()处理,并将端点状态由等待摘机状态转换为已连接状态。至此,双向的媒体连接已建立,主被叫双方可进行正常的语音

17、通话。(9) 被叫挂机,则呼叫控制层调用onhook_handler(),根据当前端点状态调用sip_bye()发送BYE消息,关闭DSP通道,并将端点状态恢复成IDLE状态。(10) 主叫收到BYE消息,SIP协议栈会自动发送200 OK消息,并通过呼叫控制层的call_closed()函数进行处理,关闭DSP,端点状态转换为等待挂机,并释放催挂音。(11) 主叫挂机,则onhook_handler()根据当前端点状态进行处理,并将端点状态恢复成IDLE状态。端点及状态转换图 端点是对物理端口的一种抽象,由于话机只有一个语音端口,因此系统中ENDPOINT_NUM为1,但可以很容易地扩展从而

18、支持更多端口的设备(如网关)。typedef struct endpoint_t / 端点标识部分 char index; /* index, from 0 to ENDPOINT_NUM */ char type; /* endpoint type */ char nameZCOS_EPNAME_LEN; /* endpoint name */ / 端点信息记录部分 char state; /* endpoint state, just simple */ char callee; /* callee or called party */ char offhook; /* FLASE: on

19、hook or TRUE: offhook */ char mute; char holded; /* hold by peer */ char acked; /* received ACK for this dialog */ char firstkey; /* if first key, then stop the dial tone */ WDOG_ID interKeyTmr; /* timer between two keys */ / 不用了 int interkeyTmrVal; /* timer value, seconds */ char dialstrZCOS_PHONEN

20、UM_LEN; /* current dial string */ /* call info */ / 呼叫信息记录,主要是保存与一次会话呼叫有关的信息,这样当进行hold、transfer等时可以找到原来的信息 CALLINFO callinfo; /* / 定时器信息,端点使用了一个统一的定时器,用来支持等待摘机、等待按键、等待对端应答的定时、#define WDOGEVT_WAIT_NONE 0 /* 无*/#define WDOGEVT_WAIT_OFFHOOK 1 /* 等待摘机定时器*/#define WDOGEVT_WAIT_KEY 2 /* 等待按键定时器*/#define W

21、DOGEVT_WAIT_ANSWER 3 /* 等待对端应答定时器*/ */ WDOG_ID wdog; int wdogVal; int wdogEnv; /* reserve information 保存的一些端点信息 */ char displaynameZCOS_USERNAME_LEN; /* 对端可显示的用户名, no use now */ char calledstrZCOS_PHONENUM_LEN; /* 主叫时表示被叫信息,被叫时是主叫号码*/ char callerstrZCOS_PHONENUM_LEN; /* 主叫时表示本端号码,被叫时是被叫号码*/ char dtm

22、fstrZCOS_PHONENUM_LEN; /* 连接后拨的分机号码*/ HOLDCB holdqHOLDQ_SIZE; int mic; /* mic type */ RECENT_CALLS *pRecentCalls; unsigned long callStartTick; /* for configuration 配置信息部分 */ SIP_USER *user; SIP_PHONENUM *phonenumSIP_REGISTRAR_MAX; char hotlineZCOS_PHONENUM_LEN; char prefixZCOS_PHONENUM_LEN; char ton

23、etype; u_char codec; u_char g729payload; /* payload len for G729 */ u_char g723payload; /* 6.3k or 5.3k */ u_char silencecompress; /* silence compress */ u_char volume; /* DSP volume, default is 0, max is 7 */ char baningoing; /* TRUE: no disturb */ char banoutgoing; /* TRUE: ban outgoing */ BOOL ca

24、llwaiting; BOOL calltransfer; BOOL conference; CALLFORWARD callforward; int noanswertime; /* no answer time */ ENDPOINT;话机工作流程一节中也描述了端点状态转换,下图则更详细地描述了端点状态下收到的事件及状态转换关系。 设计杂项MENU工作机制 系统中的menu部分是我们自己设计的,数据结构为:typedef struct menuNode char *pPrompt; /此节点的提示信息 int numChildren; /子节点的个数 struct menuNode *pC

25、hildren; /子节点的入口 FUNCPTR pHandlers; /此节点对应的处理函数 menuNode;通过静态方式组织系统menu节点成员,并通过一个递归方式实现了菜单功能:void menu_main(void) menuExitFlag = FALSE; if(mRootMenuNode.pHandlers) if(*(mRootMenuNode.pHandlers)(mRootMenuNode.pPrompt) = OK) menu_sub(mRootMenuNode.pChildren, mRootMenuNode.numChildren); else menu_sub(m

26、RootMenuNode.pChildren, mRootMenuNode.numChildren); menuExitFlag = FALSE; kbdkey_mode_enter(KBDKEYMODE_NONE);多语言支持 系统可很容易地支持更多语言,这要归功于rcc_language.c提供的多语言支持功能。RCC_Language_Id_add():增加要支持的语言及其前缀标识,如要增加对中文的支持,则可调用RCC_Language_Id_add(RCC_LANGUAGE_CN, RCC_LANGUAGE_ID_CN),这样rcc_language.c在根据相应的提示信息中查找中文就

27、以前缀”|CN”查找,至到遇到分隔符”|”。RCC_Language_Id_show():查看系统支持的语言及前缀标识。RCC_Language_Default_Set():设置默认的语言,即在查找相应的语言帮助信息未成功的情况下使用默认语言显示。RCC_Language_Set():设置当前语言。RCC_Language_Get():获取当前语言。 举一个例子: 在web的登录页面中有一个login(登录)按钮,如果当前语言是英文则显示login,是中文则显示登录,那么代码可这样实现:#define loginPrompt_EN Login#define loginPrompt_CN 登 录

28、#define loginPrompt EN(loginPrompt_EN) CN(loginPrompt_CN),其实loginPrompt的全部信息是:|EN:Login|CN:登录在read_login()中通过RCC_Language_Help_String_Get(loginPrompt, pDest);函数调用,根据当前语言如果是英文,则会从|EN:Login|CN:根据英文的前缀标识EN找到Login,然后传给pDest,这样就获取到了相应的语言,从而可以很容易地支持多种语言。 对于menu、CLI支持多种语言,同上。但需要说明的是如果真正要支持某一语言,则要有相应的字库支持,对

29、于如何支持字库,则可以由牛ben同学进行补充。快速转发实现 我们的系统语音质量好也与我们实现了快速转发有一定的关系(呵呵)。根据软件系统架构图,我们可以看出,当从以太收到语音数据时,会先送到以太的链路层处理,这层有一个主要的工作是去除链路层头部,并将剩下的IP数据交给IP层处理,然后IP层做必要的处理,并剥去IP头部,再将语音数据送到UDP层处理,UDP处理完后再交给RTP层处理,RTP剥离出真正的语音数据,才将其送到DSP,并最终给用户播放出声音来。先不说层层检查会浪费CPU时间,单就各层的任务间切换就会消耗大量的CPU时间,从而导倒语音处理的滞后,因此我们设计了快速转发功能。 快速转发的主

30、要思想是每建立一个会话,就同时建立一个会话地址表(又称快速转发表),其实就是本地(IP + port)与远端(IP + port)的一个对应关系,这样,当以太收到语音数据时,先定位出IP及UDP信息,查找是否在快速转发表项中,如果在,则说明数据是到本地的语音数据,则直接定位到RTP处,取出语音数据,交由DSP处理;而对于DSP打包完成后的语音数据,则根据此表项,直接打包成以太数据,通过调用相应的以太接口处理函数将数据发送出去。相对正常流程,快速转发直接在一个任务中处理了语音数据,并采用了简化方式,从而提高了处理效率。 主要数据结构:typedef struct unsigned long sr

31、cip; unsigned long dstip; unsigned short sport; unsigned short dport;sessionQTKey;如何增加配置命令 我们的设备有四种配置方式:CLI命令行、WEB、MENU及auto-provisioning方式,auto-provisioning方式是为客户定制的自动方式。 CLI命令行:这种方式就是通过终端或telnet进行的交互式配置方式,通过show running-config可以看到当前的配置内容,而show startup-config则可以看到保存到flash中的配置,系统启动时读取flash中的startup文件,并设置话机。对话机的每条配置都必须增加相应的CLI命令,这是由于信息保存就是以命令行的方式保存到flash中。可以没有其它配置方式,但要支持配置可保存,目前就必须支持CLI命令方式。 WEB配置:则为用户提供了一种方便、直观的配置方式; MENU配置:为用户提供

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1