![星号:在转接时检查原始来电显示](https://linux22.com/image/1612432/%E6%98%9F%E5%8F%B7%EF%BC%9A%E5%9C%A8%E8%BD%AC%E6%8E%A5%E6%97%B6%E6%A3%80%E6%9F%A5%E5%8E%9F%E5%A7%8B%E6%9D%A5%E7%94%B5%E6%98%BE%E7%A4%BA.png)
我正在使用带有 usecallmanager 补丁的 Asterisk 16.5.0(它允许我使用 Cisco 电话功能)。我们有许多 ConfBridge 房间,这些房间应该只供员工呼叫。一些员工可以用他们的电话呼叫,一些可以用手机呼叫,一些可以用其他站点呼叫。我们确实允许用电话和注册的移动电话呼叫,这是通过上下文分离来实现的。任何办公电话都处于“内部”上下文中,任何外部呼叫都处于“外部”上下文中。如果 CID 属于注册的移动电话 - AGI 将提出上下文。
问题始于转接的呼叫 - 没有直接的方法来检查是否应该转接,因为思科电话没有在 SIP 标头中填写任何可以确定转接呼叫与常规呼叫的信息。我在分析了 SIP 数据包、tcpdump 输出并在 Asterisk 设置中尝试了所有与“pai”相关的操作后才知道这一点。
换句话说 - 如果 A 呼叫 B 并且 B 按下“转接”按钮 - 电话会向 confbridge C 发出全新的呼叫,并且当通道准备就绪时,B 再次按下“转接”,A 则直接转到 C。
在转移时 Asterisk 显示:
Call [email protected]:5060 got a SIP call transfer from caller: (REFER)!
SIP transfer to extension 101@internal by [email protected]
此时 Asterisk 知道传输正在发生,但无法从拨号计划中捕获它,因为通道已经通过 ConfBridge 应用程序连接。
有没有办法在转移过程中设置陷阱,比如执行一些拨号计划代码并检查那里的呼叫者?
我目前知道的唯一方法是在每次拨打/接听每部电话时用合作伙伴呼叫者 ID 填充特殊变量,并在进入 ConfBridge 之前检查此变量和该电话的 SIP 线路数量。
答案1
当您按下转接键时,思科电话会创建一个新的呼叫。
因此,没有办法在转接完成之前获取信息,除非记录每个呼叫并认为最后一个发送到手机的呼叫是转接的。
转移完成后,电话使用 RPID 中的新呼叫者 ID 重新发送邀请,这可能可以使用,但星号中没有机制(需要修补)。
其他选项是检查 AMI 事件并跟踪所有链接/桥接事件。但您也可以跟踪重命名事件。