Asterisk AMI 事件有时会丢失

问题描述

我有一个 Python 服务,它通过 AMI 连接到 Asterisk 并侦听事件以检测呼叫何时开始。

这似乎适用于我连接的大多数 Asterisk 服务器。然而,在我们的一些服务器上,我们只是在调用发生时看不到任何 AMI 事件(例如 Newstate),尽管我们稍后会在调用完成后看到 Cdr 事件。

我已经确认这不是我们用来连接到 AMI (py-Asterisk) 的库所特有的,因为当我手动连接时,我看到的内容完全相同,例如

$ openssl s_client -connect my-asterisk-server:5039
...
Asterisk Call Manager/2.10.3
Action: Login
Username: manager
Secret: ThisIsWhereITypedTheActualPassword

Response: Success
Message: Authentication accepted

Event: FullyBooted
Privilege: system,all
Status: Fully Booted

Action: Events
EventMask: on

Response: Success
Events: on

在上面的块中,我手动连接到 AMI,以我的 Python 代码使用的同一管理员身份登录,并确保所有事件都已打开(尽管我的星号配置应该已经在默认情况下显示了我关心的所有事件).

此后,我在某些 Asterisk 服务器上看到的是一系列预期事件,例如 Newstate,然后是最终的 Cdr 事件。在其他服务器上,我只看到 Cdr 事件,没有进行任何处理。这在每个服务器中是完全一致的,这意味着服务器要么总是发送所有预期的事件,要么从不发送。

我已经检查了星号的版本、manager.conf 配置文件、extensions.conf 拨号计划、详细模式下的星号控制台(即通过 asterisk -vvvr 连接到正在运行的进程),并且只是将我的配置文件与我实际工作的 Asterisk 服务器进行比较。

我不知道是什么原因导致了这种情况,甚至不知道接下来要尝试什么。如果重要的话,这就是我的 manager.conf 的样子:

[general]
tlsenable=yes
tlsbindaddr=10.0.0.123:5039
tlscertfile=/etc/pki/asterisk/ami.crt
tlsprivatekey=/etc/pki/asterisk/ami.key

[admin]
secret=TheActualPasswordIsOnThisLine
read=system,call,log,verbose,command,agent,user,originate,cdr
write=system,cdr

编辑:经过一些进一步的挖掘,似乎出现的唯一事件是 Cdr 事件,因此即使像对等注册事件这样的事件也不会出现。我还确认我所有的 Asterisk 13.19.0-1 服务器都表现出这种行为,并且唯一可以工作的服务器运行的是旧版本的 Asterisk。

奇怪的是,调用确实成功通过了,所以问题不在于我缺少一些必要的模块。 (也许我是?是否有一些“使事件显示在 AMI 中”模块需要确保已加载?)

进一步编辑:我能够打开 CEL 事件(通道事件记录),并且这些事件显示出来,但这是一组与标准 Newchannel/Newstate/etc 不同的事件我在找。理论上,我可以重写大部分服务以使用 CEL 事件,但理想情况下,我只需打开标准的 Newstate/Newchannel/Hangup 事件。

解决方法

原来是我失踪了

enabled=yes

在我的 manager.conf 中。希望这对将来的某人有所帮助:即使您能够连接到 AMI、登录 AMI、从 AMI 接收一些事件并向 AMI 发送命令并获得响应,它也可能不是 {{1} },这将抑制大多数核心事件,如 enabledNewchannel 等。

一个线索是在星号控制台中运行 Newstate 会返回:

manager show settings

这显然是表明它未启用的方式。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...