检测 Asterisk 何时通过 AMI 拒绝来电

问题描述 投票:0回答:2

我们拥有多台Asterisk服务器;有时,人为错误意味着有人搞乱了拨号方案并且来电被拒绝:

通知[27927][C-00000188]:chan_sip.c:26826handle_request_invite: 从“upstream-peer”(192.168.1.1:5060) 呼叫分机“44123123123” 被拒绝,因为在上下文“ourcontext”中找不到扩展名。

我想实现一小段代码,在发生这种情况时会发出某种警报,以便我们可以快速修复它。

我可以(并且确实)使用 AMI 从服务器获取各种事件 - 当创建通道时、当呼叫结束时等 - 但我似乎找不到任何事件或命令会在以下情况下引发 AMI 事件:呼叫被拒绝。有谁知道是否存在这样的事情?

asterisk asteriskami
2个回答
0
投票
  1. 设置 ami 或 ARI 会话

  2. 赶上“NewChannel”事件

  3. 如果有任何其他拨号方案类型的事件发生(如 NewExtension) - 标记为没问题。

  4. 捕获挂断事件,如果没有拨号计划标记 - 因拨号计划不正确而触发您的程序。

另一个选项(低代码):

设置无效扩展

exten => i,1,Noop(something here, no extension)
same => n,CelUserEvent(OOPS); for example fire cel event.

0
投票

感谢@arheops 的启发:我已将其添加到上下文拨号计划的底部:

exten => _X.,1,Set(invalid=1)
exten => _X.,2,Verbose(ATTENTION: incoming call tried to go to ${EXTEN} which is not configured.)
exten => _X.,3,Hangup

_X.
将捕获任何数字;由于拨号计划是按顺序解析的,因此只有到达计划底部的(可能是无效的)数字才会被此通配符匹配捕获。

然后,在我的监控应用程序中,我处理

VarSet
事件:

manager.VarSet += Manager_VarSet;

用一些简单的东西,比如:

private static void Manager_VarSet(object sender, VarSetEvent e)
{
  if (e.Variable=="invalid" && e.Value == "1")
  {
     Console.WriteLine($"INVALID CALL! To extension {e.Attributes["exten"]} on Asterisk server {e.Source.Hostname}");
  }
}

不像我喜欢的那样“干净”,但它似乎有效。

© www.soinside.com 2019 - 2024. All rights reserved.