2013-12-23 16 views
0

我有一個問題,已經20個小時的話題,但無法解決它。 由於在Asterisk中同時呼叫轉移的情況下無法獲得應答號碼的確切CLID,因此無法爲呼叫計費。 $ {CDR(src)},$ {CDR(dst)}在這裏沒有幫助。如何在Asterisk中同時呼叫轉移的情況下獲得應答號碼/接聽CLID?

我從PSTN +79000000000撥打電話到DID +78120000000,呼叫登陸到我們的星號。在星號上,通過同一中繼線,呼叫被轉發到另一個PSTN +74950000000並在那裏接聽。在CDR呼叫完成,我們可以看到:

src: 79000000000 
dst: 78120000000 

和有關上次781.2億沒有資料 - > 749.5億調用

我可以使用CDR變量來存儲749.5億,呼籲撥號應用程序之前:

Set(CDR(fwd)=74950000000); 
Dial(SIP/78120000000/74950000000); 

那麼CDR的呼叫完成,我們可以看到:

src: 79000000000 
dst: 78120000000 
fwd: 74950000000 

那沒關係,因爲我可以在撥號之前限制最長通話時間,並在掛斷後給通話記帳。所有這一切都要感謝已知的FWD。

sip.conf

[78120000000] 
name=78120000000 
type=peer 
host=sip.provider.com 

extensions.ael

context sequential { 
    _.=> { 
     Set(CDR(fwd)=74950000000); 
     Dial(SIP/78120000000/74950000000); 
     Hangup(); 
    } 
    h => { 
     Set(BILL_THE_CALL=${ODBC_BILL_THE_CALL()}); 
     // billing is easily executed thanks to logged fwd in CDR 
    } 
    } 

但在同時呼叫的情況下轉發這是不可能的:

context simultaneous { 
    _.=> { 
     // can't set fwd before call completion, because don't know 
     // if my_cell_phone or softphone will answer 
     // my_cell_phone costs 5 cents/min, softfone is free of charge 
     Dial(SIP/78120000000/74950000000&SIP/softphone); 
     Hangup(); 
    } 
    h => { 
     Set(BILL_THE_CALL=${ODBC_BILL_THE_CALL()}); 
     // billing is impossible because fwd is not logged to CDR 
    } 
} 

在CDR中,我們可以看到呼叫完成與順序案例一樣,沒有正轉:

src: 79000000000 
dst: 78120000000 

和有關上次781.2億沒有資料 - > 749.5億或爲軟件電話

所以,你知道任何方式得到應允的用戶名,接聽的號碼,回答CLID,任何爲了能夠法案呼叫?

http://www.voip-info.org/wiki/view/Asterisk+variables

http://www.voip-info.org/wiki/view/Asterisk+func+channel

等環節包含什麼有用的我。

在電話會議上我也可以申請

sip show channel faf7767642 

,看到通道用戶名,起源URI等包含我的呼叫轉移號碼,但我不能從那裏撥號方案得到它們。但是當我打電話時:

NoOp(${CHANNEL(username)}); 

它只是什麼也沒有顯示。有什麼想法?不能相信我錯過了一些明顯的東西。 謝謝!

+0

很難對你提供的信息說些什麼,非常喜歡你有限制的數據庫連接。我建議你啓用星號調試並檢查日誌。或聘請具有較高星號技能的外部顧問監督您的撥號方案。 – arheops

+0

爲什麼你認爲這是一個數據庫連接問題,而所有的問題都圍繞着星號變量? DB絕對是好的。這種情況是同時呼叫轉移。例如撥號(SIP/client1&IAX/client2); - 如何獲得「誰應答了呼叫」:client1或client2?因爲CDR中沒有這樣的信息。這是問題。 –

+0

由於星號對合數的數量沒有任何限制,因此即使你這樣做也沒那麼容易創造極限。 – arheops

回答

0

是的,它在該宏-x上下文中使用Set(GLOBAL(var)= $ {CHANNEL(peername)})的Dial()命令期間的M(x)執行工作。

context macro-give-me-answered-clid { 
    _. => { 
     Set(GLOBAL(simultaneous_call_answered_peer)=${CHANNEL(peername)}); 
    } 
} 

context simultaneous { 
    _.=> { 
    // can't set fwd before call completion, because don't know 
    // if my_cell_phone or softphone will answer 
    // my_cell_phone costs 5 cents/min, softfone is free of charge 
    Dial(SIP/78120000000/74950000000&SIP/softphone,,M(give-me-answered-clid)); 
    Hangup(); 
    } 

    h => { 
    Set(CDR(fwd)=${simultaneous_call_answered_peer}) 
    Set(BILL_THE_CALL=${ODBC_BILL_THE_CALL()}); 
    // billing is ok because fwd is now logged to CDR 
    } 
} 

也許不是很好,也許還很愚蠢,但作品,我現在很滿意。 非常感謝您的幫助,artheops!

至於開發複雜的解決方案,而專業技能,這是上一個完美的蓋·裏奇的回答是:

只有這樣,才能變得更聰明是聰明打對手。

(c)Revolver,2005.這是獲得專家的唯一途徑。