為何要研究freepbx呢,之前研究了asterisk 17,當時創建分機,是在配置文件里面完成的。存在一個問題,那就是每次創建分機后,或者改動配置后,都需要重新啟動應用,才能生效,這個會影響線上的業務。於是轉而研究動態加載的方案,原生的asterisk方案里面有realtime技術,這個非常靈活,但是呢,就是因為太靈活,需要學習的東西,基本都是底層的,比較難一時半會弄清楚。
於是選擇freepbx作為替代產品,freepbx產品是包裝asterisk的一款產品,安裝非常方便,配置是圖形化的界面,每個配置項有相對明確的解釋,支持國際化,想看那個語言就那個語言,當然,我們看中文就好了。
我這里安裝采用的是ISO版本安裝,從freepbx官網(https://www.freepbx.org/)下載的,V15版本。
安裝非常方便,可以在一台裸的物理機上,像安裝操作系統一樣的安裝,也可以通過VMware,基於虛擬機內安裝。置於怎么安裝,這里不做介紹,自己可以去網上找資料學習如何安裝操作系統即可。我這里是基於VMware的虛擬機實現的安裝。這里要介紹的是網絡的問題,因為我再Win10的機器上,安裝VMware,虛擬出了一個機器(2C2G30G),安裝freepbx大概花了10分鍾吧,不用費什么勁。
我的虛擬機和我的宿主機之間是通過NAT通信的,這里配置的過程,簡單說下:
1)在freepbx的系統里面,將默認的IP分配機制由DHCP調整為static。為何這么做呢?這里主要考慮到方便后續建立分機號對應的AOR,Endpoint等對象數據的一致性,不至於出現機器IP變化了,而asterisk對應的pjsip的對象沒有變,導致不必要的錯誤。
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" #BOOTPROTO="DHCP" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="eth0" UUID="b75f1df9-9b30-4e00-8f9a-5e96a07dd5e1" DEVICE="eth0" ONBOOT="yes" IPADDR="192.168.38.129" NETMASK="255.255.255.0" GATEWAY="192.168.38.2"
2)將Win10機器的對外上網的網卡共享給VMware8,方便虛擬機通過Win10宿主機訪問外網
具體的操作流程,請參考圖中的編號,體現了操作的順序,完成4的步驟后,點擊確認即可。
配置完后,在freepbx的虛擬機上,ping宿主機,以及從宿主機上ping下freepbx宿主機,若雙方都能ping通,說明沒有問題了。若有問題,ping不通,則可能需要將虛擬機的network重啟一下(service network restart)。
或者將宿主機上的VMware8網絡節點禁用啟用一下,如下圖(選擇VMware8,點擊鼠標右鍵,選擇禁用,然后再啟用,即可)
在完成了freepbx的安裝和基本的網絡配置后,我們就需要驗證一下基於freepbx的簡單實用了。這里,我創建兩個分機10001和10002,這兩個電話之間進行互打電話。
1)建分機
step1:
在“通信接口連接”里面選擇“分機”,或者英文界面時,“connectivity”---》“Extensions”。
step2:
然后,選擇上圖中的1或者2任何一個入口,都可以進入進行pjsip的分機的創建。這里沒有選擇chan_sip,而是chan_pjsip,因為pjsip相對來說模塊更獨立,性能相對更好。
step3:
按照上圖中的編號,填寫相關的內容,最后按照6指示,提交保存。
step4:
創建完分機后,准備打電話,在yateclient上配置上10002這個分機,發現無法認證,認證過程失敗。這個是為什么呢?
上面截圖是freepbx后台顯示的日志,認證失敗
分析了很久,然后在freepbx的官方網站上看到操作步驟里面,每一步操作,只要涉及到數據配置的變更,都強調了點擊“Apply Config”,即下圖所示的紅色的按鈕。
我也點擊了這個按鈕后,然后再撥打電話,還的確就是這個問題,因為沒有“更新配置”,頁面上修改的配置,並沒有觸發后台系統的相關Endpoints的表結構中去讓其生效,可以通過命令行,在系統查看當前系統的Endpoints的信息進行確認當前的Endpoints中是否有你想要的,若么有,就需要考慮這個“更新配置”按鈕是不是沒有點擊。
其實,在freepbx的操作界面上,也可以查看當前asterisk系統下的pjsip的Endpoints信息的,請看下圖(先點擊1,然后在2對應的框中,輸入“pjsip show endpoints”,最后回車即可):
2)打電話
在基於yateClient的工具進行撥號,在本地啟用兩個yate客戶端,一個作為10001的終端,一個作為10002的終端。撥打電話界面效果如下圖
從這個圖,很清晰的可以看出,電話是從10002的分機撥打給10001這個分機的。此時,點擊Accept按鍵,即可接通電話。(細心的小伙伴,可能會說,打電話和接電話怎么在一個截圖里?呵呵,我這里是在模擬,在同一台機器上完成的通話)
再看看后面的日志,清晰看看通話的asterisk的邏輯:
[2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [10001@from-internal:1] GotoIf("PJSIP/10002-00000022", "1?ext-local,10001,1:followme-check,10001,1") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (ext-local,10001,1) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [10001@ext-local:1] Set("PJSIP/10002-00000022", "__RINGTIMER=15") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [10001@ext-local:2] Macro("PJSIP/10002-00000022", "exten-vm,novm,10001,1,1,1") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:1] Macro("PJSIP/10002-00000022", "user-callerid,") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:1] Set("PJSIP/10002-00000022", "TOUCH_MONITOR=1595524692.34") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:2] Set("PJSIP/10002-00000022", "AMPUSER=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:3] GotoIf("PJSIP/10002-00000022", "0?report") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:4] ExecIf("PJSIP/10002-00000022", "1?Set(REALCALLERIDNUM=10002)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:5] Set("PJSIP/10002-00000022", "AMPUSER=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:6] GotoIf("PJSIP/10002-00000022", "0?limit") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:7] Set("PJSIP/10002-00000022", "AMPUSERCIDNAME=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:8] ExecIf("PJSIP/10002-00000022", "0?Set(__CIDMASQUERADING=TRUE)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:9] GotoIf("PJSIP/10002-00000022", "0?report") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:10] Set("PJSIP/10002-00000022", "AMPUSERCID=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:11] Set("PJSIP/10002-00000022", "__DIAL_OPTIONS=HhTtr") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:12] Set("PJSIP/10002-00000022", "CALLERID(all)="10002" <10002>") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:13] ExecIf("PJSIP/10002-00000022", "0?Set(CALLERID(all)=10001)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:14] GotoIf("PJSIP/10002-00000022", "0?limit") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:15] ExecIf("PJSIP/10002-00000022", "0?Set(GROUP(concurrency_limit)=10002)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:16] ExecIf("PJSIP/10002-00000022", "0?Set(CHANNEL(language)=)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:17] NoOp("PJSIP/10002-00000022", "Macro Depth is 2") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:18] GotoIf("PJSIP/10002-00000022", "1?report2:macroerror") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (macro-user-callerid,s,19) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:19] GotoIf("PJSIP/10002-00000022", "0?continue") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:20] ExecIf("PJSIP/10002-00000022", "1?Set(__CALLEE_ACCOUNCODE=)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:21] Set("PJSIP/10002-00000022", "__TTL=64") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:22] GotoIf("PJSIP/10002-00000022", "1?continue") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (macro-user-callerid,s,38) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:38] Set("PJSIP/10002-00000022", "CALLERID(number)=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:39] Set("PJSIP/10002-00000022", "CALLERID(name)=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:40] GotoIf("PJSIP/10002-00000022", "0?cnum") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:41] Set("PJSIP/10002-00000022", "CDR(cnam)=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:42] Set("PJSIP/10002-00000022", "CDR(cnum)=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-user-callerid:43] Set("PJSIP/10002-00000022", "CHANNEL(language)=en") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:2] Set("PJSIP/10002-00000022", "RingGroupMethod=none") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:3] Set("PJSIP/10002-00000022", "__EXTTOCALL=10001") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:4] Set("PJSIP/10002-00000022", "__PICKUPMARK=10001") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:5] Set("PJSIP/10002-00000022", "RT=15") in new stack [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:6] ExecIf("PJSIP/10002-00000022", "0?Macro(vm,novm,DIRECTDIAL,)") in new stack [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:7] ExecIf("PJSIP/10002-00000022", "0?MacroExit()") in new stack [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:8] ExecIf("PJSIP/10002-00000022", "0?Gosub(ext-intercom,*8010001,1())") in new stack [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:9] ExecIf("PJSIP/10002-00000022", "0?MacroExit()") in new stack [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:10] ExecIf("PJSIP/10002-00000022", "0?ChanSpy(PJSIP/10001,q)") in new stack [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:11] ExecIf("PJSIP/10002-00000022", "0?MacroExit()") in new stack [2020-07-23 17:18:12] WARNING[41749][C-00000013] chan_sip.c: This function can only be used on SIP channels. [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:12] ExecIf("PJSIP/10002-00000022", "0?Macro(vm,novm,DIRECTDIAL,)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:13] ExecIf("PJSIP/10002-00000022", "0?MacroExit()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:14] ExecIf("PJSIP/10002-00000022", "0?Gosub(ext-intercom,*8010001,1())") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:15] ExecIf("PJSIP/10002-00000022", "0?MacroExit()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:16] ExecIf("PJSIP/10002-00000022", "0?ChanSpy(PJSIP/10001,q)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:17] ExecIf("PJSIP/10002-00000022", "0?MacroExit()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:18] Gosub("PJSIP/10002-00000022", "sub-record-check,s,1(exten,10001,dontcare)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:1] GotoIf("PJSIP/10002-00000022", "0?initialized") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:2] Set("PJSIP/10002-00000022", "__REC_STATUS=INITIALIZED") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:3] Set("PJSIP/10002-00000022", "NOW=1595524692") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:4] Set("PJSIP/10002-00000022", "__DAY=23") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:5] Set("PJSIP/10002-00000022", "__MONTH=07") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:6] Set("PJSIP/10002-00000022", "__YEAR=2020") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:7] Set("PJSIP/10002-00000022", "__TIMESTR=20200723-171812") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:8] Set("PJSIP/10002-00000022", "__FROMEXTEN=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:9] Set("PJSIP/10002-00000022", "__MON_FMT=wav") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:10] NoOp("PJSIP/10002-00000022", "Recordings initialized") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:11] ExecIf("PJSIP/10002-00000022", "0?Set(ARG3=dontcare)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:12] Set("PJSIP/10002-00000022", "REC_POLICY_MODE_SAVE=") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:13] ExecIf("PJSIP/10002-00000022", "0?Set(REC_STATUS=NO)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:14] GotoIf("PJSIP/10002-00000022", "5?checkaction") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (sub-record-check,s,17) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-record-check:17] GotoIf("PJSIP/10002-00000022", "1?sub-record-check,exten,1") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (sub-record-check,exten,1) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:1] NoOp("PJSIP/10002-00000022", "Exten Recording Check between 10002 and 10001") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:2] Set("PJSIP/10002-00000022", "CALLTYPE=internal") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:3] ExecIf("PJSIP/10002-00000022", "0?Set(CALLTYPE=)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:4] Set("PJSIP/10002-00000022", "CALLEE=dontcare") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:5] ExecIf("PJSIP/10002-00000022", "0?Set(CALLEE=dontcare)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:6] GotoIf("PJSIP/10002-00000022", "0?callee") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:7] GotoIf("PJSIP/10002-00000022", "1?caller") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (sub-record-check,exten,13) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:13] Set("PJSIP/10002-00000022", "RECMODE=dontcare") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:14] ExecIf("PJSIP/10002-00000022", "0?Set(RECMODE=dontcare)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:15] ExecIf("PJSIP/10002-00000022", "1?Set(RECMODE=dontcare)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:16] Gosub("PJSIP/10002-00000022", "recordcheck,1(dontcare,internal,10001)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [recordcheck@sub-record-check:1] NoOp("PJSIP/10002-00000022", "Starting recording check against dontcare") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [recordcheck@sub-record-check:2] Goto("PJSIP/10002-00000022", "dontcare") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (sub-record-check,recordcheck,3) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [recordcheck@sub-record-check:3] Return("PJSIP/10002-00000022", "") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [exten@sub-record-check:17] Return("PJSIP/10002-00000022", "") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:19] GotoIf("PJSIP/10002-00000022", "1?macrodial") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (macro-exten-vm,s,25) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:25] GosubIf("PJSIP/10002-00000022", "0?clrheader,1()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-exten-vm:26] Macro("PJSIP/10002-00000022", "dial-one,15,HhTtr,10001") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:1] Set("PJSIP/10002-00000022", "DEXTEN=10001") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:2] Set("PJSIP/10002-00000022", "__CRM_SOURCE=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:3] ExecIf("PJSIP/10002-00000022", "0?Set(__EXTTOCALL=10001)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:4] Set("PJSIP/10002-00000022", "DIALSTATUS_CW=") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:5] GosubIf("PJSIP/10002-00000022", "0?screen,1()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:6] GosubIf("PJSIP/10002-00000022", "0?cf,1()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:7] GotoIf("PJSIP/10002-00000022", "1?skip1") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (macro-dial-one,s,10) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:10] GotoIf("PJSIP/10002-00000022", "0?nodial") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:11] GotoIf("PJSIP/10002-00000022", "0?continue") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:12] Set("PJSIP/10002-00000022", "EXTHASCW=ENABLED") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:13] GotoIf("PJSIP/10002-00000022", "0?next1:cwinusebusy") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (macro-dial-one,s,25) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:25] GotoIf("PJSIP/10002-00000022", "0?next3:continue") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (macro-dial-one,s,27) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:27] GotoIf("PJSIP/10002-00000022", "0?nodial") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:28] GosubIf("PJSIP/10002-00000022", "1?dstring,1():dlocal,1()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:1] Set("PJSIP/10002-00000022", "DSTRING=") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:2] Set("PJSIP/10002-00000022", "DEVICES=10001") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:3] ExecIf("PJSIP/10002-00000022", "0?Return()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:4] ExecIf("PJSIP/10002-00000022", "0?Set(DEVICES=0001)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:5] Set("PJSIP/10002-00000022", "LOOPCNT=1") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:6] Set("PJSIP/10002-00000022", "ITER=1") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:7] Set("PJSIP/10002-00000022", "THISDIAL=PJSIP/10001") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:8] GotoIf("PJSIP/10002-00000022", "0?docheck") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:9] NoOp("PJSIP/10002-00000022", "Debug: Found PJSIP Destination PJSIP/10001") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:10] GotoIf("PJSIP/10002-00000022", "0?doset") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:11] NoOp("PJSIP/10002-00000022", "Debug: Updating PJSIP Destination with PJSIP_DIAL_CONTACTS") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:12] Set("PJSIP/10002-00000022", "THISDIAL=PJSIP/10001/sip:10001@192.168.38.132:51361") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:13] ExecIf("PJSIP/10002-00000022", "0?Set(DIALSTATUS=CHANUNAVAIL)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:14] GotoIf("PJSIP/10002-00000022", "0?skipset") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:15] Set("PJSIP/10002-00000022", "DSTRING=PJSIP/10001/sip:10001@192.168.38.132:51361&") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:16] Set("PJSIP/10002-00000022", "ITER=2") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:17] GotoIf("PJSIP/10002-00000022", "0?begin") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:18] ExecIf("PJSIP/10002-00000022", "0?Return()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:19] Set("PJSIP/10002-00000022", "DSTRING=PJSIP/10001/sip:10001@192.168.38.132:51361") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [dstring@macro-dial-one:20] Return("PJSIP/10002-00000022", "") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:29] GotoIf("PJSIP/10002-00000022", "0?nodial") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:30] GotoIf("PJSIP/10002-00000022", "0?skiptrace") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:31] GosubIf("PJSIP/10002-00000022", "1?ctset,1():ctclear,1()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [ctset@macro-dial-one:1] Set("PJSIP/10002-00000022", "DB(CALLTRACE/10001)=10002") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [ctset@macro-dial-one:2] Return("PJSIP/10002-00000022", "") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:32] Set("PJSIP/10002-00000022", "D_OPTIONS=HhTtr") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:33] GosubIf("PJSIP/10002-00000022", "0?func-set-sipheader,s,1(Alert-Info,)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:34] NoOp("PJSIP/10002-00000022", "Blind Transfer: , Attended Transfer: , User: 10002, Alert Info: ") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:35] ExecIf("PJSIP/10002-00000022", "1?Set(ALERT_INFO=)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:36] ExecIf("PJSIP/10002-00000022", "0?Set(ALERT_INFO=)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:37] ExecIf("PJSIP/10002-00000022", "0?Set(ALERT_INFO=)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:38] ExecIf("PJSIP/10002-00000022", "0?Set(ALERT_INFO=Normal;volume=)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:39] ExecIf("PJSIP/10002-00000022", "0?Set(ALERT_INFO=Normal;volume=)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:40] GosubIf("PJSIP/10002-00000022", "0?func-set-sipheader,s,1(Alert-Info,)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:41] ExecIf("PJSIP/10002-00000022", "0?Set(CHANNEL(musicclass)=)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:42] GosubIf("PJSIP/10002-00000022", "0?qwait,1()") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:43] Set("PJSIP/10002-00000022", "__CWIGNORE=") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:44] Set("PJSIP/10002-00000022", "__KEEPCID=TRUE") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:45] GotoIf("PJSIP/10002-00000022", "0?usegoto,1") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:46] GotoIf("PJSIP/10002-00000022", "0?godial") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:47] Gosub("PJSIP/10002-00000022", "sub-presencestate-display,s,1(10001)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@sub-presencestate-display:1] Goto("PJSIP/10002-00000022", "state-not_set,1") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx_builtins.c: Goto (sub-presencestate-display,state-not_set,1) [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [state-not_set@sub-presencestate-display:1] Set("PJSIP/10002-00000022", "PRESENCESTATE_DISPLAY=") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [state-not_set@sub-presencestate-display:2] Return("PJSIP/10002-00000022", "") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:48] Set("PJSIP/10002-00000022", "CONNECTEDLINE(name,i)=10001") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:49] Set("PJSIP/10002-00000022", "CONNECTEDLINE(num)=10001") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:50] Set("PJSIP/10002-00000022", "D_OPTIONS=HhTtr") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:51] Macro("PJSIP/10002-00000022", "dialout-one-predial-hook,") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dialout-one-predial-hook:1] MacroExit("PJSIP/10002-00000022", "") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:52] ExecIf("PJSIP/10002-00000022", "0?Set(D_OPTIONS=HhtrI)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:53] ExecIf("PJSIP/10002-00000022", "0?Set(CWRING=r(callwaiting)):Set(CWRING=)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:54] NoOp("PJSIP/10002-00000022", "") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:55] ExecIf("PJSIP/10002-00000022", "0?Set(D_OPTIONS=HhTtrg)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@macro-dial-one:56] Dial("PJSIP/10002-00000022", "PJSIP/10001/sip:10001@192.168.38.132:51361,15,HhTtrb(func-apply-sipheaders^s^1)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] app_stack.c: PJSIP/10001-00000023 Internal Gosub(func-apply-sipheaders,s,1) start [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@func-apply-sipheaders:1] ExecIf("PJSIP/10001-00000023", "0?Set(CHANNEL(hangup_handler_push)=crm-hangup,s,1)") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@func-apply-sipheaders:2] NoOp("PJSIP/10001-00000023", "Applying SIP Headers to channel PJSIP/10001-00000023") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@func-apply-sipheaders:3] Set("PJSIP/10001-00000023", "TECH=PJSIP") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@func-apply-sipheaders:4] Set("PJSIP/10001-00000023", "SIPHEADERKEYS=") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@func-apply-sipheaders:5] While("PJSIP/10001-00000023", "0") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] app_while.c: Jumping to priority 13 [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] pbx.c: Executing [s@func-apply-sipheaders:14] Return("PJSIP/10001-00000023", "") in new stack [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] app_stack.c: Spawn extension (from-internal, 10001, 1) exited non-zero on 'PJSIP/10001-00000023' [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] app_stack.c: PJSIP/10001-00000023 Internal Gosub(func-apply-sipheaders,s,1) complete GOSUB_RETVAL= [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] app_dial.c: Called PJSIP/10001/sip:10001@192.168.38.132:51361 [2020-07-23 17:18:12] VERBOSE[10034] netsock2.c: Using SIP RTP Audio TOS bits 184 [2020-07-23 17:18:12] VERBOSE[10034] netsock2.c: Using SIP RTP Audio CoS mark 5 [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] app_dial.c: PJSIP/10001-00000023 is ringing [2020-07-23 17:18:12] VERBOSE[41749][C-00000013] app_dial.c: PJSIP/10001-00000023 is ringing
好了,到此,freepbx的first call成功完成,是不是還是比較簡單的?其實,freepbx有很多需要深入研究的,我這才剛開始,希望和博友一起探討。