Asterisk ARI - 在振铃前将通道传递给 Stasis

Jas*_*man 4 asterisk asterisk-ari

我的目标

将来电直接传递给 Stasis,并允许应用程序决定是向来电者播放振铃音还是忙音。

问题

使用我的 ARI 应用程序,如果我same => n,Ringing从拨号计划中省略该行,如果呼叫方挂断,Stasis 应用程序将返回错误。我可以在没有任何早期媒体的情况下挂断电话,直到我通过channel.play()ARI传递命令。

这个解决方案有两个问题:

  1. 当呼叫者挂断时,Stasis 应用程序会收到第二个 StasisStart,并返回Channel not found错误。
  2. 没有命令 channel.busy

有没有人有什么建议?

我目前能看到的唯一选择是确保所有用户都有语音邮件,并且永远不会播放忙音。不是每个人都想要/喜欢语音邮件,而且在来电者不知道他们的电话已接通的情况下接听电话并播放忙音是不道德的。

更新

使用以下拨号计划,我可以让它以所需的方式工作(如果用户不可用,则向用户播放),但出现错误:

扩展配置文件

[public]
exten => _.,1,NoOp()
same  =>    n,Stasis(myStasisApp, ${SIP_HEADER(to)})
same  =>    n,Busy(10)
same  =>    n,Hangup()
Run Code Online (Sandbox Code Playgroud)

我的应用程序

// The user is available
channel.ring();

// The user is busy
channel.continueInDialplan();
Run Code Online (Sandbox Code Playgroud)

错误

呼叫方挂机时发送另一个 StasisStart,其后是:

Unhandled rejection Error: {
  "message": "Channel not found"
}
Run Code Online (Sandbox Code Playgroud)

小智 6

我们遇到了同样的问题,浪费了宝贵的时间找出原因,所以我在这里分享解决方案,也许它会有所帮助。


扩展配置文件

[public]
exten => _.,1,NoOp()
same  =>    n,Stasis(myStasisApp)
same  =>    n,Hangup()
Run Code Online (Sandbox Code Playgroud)

当 Asterisk 接到电话时,它会启动 stasis 应用程序。

  1. 创建一座桥。
  2. channel A在此桥中添加传入。
  3. channel B从您的 ari 应用程序创建一个新的传出POST /channels/create
  4. channel B在该桥中添加传出。
  5. channel B目的地拨号,其中两个频道在同一个网桥中POST /channels/{channelId}/dial

现在,您将能够看到带有振铃和应答的新 ARI 拨号事件。

对于挂断,您将收到带有挂断原因代码的频道结束事件,而不是 17 之类的文本,表示忙

星号挂断原因映射

发起频道(Asterisk 版本 13)而不是创建和拨号(Asterisk 版本 14)更简单,但您不会拥有早期媒体或对该频道的完全控制,因为它是由 Asterisk 而不是 ARI 应用程序创建的,因此该频道将在呼叫开始时而不是之前开始将事件发送回 ARI。

Asterisk 14 ARI:创建、桥接、拨号。

ARI 和通道:操作通道状态

这个线程帮助了我们很多:

回复:ARI:发起操作后立即添加通道以桥接

.

.

.

玩得开心 !希望这会有所帮助。
/ohammami