4

我的目标

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

问题

在我的 ARI 应用程序中,如果我在拨号方案中省略了same => n,Ringing线路,如果呼叫者挂断,Stasis 应用程序会返回错误。channel.play()在我通过 ARI传递命令之前,我可以在没有任何早期媒体的情况下挂断电话。

此解决方案有 2 个问题:

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

有没有人有什么建议?

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

更新

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

extensions.conf

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

myApp.js

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

// The user is busy
channel.continueInDialplan();

错误

当呼叫者挂断时发送另一个 StasisStart,然后是:

Unhandled rejection Error: {
  "message": "Channel not found"
}
4

1 回答 1

6

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


extensions.conf

[public]
exten => _.,1,NoOp()
same  =>    n,Stasis(myStasisApp)
same  =>    n,Hangup()

当 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:发起操作后立即将通道添加到桥接

.

.

.

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

于 2018-07-11T08:22:53.587 回答