2012-05-31 109 views
3

我想使用AMI在星号接听呼叫。我可以发起呼叫,但完全不知道如何接电话...... 脚本调用:星号AMI - 接听呼叫

#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() 

我需要类似的东西,但接听电话。 不能在* CLI>经理show命令

找到任何有用的命令HALP我,PLOX

回答

11

你不能直接通过AMI接听电话。这是因为新的呼叫将“到达”在拨号方案中配置的给定上下文/优先级/扩展(或者如果不能找到适用的则将被拒绝)。因此,无论发生什么情况,都将从拨号方案中的给定上下文/优先级/扩展开始。

如果你想通过AMI处理呼叫,请尝试使用异步AGI,这样的:

exten => _X.,1,AGI(agi:async) 

这将处理到具有至少1个数字,通过发出事件的任何分机的所有呼叫(AsyncAGI)您可以使用AMI客户端进行处理。

然后,从AMI客户端,您可以发送AGIAction的,如:

Action: AGI 
Channel: SIP/adevice 
Command: ANSWER 
CommandID: MyCommandID 

这将有效地允许您运行AGI命令(和处理呼叫就像你通常会在任何AGI脚本做)从您的AMI客户。

希望它有帮助!

+0

我确定你是对的,但我不知道,在哪里放_exten => _X。,1,AGI(agi:async)_。我是一名Python程序员,而不是Asterisk guru:< – voy

+0

嗨! dialplan位于extensions.conf文件中,请参阅:https://wiki.asterisk.org/wiki/display/AST/Dialplan+Fundamentals和http://www.voip-info.org/wiki/view/Asterisk+配置+ extensions.conf文件。你可能想为你的测试创建一个特殊的上下文,并且在修改它之后,记得在cli中发出“dialplan reload”或重新启动星号,以使这些更改生效 – marcelog

+0

我知道拨号方案在哪里。例如,我使用从内部拨号方案。在哪里粘贴_exten =>(blah)_?也许这没关系?谢谢你浪费你的时间:) – voy