我一直在使用C#构建WinForms桌面应用程序,该应用程序使用Aster.NET(以前/从Asterisk.NET分叉)与Asterisk交互。我们确实无法可靠地识别和跟踪与单个分机/用户相关的呼叫。
我们遇到的问题是由于Asterisk触发/触发的事件具有不可预测/模糊的性质,它们的变化很大,具体取决于呼叫到达分机之前路由的方式。
例如,在以下情况下,事件顺序/格式是不同的:呼叫在被盲目转移之前命中了IVR;如果呼叫在被转移前打到IVR;如果呼叫直接转到用户的分机。
Asterisk使用不同的唯一ID跟踪呼叫的每一端的方式(例如,呼叫的传入端具有与呼叫的接收端不同的UID),这进一步受到阻碍。尽管我们设法在(随后很丑陋!)代码中对此进行了说明,但在考虑该呼叫可以采用的不同路由路径方面仍然遇到了问题。
因此,我正在寻找有关如何执行以下操作的建议:
就目前而言,我们拥有极其复杂的事件处理程序链,这些事件处理程序根据应用程序的“当前状态”进行不同的操作。
举一个例子:如果我们检测NewStateEvent与ChannelState 6的(“上”),我们检查是否有过程正在进行的呼叫和那的UID匹配,如果是的话,那么当前呼叫已被应答。如果UID不匹配,但其他因素匹配(例如,通道,connectedlinenum等),则我们将其视为呼叫的“另一端”(即接收方或传入方)。
我不确定问题是出在API还是AMI上-但是无论是什么原因,这都使我们有些头疼。
任何建议,不胜感激。
我正在制作一个应该能够监控我的Asterisk服务器上的呼叫的Web应用程序.我可以使用URL上的Javascript WebSocket连接到ARI ws://(host):8088/ari/events?app=dialer并且它可以工作.问题是我只从通过ARI进行的呼叫中获取事件.来自Zoiper等其他客户的电话未注册.在另一方面,Asterisk有AJAM它采用长轮询上http://(host):8088/rawman?action=waitevent和它注册的所有客户端,(ARI,Zoiper和其他人)电话,但这里只有信息谁在呼叫(主叫),没有人(被叫).
所以,我的问题是,如何从所有客户端(最好)使用WebSockets获取实时调用事件,以显示谁在调用谁.谢谢.
我想使用AMI在Asterisk中接听电话.我可以发起电话,但完全不知道,如何接听电话......打电话的脚本:
#login
sock = socket.socket(af, socktype, proto)
sock.connect(sockaddr)
sock.send('Action: login\r\n')
sock.send('Events: off\r\n')
sock.send('Username: '+str(ast_server.login)+'\r\n')
sock.send('Secret: '+str(ast_server.password)+'\r\n\r\n')
#originate call
sock.send('Action: originate\r\n')
sock.send('Channel: ' + str(user.asterisk_chan_type) + '/' + str(user.internal_number)+'\r\n')
sock.send('Timeout: '+str(ast_server.wait_time*1000)+'\r\n')
sock.send('CallerId: '+str(user.callerid)+'\r\n')
sock.send('Exten: '+str(ast_number)+'\r\n')
sock.send('Context: '+str(ast_server.context)+'\r\n')
if ast_server.alert_info and user.asterisk_chan_type == 'SIP':
sock.send('Variable: SIPAddHeader=Alert-Info: '+str(ast_server.alert_info)+'\r\n')
sock.send('Priority: '+str(ast_server.extension_priority)+'\r\n\r\n')
#logout
sock.send('Action: Logoff\r\n\r\n')
time.sleep(1)
sock.close()
Run Code Online (Sandbox Code Playgroud)
我需要类似的东西,但是要接听电话.在*CLI> manager show命令中找不到任何有用的命令
打瞌睡,plox
是否可以将SIP请求记录到星号中的数据库?我对这些细节很感兴趣:
我很确定可以将queue_log事件转换为SIP请求并从中获取上述信息.但是,由于并非所有呼叫都通过呼叫队列,因此此解决方案对我不起作用.
也许通过使用AMI可以实现?或者写自定义拨号方案?请分享您对此问题的看法.
我已经开始阅读有关Asterisk :: AMI模块的内容.在该模块中,如果我们要将操作发送到AMI服务器,我们需要使用send_action方法使用Action with action name.在那个模块中,他们提到了send_action方法中的Action =>'Ping'.这里有什么用于Action =>'Ping'.任何人都可以解释一下.
send_action({ Action => 'Ping',
CALLBACK => \&method,
});
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我有一个非常基本的 extensions.conf,内容如下context:
[LocalPhones]
exten => 1001,1,noop(Dialing ${PEX_ONE})
same => n,Macro(DialStartMonitor,${PEX_ONE})
same => n,Dial(SIP/${PEX_ONE},30,mTt)
same => n,Playback(vm-nobodyavail) ; Play "no one's available"
same => n,Hangup()
exten => 1002,1,noop(Dialing ${PEX_TWO})
same => n,Macro(DialStartMonitor,${PEX_TWO})
same => n,Dial(SIP/${PEX_TWO},30,mTt)
same => n,Playback(vm-nobodyavail) ; Play "no one's available"
same => n,Hangup()
exten => 1003,1,noop(Dialing ${PEX_THREE})
same => n,Macro(DialStartMonitor,${PEX_THREE})
same => n,Dial(SIP/${PEX_THREE},30,mTt)
same => n,Playback(vm-nobodyavail) ; Play "no one's available"
same => n,Hangup()
exten => 1004,1,Dial(Dialing ${PEX_FOUR})
same => n,Macro(DialStartMonitor,${PEX_FOUR})
same => n,Dial(SIP/${PEX_FOUR},10,m)
same => …Run Code Online (Sandbox Code Playgroud)