繁体   English   中英

在Asterisk中同时进行呼叫转移时,如何获取已应答号码/已应答CLID?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM