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

时间:2018-06-12 15:33:05

标签: asterisk asterisk-ari

我的目标

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

问题

使用我的AR​​I应用程序,如果我从拨号方案中省略same => n,Ringing行,则如果呼叫者挂机,Stasis应用程序会返回错误。在没有任何早期媒体的情况下,我可以暂停通话,直到我通过ARI传递channel.play()命令。

此解决方案有两个问题:

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

    有人有任何建议吗?

    我目前唯一能看到的选项是确保所有用户都拥有语音信箱,并且永远不会播放忙音。不是每个人都希望/喜欢语音邮件,在没有来电者知道他们的电话已连接的情况下接听电话并播放忙音是不合乎道德的。

    更新

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

    的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"
    }
    

1 个答案:

答案 0 :(得分:1)

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


extensions.conf

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

当Asterisk接到电话时,它将启动停滞应用程序。

  1. 创建桥梁。
  2. 在此网桥中添加传入的channel A
  3. 使用channel B从ari应用中创建新的传出POST /channels/create
  4. 在该网桥中添加传出的channel B
  5. channel B的目的地拨打电话,两个频道 与POST /channels/{channelId}/dial
  6. 处于同一桥梁

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

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

Asterisk Hangup Cause Mappings

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

Asterisk 14 ARI: Create, Bridge, Dial.

ARI and Channels: Manipulating Channel State

该线程对我们有很大帮助:

Re: ARI: add channel to bridge immediatelly after originate action

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