亚洲综合伊人,成人欧美一区二区三区视频不卡,欧美日韩在线高清,日韩国产午夜一区二区三区,大胆美女艺术,一级毛片毛片**毛片毛片,你瞅啥图片

您當前的位置是:  首頁 > 新聞 > 國內(nèi) >
 首頁 > 新聞 > 國內(nèi) >

AsteriskARI和通道的詳解

2017-06-08 14:15:43   作者:james.zhu    來源:CTI論壇   評論:0  點擊:


  前幾天的文檔中,我們介紹了Asterisk最新的接口技術(shù)ARI的基本概念。今天,我們專門對ARI對通道管理進行一個背景介紹。本文章介紹如何通過ARI接口來控制通道和終端,結(jié)合撥號規(guī)則和腳本實例來配合測試。
  什么是通道
  Asterisk中,通道是介于終端和Asterisk自己本身的一個通信媒介。它包含了所有相關(guān)信息傳遞到終端,或者從終端傳遞到Asterisk服務(wù)器端。這些信息中包含了信令(設(shè)備狀態(tài)或掛機命令)和媒體(從終端發(fā)送或者接收的語音和視頻)。
  當通道創(chuàng)建以后,這表示成功創(chuàng)建了一個通信的介質(zhì),Asterisk會指定兩個變量,一個是UniqueID -它用來處理通道的整個生命周期。另外一個是unique Name。UniqueID是一個全局的唯一標識符,可以由ARIclient。如果 ARI client不能給通道提供UniqueID,那么Asterisk會給通道設(shè)置一個UniqueID。默認環(huán)境下,它會使用Unix時間戳帶一個不斷遞增的整數(shù) ,和可選的Asterisk系統(tǒng)名稱。
  通道和終端的綁定關(guān)系
  通道名稱有兩部分組成:已創(chuàng)建的通道類型帶一個可描述的通道類型標志符。支持的通道類型取決于Asterisk的配置。這里,我們使用PJSIP通道來和SIP終端設(shè)備進行通信。
\
  在上面的例子中,Alice的SIP終端設(shè)備呼叫Asterisk,Asterisk會指定一個通道帶一個UniqueID-Asterisk01-123456789.1,PJSIP通道驅(qū)動器也指定了一個名稱PJSIP名稱- PJSIP/Alice-00000001。為了對此通道進行控制,ARI操作會使用UniqueIDAsterisk01-123456789.1來進行操作修改的處理。
  內(nèi)部通道- Local Channels
  大部分的通道是介于外部終端和Asterisk本身進行通信。Asterisk也可以創(chuàng)建內(nèi)部的通道。這些通道稱之為 Local 通道-它們用來幫助處理Asterisk中各種資源之間的媒體轉(zhuǎn)移。
  Local channel 是一種非常特別的通道,它們總是以一對通道的方式出現(xiàn)。如果系統(tǒng)創(chuàng)建一個Local"通道"的話,實際上會創(chuàng)建出兩個通道。在local通道之間會出現(xiàn)一個virtualendpoint,它負責來發(fā)送local通道之間的媒體。Local通道中的其中一端是和virtualendpoint永久綁定的,但是另外一端的Local通道則可以通過任何方式被修改或者被控制。Local通道的雙方會各自對對端發(fā)送媒體。
\
  在以上的例子中,ARI已創(chuàng)建了一個Localchannel, Local/myapp@default.同樣,Asterisk會創(chuàng)建一對Local通道,帶了UniqueIDsof Asterisk01-123456790.1 和 Asterisk01-123456790.2。Local通道的名稱分別是Local/myapp@default-00000000;1和Local/myapp@default-00000000;2 -這里的 ;1和;2 表示Local通道的兩個部分。
  在Stasis應用程序中的通道
  當通道在Asterisk中創(chuàng)建以后,它會開始執(zhí)行Asterisk撥號規(guī)則。Asterisk通過context/extension/priority 的方式定義了進入到撥號規(guī)則的通道。通道在不同的層級會執(zhí)行不同的Asterisk應用程序。當優(yōu)先級增加以后,撥號規(guī)則會自動進入到下一個的優(yōu)先級和相應的應用程序,撥號規(guī)則會繼續(xù)執(zhí)行,直到最后撥號規(guī)則的應用程序通知通道掛機或終端設(shè)備自己掛機。
  ARI控制通道是通過Stasis撥號規(guī)則的應用程序。這個特別的程序會從撥號規(guī)則中來控制通道,ARI客戶端連接一個websocket,這個websocket已經(jīng)控制了通道。這里已經(jīng)啟動了一個StasisStart事件;當通道離開這個Stasis撥號規(guī)則的應用程序后-或者它被告知離開,或者因為設(shè)備掛機,然后啟動一個StasisEnd事件。當這個StasisEnd事件啟動以后,ARI不在控制這個通道,通道從ARI釋放出來,返回到撥號規(guī)則中。
  在Asterisk的資源默認情況下不會自己發(fā)送事件連接ARI應用程序。為了獲得資源的事件,必須滿足其中以下之一的條件:
  • 資源必須是已進入Stasis撥號規(guī)則應用的一個通道。在這個環(huán)境中,訂閱是在后臺創(chuàng)建。當通道離開Stasis撥號規(guī)則的應用程序后,訂閱也是在后臺被銷毀。
  • 當通道進入到Stasis撥號規(guī)則的程序后,通道可能會和其他資源進行互動-例如bridge。當通道和這些資源互動時,訂閱事件已經(jīng)被這個資源啟動。當在Stasis撥號規(guī)則中無任何通道后,后臺的訂閱事件被銷毀。
  • 在任何時候,一個ARI程序可以在Asterisk中通過應用程序來訂閱資源。資源操作的話,ARI應用程序就會有自己的訂閱事件。
  舉例:和通道進行通信
  在這個例子中,我們會按照以下方式寫一個ARI應用程序:
  • 當ARI連接以后,它會打印出當前通道的名稱。如果無通道存在,也會有提示信息。
  • 當通道進入到Stasis程序后,它會打印出關(guān)于通道的信息。
  • 當通道離開Stasis程序后,它也會打印離開的通道。
  撥號規(guī)則
  此撥號規(guī)則非常直接:一個extension的通道進入Stasis程序。
\
  Python實例
  在Python例子中,我們是基于ari-py這個支持包來實現(xiàn)的。因為ari支持包通過Python日志系統(tǒng)支持了豐富的信息,我們可以直接設(shè)置使用。帶Error的 basicConfig 可以顯示基本的錯誤信息,它完全可以支持基本的工作需求。最后,我們需要一個終端來發(fā)起對Asterisk的連接。終端使用的方式是ari.connect 的方式,這里,我們需要設(shè)置三個參數(shù):
  一個HTTPURL連接。這里,我們假設(shè)腳本運行在同一臺服務(wù)器,使用AsteriskHTTP 服務(wù)器默認端口- 8088。
  使用的是ARI用戶名稱連接服務(wù)器。這里,我們設(shè)置為asterisk。
  ARI賬號密碼是asterisk。
  注意:
  當用戶是生產(chǎn)系統(tǒng)時,請修改默認的用戶名和密碼。
\
  一旦我們發(fā)起了連接,第一個任務(wù)是打印出當前所有的通道,如果沒有通道則打印無通道信息。通道資源可以支持- GET/channels操作。因為ari-py 支持包是動態(tài)操作的,它操作的對象結(jié)構(gòu)可以通過映射到方式來進行,我們這里可以使用列出所有通道資源的列表來實現(xiàn)對通道的各種控制:
  \
  通過GET/channels 的操作可以獲得通道資源的列表。這些資源是從操作中通過JSON的格式返回,同時,ari-py支持包會轉(zhuǎn)換uniqueid 的用戶屬性來附加到操作對象,它會把其他的信息保存在JSON目錄下。因為,這里我們僅需要此名稱,所以,我們這里僅通過JSON提取名稱,然后打印此名稱。
  下一步,當通道進入到Stasis應用程序channel-dump后,我們打印出通道的相關(guān)信息,離開時打印出通道名稱。為了實現(xiàn)以上要求,我們需要訂閱StasisStart 和 StasisEnd 事件:
\
  這里,我們?nèi)匀恍枰獌蓚函數(shù)來處理stasis_start_cb 負責StasisStart 的事件,stasis_end_cb 處理StasisEnd 事件:
  \
  最后,系統(tǒng)需要告訴終端來運行應用程序。一旦client.run執(zhí)行以后,系統(tǒng)會做一個websocket連接,應用程序會一直等待觸發(fā)的事件。用戶可以使用 Ctrl+C 組合鍵來殺死這個連接。
\
  channel-dump.py
  完整的channel-dump.py 代碼:
  channel-dump.py
\
  channel-dump.py 實戰(zhàn)測試
  以下是channel-dump.py的輸出結(jié)果。第一次連接以后,沒有發(fā)現(xiàn)任何的通道,然后Alice(extension1000)使用的PJSIP通道進入到Stasis應用程序。輸出打印所有Alice的通道信息。一段時間以后,她掛機離開了應用程序。
  \
  JavaScript (Node.js)
  在這個例子中,我們是基于Node.js ari-client 這個支持包來實現(xiàn)的。我們需要一個終端來發(fā)起對Asterisk的連接。終端使用的方式是ari.connect 的方式,這里,我們需要設(shè)置三個參數(shù):
  一個HTTPURL連接。這里,我們假設(shè)腳本運行在同一臺服務(wù)器,使用Asterisk HTTP 服務(wù)器默認端口- 8088。
  使用的是ARI用戶名稱連接服務(wù)器。這里,我們設(shè)置為asterisk。
  ARI賬號密碼是asterisk。
  注意:
  在生成系統(tǒng)中,一定要修改實例中的用戶名稱和密碼。
\
  一旦我們發(fā)起了連接,第一個任務(wù)是打印出當前所有的通道,如果沒有通道則打印無通道信息。通道資源可以支持- GET/channels操作。因為ari-client支持包是動態(tài)操作的,它操作的對象結(jié)構(gòu)可以通過映射到方式來進行,我們這里可以使用列出所有通道資源的列表來實現(xiàn)對通道的各種控制:
\
  通過GET/channels 的操作可以獲得通道資源的列表。這些資源是從操作中通過JSON的格式返回,同時,ari-client支持包會轉(zhuǎn)換uniqueid 的用戶屬性來附加到操作對象,它會把其他的信息保存在JSON目錄下。因為,這里我們僅需要此名稱,所以,我們這里僅通過JSON提取名稱,然后打印此名稱。
  下一步,當通道進入到Stasis應用程序channel-dump后,我們打印出通道的相關(guān)信息,離開時打印出通道名稱。為了實現(xiàn)以上要求,我們需要訂閱StasisStart 和 StasisEnd 事件:
  \
  這里,我們?nèi)匀恍枰獌蓚函數(shù)來處理stasis_start_cb 負責StasisStart的事件,stasis_end_cb 處理StasisEnd 事件:
\
  最后,系統(tǒng)需要通知終端來運行應用程序。一旦client.run執(zhí)行以后,系統(tǒng)會做一個websocket連接,應用程序會一直等待觸發(fā)的事件。用戶可以使用 Ctrl+C 組合鍵來殺死這個連接。
\
  channel-dump.js
  完整的channel-dump.js 源代碼:
\
  channel-dump.js 實戰(zhàn)測試
  以下是channel-dump.js的輸出結(jié)果。第一次連接以后,沒有發(fā)現(xiàn)任何的通道,然后Alice(extension1000)使用的PJSIP通道進入到Stasis應用程序。輸出打印所有Alice的通道信息。一段時間以后,她掛機離開了應用程序。
\
  以上技術(shù)結(jié)合介紹了ARI對通道的基本使用方式和兩個腳本實例,在未來的文檔中,我們會介紹ARI接口對媒體的控制和管理,以及ARI配置,ARI中的等待橋接的幾個關(guān)鍵要點。
  獲得有價值的技術(shù)分享,請關(guān)注我們的微信號:asterisk-cn, 技術(shù)論壇:www.freesip.org.

相關(guān)熱詞搜索: Asterisk ARI

上一篇:淮安移動開展高考溫馨服務(wù)行動

下一篇:最后一頁

專題