首页 > 新闻 > 专家观点 >

利用基于原语的H.323协议栈开发VoIP系统

2013-11-18 17:11:21   作者:   来源:EET电子工程专辑   评论:0  点击:


    图2展示了与远程终端建立通信关系时H.323协议栈必须执行的流程。注意,同一水平线上的流程可能同时运行,但是他们都完成后该时序才能继续下去。

    Q.931呼叫建立流程启动呼叫建立过程并且通知远程终端有一个呼入。当呼叫建立起来后,某个终端可能启动H.245规定的主从判断流程或能力信息互换流程。每个终端都需要执行能力信息互换流程,但是只要一个终端执行主从判断流程就可以了。主从判断和能力信息互换完成后,逻辑信道打通了。最后,该对话通过另一个Q.931流程关闭。

    尽管该时序看起来直接明了,而且一些依赖关系在标准中定义的比较松散,因而很难实现该时序。因为仅依赖关系就占了H.245规范的257页还多,实现时很容易疏忽。

    另一个导致混乱的问题起因于异步执行的流程。例如,主从判断流程可以在能力信息互换流程之前或之后执行,而且可能同时或者相互覆盖执行。更有甚着,能力信息互换流程可能在一个闪断信道(on the fly once channel)上执行。这样可以在对话期间动态改变编解码器,然而给协议栈开发增加了工作负担。

    实现流程

    H.323定义Q.931为呼叫信令协议,在此,将描述怎样实现实际的流程。基于原语的H.323协议栈要求应用程序开发者定义原语并用其与下层通信。为了方便描述呼叫建立流程,我们从Q.931规范的25页文档中归纳出一个流程图(如图3)。

    当实现呼叫建立流程时,首先发送建立请求消息,然后该流程等待一条告警指示消息。当该指示消息接收到后,该流程再次等待一条确认消息。如果这条确认消息也接收到了,该流程终止,应用程序可以开始处理H.245流程。

    为了开发基于原语的H.323协议栈流程的状态机,开发者需要精通H.323协议,例如上述Q.931呼叫建立协议。注意,H.245流程比Q.931更具有面向状态的特点。每个H.245流程必须按照标准规定的时序处理接收到的指示消息并发送请求消息。每个状态机的具体实现将需要数月时间。

    如果采用替代方案,H.323协议栈不使用原语,协议栈需要包括一个已经实现了上述流程和状态机的中间层,并提供一个简化的应用编程接口(API)。对于前面的例子,协议栈要发一个呼出,只需要调用下面这一个函数即可:

    在使用API实现的系统中,makeCall()函数接受远程端点的主机名字(hostname)和IP地址,并执行所有呼叫远程终端的步骤。该方案需要一个流程构造前述的原语,实现处理所有输入输出原语的状态机。使用基于API的协议栈不需要理解原语接口,可以节省数月的开发时间。

    给原语参数赋值

    前文的例子描述了流程的实现。下面的例子展示怎样给原语赋值,以能力信息互换流程的“TRANSFER.request”原语为例。

分享到: 收藏

专题