Asterisk ARI 电话会议应用程序:授权/询问密码

ale*_*lex 5 c# rest asterisk websocket

我正在使用 C#/.NET来实现Asterisk RESTful 接口 (ARI)来创建电话会议应用程序。

到目前为止,该应用程序的工作方式如下:

  1. 用户拨打该号码
  2. 应用答案
  3. 应用程序启动语音检测
  4. 应用程序询问姓名并录制音频
  5. 应用程序将用户添加到会议

要求:

在将用户添加到会议之前,我需要在上述过程中添加某种授权。我需要实现要求输入 PIN 码的功能,创建一个 PIN 码结构,如果来电者输入正确的 PIN 码,则将来电者添加到正确的电话会议中。

编码:

会议:

    public Conference( AriClient c, Guid id, string name)
    {
        _client = c;
        Id = id;
        ConferenceName = name;
        State = ConferenceState.Destroyed;

        c.OnChannelDtmfReceivedEvent += c_OnChannelDtmfReceivedEvent; // ??
        c.OnBridgeCreatedEvent += c_OnBridgeCreatedEvent;
        c.OnChannelEnteredBridgeEvent += c_OnChannelEnteredBridgeEvent;
        c.OnBridgeDestroyedEvent += c_OnBridgeDestroyedEvent;
        c.OnChannelLeftBridgeEvent += c_OnChannelLeftBridgeEvent;
        c.OnRecordingFinishedEvent += c_OnRecordingFinishedEvent;

        // Added support for talk detection
        c.OnChannelTalkingStartedEvent += c_OnChannelTalkingStartedEvent;
        c.OnChannelTalkingFinishedEvent += c_OnChannelTalkingFinishedEvent;

        Debug.Print("Added Conference {0}", ConferenceName);
    }
Run Code Online (Sandbox Code Playgroud)

OnChannelEnteredBridgeEvent:

private void c_OnChannelEnteredBridgeEvent(object sender, ChannelEnteredBridgeEvent e)
{
    ConferenceUser confUser = ConferenceUsers.SingleOrDefault(x => x.Channel.Id == e.Channel.Id);
    if (confUser == null) return;

    confUser.State = ConferenceUserState.InConf;

    if (ConferenceUsers.Count(x => x.State == ConferenceUserState.InConf) > 1) // are we the only ones here
    {
        // stop moh
        _client.Bridges.StopMoh(Confbridge.Id);

        // change state
        State = ConferenceState.Ready;

        // announce new user
        _client.Bridges.Play(Confbridge.Id, "recording:" + confUser.CurrentRecodingId, "en", 0, 0, Guid.NewGuid().ToString());
        _client.Bridges.Play(Confbridge.Id, "sound:conf-hasjoin", "en", 0, 0, Guid.NewGuid().ToString());
    }
    else
    {          
        // only caller in conf
        _client.Channels.Play(e.Channel.Id, "sound:conf-onlyperson", "en", 0, 0, Guid.NewGuid().ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

开始会议:

    public bool StartConference()
    {

        // Create the conference bridge
        Debug.Print("Requesting new bridge {0} for {1}", Id, ConferenceName);
        Bridge bridge = _client.Bridges.Create("mixing", Id.ToString(), ConferenceName);

        if (bridge == null)
        {
            return false;
        }

        Debug.Print("Subscribing to events on bridge {0} for {1}", Id, ConferenceName);
        _client.Applications.Subscribe(AppConfig.AppName, "bridge:" + bridge.Id);

        // Start MOH on conf bridge
        _client.Bridges.StartMoh(bridge.Id, "default");

        // Default state is ReadyWaiting until MOH is turned off
        State = ConferenceState.ReadyWaiting;
        Confbridge = bridge;

        // Conference ready to accept calls
        State = ConferenceState.Ready;

        return true;
    }
Run Code Online (Sandbox Code Playgroud)

添加用户:

    public bool AddUser(Channel c) //here check for pin and caller id
    {
        if (State == ConferenceState.Destroying)
            return false;
        if (State == ConferenceState.Destroyed)
        {
            // We should initiate a new conference bridge
            if (!StartConference())
                return false;
        }
        if (State < ConferenceState.Ready) return false;

        // Answer channel
        _client.Channels.Answer(c.Id);

        // Turn on talk detection on this channel
        _client.Channels.SetChannelVar(c.Id, "TALK_DETECT(set)", "");

        // Add conference user to collection
        ConferenceUsers.Add(new ConferenceUser(this, c, _client, ConferenceUserType.Normal));

        return true;
    }
Run Code Online (Sandbox Code Playgroud)

题:

如何在应用程序中引发/调用“询问密码”事件/通道并将输入的 DTMF 数字抓取到变量中?

这可以仅在我的 C# ARI 应用程序中完成,还是需要在 Asterisk 服务器上处理 .conf 文件?

我的首选方法是在我的 C# ARI 应用程序中实现它,因为这会让我更好地控制会议。

arh*_*ops -2

您应该创建一些拨号计划来支持这一点,并要求拨号计划检查您的密码等

当然,在没有拨号方案支持的情况下也可以完成,但在这种情况下,任务就成为专家级别的任务,这样做没有真正的意义。

首先,我可以向您推荐《Asterisk:电话的未来》一书。

您可以使用 func_odbc、读取应用程序、CHANNEL 函数(针对 ip)