我有一个问题,已经讨论了20个小时,但无法解决。在Asterisk中同时进行呼叫转接的情况下,我无法获得已应答号码的确切CLID,因此无法对呼叫进行计费${CDR(src)}、${CDR(dst)}在此处没有帮助。
我从PSTN+79000000000打电话到DID+778120000000,电话已转到我们的Asterisk。在星号上,通过同一中继线,呼叫被转发到另一个PSTN+74950000000并在那里应答。CDR中的呼叫完成,我们可以看到:
src: 79000000000
dst: 78120000000
没有关于最后78120000000的信息->74950000000呼叫
我可以在调用拨号应用程序之前使用CDR变量存储74950000000:
Set(CDR(fwd)=74950000000);
Dial(SIP/78120000000/74950000000);
然后在CDR呼叫完成中,我们可以看到:
src: 79000000000
dst: 78120000000
fwd: 74950000000
没关系,因为我可以在拨号前限制最长通话时间,并在Hangup后计费。所有的感谢已知的fwd。
sip.conf
[78120000000]
name=78120000000
type=peer
host=sip.provider.com
分机.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中的呼叫完成时,我们可以看到与顺序情况相同的情况,没有fwd:
src: 79000000000
dst: 78120000000
并且没有关于最后78120000000->74950000000或软电话的信息
那么,你知道有什么方法可以获得应答的用户名、应答的号码、应答的CLID吗?
http://www.voip-info.org/wiki/view/Asterisk+变量
http://www.voip-info.org/wiki/view/Asterisk+func+通道
等等。链接对我没有任何帮助。
在通话中,我也可以申请
sip show channel faf7767642
请参阅包含我的fwd号码的频道用户名、发起uri等,但我无法通过拨号计划从那里获得它们。但当我打电话给时
NoOp(${CHANNEL(username)});
它什么也没显示。有什么想法吗?真不敢相信我错过了一些显而易见的东西。非常感谢。
是的,由于在宏-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年。这是获得专家的唯一途径。