[英]How to get Answered number / answered CLID in case of simultaneous calls forwarding in Asterisk?
我有一个问题,已经有20个小时了,但是无法解决。 我之所以无法为电话计费,是因为在Asterisk中同时进行呼叫转移时,我无法获得已应答号码的准确CLID。 $ {CDR(src)},$ {CDR(dst)}在这里没有帮助。
我从PSTN +79000000000拨打到DID +78120000000,然后通话降落到了我们的星号。 在星号上,呼叫通过同一中继线被转接到另一个PSTN +74950000000并在那里接听。 在CDR中完成通话后,我们可以看到:
src: 79000000000
dst: 78120000000
没有关于最后一个78120000000-> 74950000000调用的信息
我可以在调用Dial应用程序之前使用CDR变量存储749.5000000:
Set(CDR(fwd)=74950000000);
Dial(SIP/78120000000/74950000000);
然后在呼叫完成的CDR中,我们可以看到:
src: 79000000000
dst: 78120000000
fwd: 74950000000
没关系,因为我可以限制拨打前的最大通话时长,并在挂断后为通话计费。 这一切都要归功于已知的前驱。
sip.conf
[78120000000]
name=78120000000
type=peer
host=sip.provider.com
扩展名
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中完成呼叫后,我们可以看到与连续情况相同的情况,没有fwd:
src: 79000000000
dst: 78120000000
且没有有关最后一个78120000000-> 74950000000的信息,也没有关于软件电话的信息
因此,您是否知道以任何方式获取该已应答用户名,已应答号码,已应答CLID,以便能够为该呼叫计费。
http://www.voip-info.org/wiki/view/Asterisk+variables
http://www.voip-info.org/wiki/view/Asterisk+func+channel
等等。链接对我没有任何帮助。
在通话中我也可以申请
sip show channel faf7767642
并查看包含我的fwd号码的频道用户名,原始uri等,但是我无法使用Dialplan从那里获取它们。 但是当我打电话时:
NoOp(${CHANNEL(username)});
它什么也没显示。 有什么想法吗? 不敢相信我错过了明显的事情。 谢谢!
是的,由于在Macro-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!
对于开发没有专家技能的复杂解决方案,这是Guy Ritchie的完美答案:
变得更聪明的唯一方法是扮演更聪明的对手。
(c)左轮手枪,2005年。这是获得专家的唯一途径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.