我们拥有多台Asterisk服务器;有时,人为错误意味着有人搞乱了拨号方案并且来电被拒绝:
通知[27927][C-00000188]:chan_sip.c:26826handle_request_invite: 从“upstream-peer”(192.168.1.1:5060) 呼叫分机“44123123123” 被拒绝,因为在上下文“ourcontext”中找不到扩展名。
我想实现一小段代码,在发生这种情况时会发出某种警报,以便我们可以快速修复它。
我可以(并且确实)使用 AMI 从服务器获取各种事件 - 当创建通道时、当呼叫结束时等 - 但我似乎找不到任何事件或命令会在以下情况下引发 AMI 事件:呼叫被拒绝。有谁知道是否存在这样的事情?
设置 ami 或 ARI 会话
赶上“NewChannel”事件
如果有任何其他拨号方案类型的事件发生(如 NewExtension) - 标记为没问题。
捕获挂断事件,如果没有拨号计划标记 - 因拨号计划不正确而触发您的程序。
另一个选项(低代码):
设置无效扩展
exten => i,1,Noop(something here, no extension)
same => n,CelUserEvent(OOPS); for example fire cel event.
感谢@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}");
}
}
不像我喜欢的那样“干净”,但它似乎有效。