2012-05-31 47 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