您當(dāng)前的位置是:  首頁 > 資訊 > 國(guó)內(nèi) >
 首頁 > 資訊 > 國(guó)內(nèi) >

Asterisk環(huán)境下完整PJSIP分機(jī)撥號(hào)流程分析

2019-07-08 09:40:48   作者:james.zhu   來源:Asterisk開源派   評(píng)論:0  點(diǎn)擊:


  PJSIP是目前Asterisk官方使用的最新的SIP協(xié)議棧。根據(jù)官方說明,Asterisk官方已經(jīng)不再繼續(xù)更新chan_sip協(xié)議棧,除非有重大安全漏洞才會(huì)進(jìn)行升級(jí)維護(hù)。通過幾年的測(cè)試和生成場(chǎng)景的使用,PJSIP在整體性能和功能支持方面已經(jīng)超越了chan_sip 協(xié)議棧。因?yàn)镻JSIP涉及了很多比較新的配置文件和呼叫流程,導(dǎo)致很多用戶對(duì)PJSIP配置說明缺乏一定的了解。今天,我們針對(duì)一些PJSIP的流程,并且結(jié)合呼叫規(guī)則進(jìn)行介紹。以前有很多用戶對(duì)使用PJSIP協(xié)議棧有疑問,以及其完整的技術(shù)概要,讀者可以訪問PJSIP官方網(wǎng)站和Asterisk官方網(wǎng)站。這里,筆者僅結(jié)合Asterisk介紹PJSIP具體的處理過程和Asterisk呼叫流程方面的內(nèi)容。
  1、關(guān)于PJSIP介紹
  PJSIP是開源的SIP協(xié)議棧,在最近的Asterisk版本中,官方已經(jīng)開始使用PJSIP協(xié)議棧作為Asterisk引擎的SIP協(xié)議棧。關(guān)于為什么Asterisk選擇PJSIP作為Asterisk新一代SIP協(xié)議棧的討論讀者可以查閱此鏈接:
  SIP Stack Research
  https://wiki.asterisk.org/wiki/display/AST/SIP+Stack+Research
  PJSIP的核心是SIP endpoint,通過pjsip_endpoint來表示。
  pjsip_endpoint負(fù)責(zé)幾個(gè)方面的工作:
  • 它具有一個(gè)pool factory, 為SIP模塊分配自己的pool。
  • 它支持對(duì)每個(gè)SIP模塊實(shí)現(xiàn)定時(shí)器管理。
  • 它支持一個(gè)傳輸管理模塊,傳輸管理模塊支持對(duì)SIP傳輸和控制消息解析打印。
  • 它支持PJLIB的 ioqueue支持網(wǎng)絡(luò)事件的調(diào)度處理。
  • 它提供thread安全保護(hù),對(duì)每個(gè)應(yīng)用的thread進(jìn)行安全管理。
  • 它可以管理PJSIP的相關(guān)模塊,拓展,解析處理等功能。
  • 它負(fù)責(zé)從管理模塊接收到的SIP 進(jìn)入的消息,分發(fā)SIP消息到其他模塊。
  因?yàn)槠年P(guān)系,筆者在這里不再做太多關(guān)于PJSIP的介紹,網(wǎng)絡(luò)有很多關(guān)于PJSIP協(xié)議棧,PJSIPUA的使用方式,讀者可以安裝練習(xí)。這里,我們主要介紹pjsip_endpoint的作用,因?yàn)樗苯佑绊懼覀兒罄m(xù)章節(jié)中所討論的Asterisk呼叫流程。
  2、PJSIP在Asterisk的結(jié)構(gòu)
  在Asterisk環(huán)境中,PJSIP通過各自的模塊對(duì)終端,業(yè)務(wù)訂閱,認(rèn)證和傳輸都進(jìn)行管理。PJSIP模塊的幾個(gè)核心模塊如下:
  Asterisk中PJSIP相關(guān)的幾個(gè)主要包括:
  • res_pjsip 模塊,這是一個(gè)基礎(chǔ)模塊,提供對(duì)上層其他業(yè)務(wù)的支持。
  • res_pjsip_session模塊,提供呼叫,媒體和會(huì)話管理,包括媒體流處理協(xié)商,DTMF,會(huì)話定時(shí)器設(shè)置,PRACK/100rel,SIP 原因頭處理,傳輸設(shè)置和媒體加密。
  • res_pjsip_regiestrar, 提供SIP注冊(cè)模塊的管理。
  • res_pjsip_pubsub, 提供對(duì)SIP消息的訂閱發(fā)布。
  • res_pjsip_messaging, 提供MWI事件包處理,分機(jī)/設(shè)備的狀態(tài)拓展支持(例如,PIDF,XPIDF,和CPIM-PIDF)。
  3、PSJIP相關(guān)的幾個(gè)實(shí)體對(duì)象說明
  我們現(xiàn)在討論的PJSIP和以前的chan_sip配置文件有所不同。在PJSIP中,Asterisk借用了幾個(gè)實(shí)體概念來部署相關(guān)配置。如果用戶不了解其具體作用的話,可能引起很多的誤解。在前面的介紹中,我們已經(jīng)說明,Endpoint是PJSIP的核心。通過Endpoint關(guān)聯(lián)了很多相關(guān)的配置屬性關(guān)系。以下是一個(gè)ER關(guān)系圖實(shí)例,讀者可以基本了解其配置關(guān)系:
  當(dāng)一個(gè)新的SIP請(qǐng)求進(jìn)入到PJSIP時(shí),PJSIP的res_pjsip模塊首先需要確認(rèn)Endpoint在res_pjsip中的注冊(cè)類型。注冊(cè)類型不同則關(guān)聯(lián)不同的配置參數(shù)設(shè)置。當(dāng)然,Endpoint的確認(rèn)也有不同的優(yōu)先級(jí)。用戶可以通過CLI命令來檢查這些Endpoint類型:
  1. *CLI> pjsip show identifiers
  2. Identifier Names:
  3. name not specified
  4. ip
  5. username
  6. anonymous
  7. header
  8. auth_username
  大部分情況下,PJSIP會(huì)通過“From”頭中的username來查詢Endpoint中的username。如果匹配到了相應(yīng)的username,則繼續(xù)匹配其他的配置參數(shù)。
  在res_pjsip中提供了對(duì)Endpoint的類型定義,不同的類型又和不同的配置進(jìn)行了綁定,這些具體的配置包括:
  1. Transport支持,提供對(duì)傳輸協(xié)議配置(TCP/UDP),加密配置(TLS/SSL),WS配置。
  2. AUTH支持,認(rèn)證部分提供對(duì)用戶的Inbound和Outbound的Authentication處理,包括用戶注冊(cè)信息處理以及認(rèn)證方式。
  3. AOR(Address of Record)支持,此配置通知Asterisk在那里可以連接endpoint終端。如果沒有AOR記錄的話,不能連接endpoint終端。當(dāng)Asterisk收到一個(gè)注冊(cè)請(qǐng)求時(shí),它首先需要查詢可用的AOR記錄。
  4. REGISTRATION注冊(cè),提供對(duì)外SIP服務(wù)器的注冊(cè)支持,對(duì)接ITSP trunk配置。
  5. IDENTIFY支持,此配置控制res_pjsip_endpoint_identifier_ip模塊來決定進(jìn)入到系統(tǒng)的數(shù)據(jù)是哪種endpoint終端類型。如果Asterisk收到一個(gè)來自于某個(gè)IP地址的數(shù)據(jù),則匹配這個(gè)地址的相應(yīng)的終端。
  6. Contact配置選項(xiàng)工作方式類似于SIP URL的別名,保存進(jìn)入到注冊(cè)消息。它可以關(guān)聯(lián)單個(gè)獨(dú)立的SIP 用戶代理。
  以上ER圖例說明了它們之間的關(guān)聯(lián)關(guān)系。如果用戶對(duì)某些概念理解有問題的話,可以查閱筆者的歷史文檔,這里不再對(duì)基本概念做過多討論,相關(guān)文章包括:
  • B2BUA/SBC/Proxy的SIP消息重構(gòu)和RFC7092詳解
  • 一封信讀懂SIP注冊(cè)消息關(guān)鍵詞
  • 深入理解SIP服務(wù)器的注冊(cè)和定位服務(wù)流程中關(guān)于AOR和COntact的說明。
  4、Asterisk中PJSIP的處理流程
  根據(jù)前面章節(jié)的介紹,一個(gè)呼叫通過SIP呼叫到Asterisk系統(tǒng)中,需要經(jīng)過幾個(gè)模塊的處理。讀者需要更多關(guān)注Res_pjproject.c文件(啟動(dòng)PJSIP,分配模塊資源,設(shè)置log等)和Res_pjsip.c 文件。Res_pjsip.c開始加載其其他的上層模塊的邏輯處理,包括創(chuàng)建thread,監(jiān)聽I(yíng)P和端口,確認(rèn)Endpoint類型和優(yōu)先級(jí)判斷,確認(rèn)endpoint相關(guān)配置,DTMF,管理SDP,Callerd等。以下圖例是關(guān)于Asterisk服務(wù)器中PJSIP協(xié)議如何處理一個(gè)呼叫請(qǐng)求的處理流程。
  Asterisk中PJSIP的呼叫處理流程如下:
  1. 首先啟動(dòng)PJSIP協(xié)議棧。
  2. 把新的request存放到threadpool中,等待處理。
  3. 確認(rèn)Endpoint以及其配置類型。
  4. 如果有NAT支持,則修改NAT配置。如果沒有,則繼續(xù)執(zhí)行下一步流程。
  5. 如果有re-INVITE則執(zhí)行,修改媒體狀態(tài);如果沒有,則繼續(xù)進(jìn)行下一步操作。
  6. 創(chuàng)建Dialog。
  7. 對(duì)請(qǐng)求進(jìn)行認(rèn)證處理。
  8. 創(chuàng)建一個(gè)新的會(huì)話。
  9. 處理SDP Offer。
  10. 提取Caller ID,保存提取的值。
  11. 創(chuàng)建一個(gè)ast_channel object 對(duì)象。
  12. 檢查是否有T38傳真支持處理。如果沒有則繼續(xù)執(zhí)行下一步流程。
  13. 正式啟動(dòng)IPPBX,進(jìn)入撥號(hào)規(guī)則。
  5、Asterisk撥號(hào)規(guī)則中的PJSIP分機(jī)呼叫流程分析
  在Asterisk呼叫中,首先需要根據(jù)呼叫的需求編寫一個(gè)撥號(hào)規(guī)則(dialplan)。 這個(gè)撥號(hào)規(guī)則定義了呼叫的具體流程。IPPBX的呼叫流程可以非常復(fù)雜,也可以非常簡(jiǎn)單。為了配合以上內(nèi)容,我們編寫一個(gè)簡(jiǎn)單的撥號(hào)規(guī)則來說明PJSIP分機(jī)之間呼叫需要處理的流程。具體撥號(hào)規(guī)則的語法如下:
  這里需要提前說明,此示例中,分機(jī)已經(jīng)創(chuàng)建,撥號(hào)規(guī)則和SIP分機(jī)可以注冊(cè)退出注冊(cè)。所以,讀者如果需要測(cè)試的話,需要提前安裝Asterisk,如果需要real-time的分機(jī)管理的話,需要安裝Asterisk數(shù)據(jù)庫(kù)和創(chuàng)建相關(guān)的表(例如,asterisk.ps_endpoints,asterisk.ps_aors等)來存儲(chǔ)PJSIP的AOR,Contacts,Endpoints等數(shù)據(jù)。另外,讀者需要了解關(guān)于PJSIP的CLI命令,方便查看AOR,Contacts,和Auth等數(shù)據(jù)狀態(tài))。以下示例說明了Asterisk環(huán)境中PJSIP分機(jī)呼叫的主要處理流程:
  在以上的出來流程中,Asterisk大概需要幾個(gè)步驟來實(shí)現(xiàn)分機(jī)之間的呼叫:
  1. 注冊(cè)的分機(jī)撥打200發(fā)起一個(gè)請(qǐng)求。
  2. Asterisk檢查此分機(jī)是否屬于特別設(shè)置的context,我們這里是hiastar。如果是,則可以進(jìn)行第三步的流程。這里,讀者可以通過Asterisk CLI 命令檢查AOR 的狀態(tài)。
  3. 在Asterisk PBX中,首先檢查需要匹配的撥打的號(hào)碼,這里用戶撥打了200,當(dāng)然,用戶也可以撥打其他號(hào)碼設(shè)置。
  4. 如果在撥號(hào)規(guī)則中匹配檢測(cè)通過,則執(zhí)行app 命令Dial,然后撥打PJSIP協(xié)議通道的分機(jī)。
  5. Asterisk再次檢查分機(jī)的狀態(tài),比如相關(guān)分機(jī)200的AOR和綁定的Contacts。這里,一些新用戶可能比較迷惑,筆者重點(diǎn)說明一下。如果創(chuàng)建了分機(jī)以后,系統(tǒng)可以馬上創(chuàng)建AOR記錄,但是沒有Contacts記錄。如果用戶使用SIP終端注冊(cè)登錄以后,Contact 記錄才能顯示,并且綁定了具體的IP地址對(duì)象。一個(gè)AOR可以綁定多個(gè)Contacts地址,也就是說,一個(gè)AOR記錄可以支持多臺(tái)SIP終端注冊(cè)登錄。在筆者的實(shí)驗(yàn)中,一個(gè)AOR 200,綁定了兩個(gè)SIP 終端,這兩臺(tái)終端都已經(jīng)登錄注冊(cè),所以可以顯示兩個(gè)不同的IP地址。分機(jī)注冊(cè)前后的的狀態(tài)


 
 
  Asterisk檢查到200分機(jī)已經(jīng)注冊(cè),并且獲悉了其IP地址以后,對(duì)此SIP分機(jī)發(fā)送INVITE請(qǐng)求,對(duì)其發(fā)起呼叫。
  通過以上六個(gè)步驟,PJSIP分機(jī)之間的呼叫創(chuàng)建完成。
  6、總結(jié)
  此文章主要介紹了關(guān)于Asterisk環(huán)境中使用PJSIP分機(jī)撥號(hào)的基本處理流程和其相關(guān)的技術(shù)架構(gòu)。首先,筆者簡(jiǎn)單說明了PJSIP的介紹了PJSIP的使用原因和官方說明,然后介紹了PJSIP的核心模塊,然后介紹了PJSIP在Asterisk的架構(gòu)和其相關(guān)的應(yīng)用服務(wù)模塊。因?yàn)椋琍JSIP涉及了SIP協(xié)議幾個(gè)主要的概念,筆者又分別說明了幾個(gè)概念之間的綁定關(guān)系。為了讓讀者能夠充分了解Asterisk中PJSIP的處理流程,筆者通過圖例的方式,按照總共13個(gè)步驟說明了PJSIP是如何一步步進(jìn)行呼叫流程的處理的。最后,筆者通過一個(gè)PJSIP分機(jī)呼叫的示例,配合簡(jiǎn)單的撥號(hào)規(guī)則說明了撥號(hào)規(guī)則的處理流程。
  參考資料:
  www.asterisk.org
  www.freepbx.org.cn
  www.pjsip.org
   
  關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的Asterisk行業(yè)分享
  Asterisk freepbx,F(xiàn)reeSBC技術(shù)文檔: www.freepbx.org.cn
  融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com
  Asterisk/FreePBX中國(guó)合作伙伴,官方qq技術(shù)分享群(3000人):589995817

【免責(zé)聲明】本文僅代表作者本人觀點(diǎn),與CTI論壇無關(guān)。CTI論壇對(duì)文中陳述、觀點(diǎn)判斷保持中立,不對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請(qǐng)讀者僅作參考,并請(qǐng)自行承擔(dān)全部責(zé)任。

專題

CTI論壇會(huì)員企業(yè)