Sip 如果同时使用星号进行呼叫转接,如何获取应答号码/应答CLID?

Sip 如果同时使用星号进行呼叫转接,如何获取应答号码/应答CLID?,sip,asterisk,telephony,billing,Sip,Asterisk,Telephony,Billing,我有一个问题,在这个话题上已经有20个小时了,但是解决不了。 如果我不能为电话计费,因为我无法获得应答号码的准确CLID,以防同时使用星号进行呼叫转接${CDRsrc},${CDRdst}在这里没有帮助 我从PSTN+79000000000打电话到DID+78120000000,电话到达我们的星号。在星号上,通过同一中继线,呼叫被转发到另一个PSTN+74950000000并在那里应答。CDR中的待命完成我们可以看到: src: 79000000000 dst: 78120000000 src

我有一个问题,在这个话题上已经有20个小时了,但是解决不了。 如果我不能为电话计费,因为我无法获得应答号码的准确CLID,以防同时使用星号进行呼叫转接${CDRsrc},${CDRdst}在这里没有帮助

我从PSTN+79000000000打电话到DID+78120000000,电话到达我们的星号。在星号上,通过同一中继线,呼叫被转发到另一个PSTN+74950000000并在那里应答。CDR中的待命完成我们可以看到:

src: 79000000000
dst: 78120000000
src: 79000000000
dst: 78120000000
fwd: 74950000000
没有关于上次78120000000->74950000000通话的信息

在调用拨号应用程序之前,我可以使用CDR变量在中存储74950000000:

Set(CDR(fwd)=74950000000);
Dial(SIP/78120000000/74950000000);
然后在CDR待命完成中,我们可以看到:

src: 79000000000
dst: 78120000000
src: 79000000000
dst: 78120000000
fwd: 74950000000
没关系,因为我可以在拨号前限制最大通话时间,并在挂断后为通话计费。都要感谢已知的fwd

sip.conf

[78120000000]
name=78120000000
type=peer
host=sip.provider.com
A.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或softphone的信息

那么,你知道有什么方法可以获得应答的用户名、应答的号码、应答的CLID,以便能够为通话计费吗

等链接包含对我没有任何帮助

在电话中我也可以申请

sip show channel faf7767642
并查看包含我的fwd号码的频道用户名、原始uri等,但我无法使用dialplan从那里获取它们。但当我打电话时:

NoOp(${CHANNEL(username)});
它什么也看不出来。你有什么想法吗?真不敢相信我错过了一些明显的东西。
谢谢大家!

是的,这要归功于在该宏-x上下文中使用SetGLOBALvar=${CHANNELpeername}在拨号命令期间执行Mx

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
   }
} 
也许不太好,也许还很愚蠢,但很有效,我现在很高兴。 非常感谢你的帮助,亚瑟王

至于在没有专家技能的情况下开发复杂的解决方案,这是盖·里奇的完美答案:

要想变得更聪明,唯一的办法就是与更聪明的对手较量


c左轮手枪,2005年。这是获得专家的唯一途径。

很难说出您提供的信息,很可能您的数据库连接数量有限。我建议您启用星号调试并检查日志。或者聘请具有较高星号技能的外部顾问来监督您的拨号计划。为什么您认为这是一个db连接问题,而所有问题都是围绕星号变量的?DB绝对没问题。这种情况发生在同时呼叫转移中。例如,拨号sip/client1&IAX/client2;-如何找到接听电话的人:client1还是client2?因为CDR中没有这样的信息。这就是问题所在。因为星号对会话的数量没有任何限制,而且即使您尝试创建限制,实际上也不太容易。对于DialSIP/client1&IAX/client2;您可以使用本地拨号/client1@internal/n&local/client2@internal/n并在内部上下文中创建client1 ext,这样您将有3个cdr,并将看到。其他解决方案在拨号和标记cdr中的answe宏上使用。无论如何,如果你不是专家,也从来没有读过像freepbx这样的其他系统的书籍/代码,那么在星号上运行复杂系统是个坏主意。谢谢你在拨号时指向宏!拨打SIP/client1和IAX2/client2,Mgiveme回答clid;宏上下文宏给我的答案是clid{{{uu0.=>{SetCDRfwd=${CHANNELpeername};}实际上,将CDRfwd设置为有效的应答用户名,即设置为client1或client2,具体取决于应答方用户名!但是变量CDRfwd没有传输回调用拨号的上下文,因此无法工作。也许我应该使用全局变量SetCDRfwd=${CHANNELpeername},g;-这将在任何时候通过任何上下文提供?