Asterisk AMI 事件有时会丢失

Asterisk AMI events sometimes missing

我有一个 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 事件,没有任何进展。这在每个服务器中是完全一致的,这意味着服务器要么总是发送所有预期的事件,要么从不发送。

我已经检查了 asterisk 的版本、manager.conf 配置文件、extensions.conf 拨号方案、详细模式下的 asterisk 控制台(即通过 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,call,log,verbose,command,agent,user,originate,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 发送命令并获得响应,也可能不是 enabled,这将抑制大多数核心事件,如 NewchannelNewstate

一个线索是星号控制台中的 运行 manager show settings 返回了这个:

Global Settings:
----------------
  Manager (AMI)           No
  ...

这显然表明它未启用。