ale*_*lex 5 c# rest asterisk websocket
我正在使用 C#/.NET库来实现Asterisk RESTful 接口 (ARI)来创建电话会议应用程序。
到目前为止,该应用程序的工作方式如下:
要求:
在将用户添加到会议之前,我需要在上述过程中添加某种授权。我需要实现要求输入 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)
| 归档时间: |
|
| 查看次数: |
1180 次 |
| 最近记录: |