圖2展示了與遠程終端建立通信關(guān)系時(shí)H.323協(xié)議棧必須執行的流程。注意,同一水平線(xiàn)上的流程可能同時(shí)運行,但是他們都完成后該時(shí)序才能繼續下去。
Q.931呼叫建立流程啟動(dòng)呼叫建立過(guò)程并且通知遠程終端有一個(gè)呼入。當呼叫建立起來(lái)后,某個(gè)終端可能啟動(dòng)H.245規定的主從判斷流程或能力信息互換流程。每個(gè)終端都需要執行能力信息互換流程,但是只要一個(gè)終端執行主從判斷流程就可以了。主從判斷和能力信息互換完成后,邏輯信道打通了。最后,該對話(huà)通過(guò)另一個(gè)Q.931流程關(guān)閉。
盡管該時(shí)序看起來(lái)直接明了,而且一些依賴(lài)關(guān)系在標準中定義的比較松散,因而很難實(shí)現該時(shí)序。因為僅依賴(lài)關(guān)系就占了H.245規范的257頁(yè)還多,實(shí)現時(shí)很容易疏忽。
另一個(gè)導致混亂的問(wèn)題起因于異步執行的流程。例如,主從判斷流程可以在能力信息互換流程之前或之后執行,而且可能同時(shí)或者相互覆蓋執行。更有甚著(zhù),能力信息互換流程可能在一個(gè)閃斷信道(on the fly once channel)上執行。這樣可以在對話(huà)期間動(dòng)態(tài)改變編解碼器,然而給協(xié)議棧開(kāi)發(fā)增加了工作負擔。
實(shí)現流程
H.323定義Q.931為呼叫信令協(xié)議,在此,將描述怎樣實(shí)現實(shí)際的流程。基于原語(yǔ)的H.323協(xié)議棧要求應用程序開(kāi)發(fā)者定義原語(yǔ)并用其與下層通信。為了方便描述呼叫建立流程,我們從Q.931規范的25頁(yè)文檔中歸納出一個(gè)流程圖(如圖3)。
當實(shí)現呼叫建立流程時(shí),首先發(fā)送建立請求消息,然后該流程等待一條告警指示消息。當該指示消息接收到后,該流程再次等待一條確認消息。如果這條確認消息也接收到了,該流程終止,應用程序可以開(kāi)始處理H.245流程。
為了開(kāi)發(fā)基于原語(yǔ)的H.323協(xié)議棧流程的狀態(tài)機,開(kāi)發(fā)者需要精通H.323協(xié)議,例如上述Q.931呼叫建立協(xié)議。注意,H.245流程比Q.931更具有面向狀態(tài)的特點(diǎn)。每個(gè)H.245流程必須按照標準規定的時(shí)序處理接收到的指示消息并發(fā)送請求消息。每個(gè)狀態(tài)機的具體實(shí)現將需要數月時(shí)間。
如果采用替代方案,H.323協(xié)議棧不使用原語(yǔ),協(xié)議棧需要包括一個(gè)已經(jīng)實(shí)現了上述流程和狀態(tài)機的中間層,并提供一個(gè)簡(jiǎn)化的應用編程接口(API)。對于前面的例子,協(xié)議棧要發(fā)一個(gè)呼出,只需要調用下面這一個(gè)函數即可:
在使用API實(shí)現的系統中,makeCall()函數接受遠程端點(diǎn)的主機名字(hostname)和IP地址,并執行所有呼叫遠程終端的步驟。該方案需要一個(gè)流程構造前述的原語(yǔ),實(shí)現處理所有輸入輸出原語(yǔ)的狀態(tài)機。使用基于A(yíng)PI的協(xié)議棧不需要理解原語(yǔ)接口,可以節省數月的開(kāi)發(fā)時(shí)間。
給原語(yǔ)參數賦值
前文的例子描述了流程的實(shí)現。下面的例子展示怎樣給原語(yǔ)賦值,以能力信息互換流程的“TRANSFER.request”原語(yǔ)為例。