2012-04-05 74 views
2

我目前正在進行一個項目'電子郵件到語音呼叫'。使用python i'v提取電子郵件&將其轉換爲語音並保存在WAV文件中。現在使用星號(我在我的Ubuntu 10.10操作系統上安裝了Asterisk 10.2.1),我想通過我的系統生成用戶對手機的呼叫(比如說919833000000印度的號碼)。無法使用星號生成對手機的呼叫

我寫了一個python代碼來連接到星號管理器界面。另外我還配置了sip.conf和extensions.conf文件以及manager.conf。我已經註冊了voip提供商voiceall.com並且有一個用戶名密碼。

現在,當我執行python代碼時,代碼得到執行沒有任何錯誤,但沒有發生。沒有電話正在生成。任何人都可以幫助我解決這個問題。 蟒蛇代碼如下:

import sys, os, socket, random 
# Asterisk Manager connection details 
HOST = '127.0.0.1' 
PORT = 5038 
# Asterisk Manager username and password 
USER = 'MYUSERNAME' 
SECRET = 'MYPASSWORD' 
# Set the name of the SIP trunk to use for outbound calls 
TRUNK = 'voiceall' 



OUTBOUND = '919833000000' 

# Send the call details to the Asteirsk Manager Interface 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 
sleep(3) 
s.send('Action: login\r\n') 
s.send('Username: ' + USER + '\r\n') 
s.send('Secret: ' + SECRET + '\r\n\r\n') 
sleep(3) 
s.send('Action: status\r\n') 
data = s.recv(1024) 
print data + '\n' 
s.send('Events: off\r\n\r\n') 
sleep(3) 
s.send('Action: originate\r\n') 
s.send('Channel: Sip/' + TRUNK + '/' + OUTBOUND + '\r\n') 
s.send('WaitTime: 30\r\n') 
s.send('CallerId: VOICEALL_USERNAME\r\n') 
s.send('Application: playback\r\n') 
s.send('Data: /home/Documents/newdemo1' + '\r\n') #newdemo1 is the wave file 
s.send('Context: testing\r\n') 
s.send('Async: true\r\n') 
s.send('Priority: 1\r\n\r\n') 
sleep(10) 
s.send('Action: Logoff\r\n\r\n') 
s.close() 

我的sip.conf文件如下:

[general]     
register => VOICEALL_USERNAME:[email protected]:5038 

[voiceall] 
canreinvite=no 
context=mycontext 
host=sip.voiceall.net 
secret=VOICEALL_PASSWORD ;your password 
type=peer 
username=VOICEALL_USERNAME ;your account 
disallow=all 
allow=ulaw 

fromuser=VOICEALL_USERNAME ;your account 
trustrpid=yes 
sendrpid=yes 
insecure=invite 
nat=yes 

的的extensions.conf文件如下:

[mycontext] 

include => voiceall-outbound 

[voiceall-outbound] 
exten => _1NXXNXXXXXX,1,Dial(SIP/${EXTEN}@voiceall) 
exten => _1NXXNXXXXXX,n,Playback(/home/Documents/demonew1) 
exten => _1NXXNXXXXXX,n,Hangup() 
exten => _NXXNXXXXXX,1,Dial(SIP/1${EXTEN}@voiceall) 
exten => _NXXNXXXXXX,n,Playback(/home/Documents/demonew1) 
exten => _NXXNXXXXXX,n,Hangup() 
exten => _011.,1,Dial(SIP/${EXTEN}@voiceall) 
exten => _011.,n,Playback(/home/Documents/demonew1) 
exten => _011.,n,Hangup() 

請幫我因爲我是星號新手。 任何幫助將不勝感激。提前致謝。

回答

2

有幾件事情需要注意之前,我對你發起的命令發表評論:對通過TCP的AMI

  1. 一個Python包裝庫已經存在:starpy。你可能想檢查一下,因爲它會減少重新發明輪子的數量,你需要做的就是讓自己啓動並運行。

  2. 通常,您可能不應該在AMI操作中爲每個參數使用單獨的TCP發送。相反,您應該分別發送每封郵件。一般來說,starpy通過將每個AMI動作視爲鍵/值對的字典來處理這一問題,這顯然很好地映射到AMI的語法。如果您決定不使用starpy,您可能仍然希望看到他們如何將通用字典映射到AMI操作。

  3. 您是否在manager.conf中爲您的用戶提供了相應的認證類別?爲了發起呼叫時,您的用戶需要在寫入授權發起類

在你的起源,你試圖撥打SIP/voiceall/9198.33億。這意味着Asterisk將創建一個SIP通道並在contextall-outbound(因爲它是您指定的對等設備的默認上下文)的情況下在匹配您指定的擴展的位置啓動它的pbx_thread。

首先,您試圖放置的擴展名爲919833000000.您沒有與此匹配的擴展名 - 最接近的是_NXXNXXXXXX。這指定其模式匹配,第一個字符必須是數字[2-9],接下來的兩個字符是數字[0-9],第四個字符是數字[2-9],接下來的六個字符字符是數字[0-9],總共10個字符。您指定的擴展名是12個字符。我希望發源失敗。

讓我們假設發起者確實成功了,並且您有與_NXXNXXXXXX相同的應用程序的模式匹配擴展。您正在發起的頻道將與其他內容綁定 - 無論是其他上下文,擴展程序,撥號方案中的優先級還是應用程序。在你的情況中,你已經指定了:連接到(播放)的應用程序,你傳遞給它的數據,以及上下文和優先級(但沒有擴展名)。這是無效的。從Asterisk的「經理show命令發起」:

訊號分配延長 擴展使用(需要「語境」和「優先」) 語境 上下文中使用(需要「訊號分配延長」和「優先級」) 優先 優先使用(需要「擴展」和「上下文」)

通常,您不會將應用程序/數據與上下文,擴展,優先級組合在一起。如果您只想通過撥打的電話進行非常簡單的操作,則存在應用程序/數據選項 - 在您的示例中,播放符合條例要求的消息,但通常情況下,我更願意將其連接到撥號方案中的其他位置,更多的控制。我假設你想使用語境,訊號分配延長,優先級 - 在這種情況下,你可以這樣做以下:

[testing] 
exten => internal_playback,1,NoOp() 
same => n,Playback(/home/Documents/demonew1) 
same => n,Hangup() 

[voiceall-outbound] 
exten => _9XXXXX000000,1,NoOp() 
same => n,Dial(SIP/${EXTEN}@voiceall) 
same => n,Hangup() 

你的起源,然後會是這個樣子:

Action: Originate 
Channel: local/[email protected] 
Context: voiceall-outbound 
Exten: 919833000000 
Priority: 1 

你我們將注意到,我們不再使用SIP通道撥入撥號方案。您仍然可以在您的原始設備上使用SIP頻道 - 這裏只是個人偏好。 Dial應用程序已經爲我們創建了一個SIP通道,並將它連接到我們始發的任何地方,所以我們只使用本地通道。對於我們的本地頻道,我們將一端連接到內置播放擴展,用於向撥打方播放聲音,另一端播放我們的外向分機。

+0

嘿馬特..感謝洛特的回覆...我真的很感謝你付出的努力來詳細解釋..他解決了我的問題..再次感謝.. :-) – 2012-04-08 17:46:30

+0

沒問題。如果您願意,請將此標記爲您的問題的答案:-) – 2012-04-09 01:26:23