2012-04-05 8 views
2

私は現在、「電子メールによる音声通話」プロジェクトに取り組んでいます。 Pythonを使用して私は電子メールを抽出&スピーチに変換し、WAVファイルに保存されます。今アスタリスク(私はubuntu 10.10 OSにAsterisk 10.2.1をインストールしています)を使用して、私のシステムを通してユーザーの携帯電話(919833000000インドの番号)に電話をかけたいと思います。アスタリスクを使用して携帯電話に電話を発信できません。

アスタリスクマネージャインターフェイスに接続するためのPythonコードを書いています。また、私はsip.confとextensions.confファイルとmanager.confを設定しました。私はVoIPプロバイダvoiceall.comに登録しており、そのユーザ名パスワードを持っています。

私はPythonコードを実行しているとき、コードは何のエラーもなく実行されていますが、何も起こっていません。コールは生成されません。誰もがこれで私を助けることができますか? 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

私はあなたoriginateコマンドにコメントする前に注意すべきいくつかのこと:TCP経由AMIのための

  1. のpythonラッパー・ライブラリーがすでに存在している:starpyを。それをチェックして、自分自身を稼働させるために必要なホイールの再発明量を減らすことができます。

  2. 一般的に、AMIのアクションでは、各パラメータに別々のTCP送信を使用しないでください。代わりに、各メッセージを個別に送信する必要があります。一般的に、starpyはAMIの各アクションをキー/値のペアの辞書として扱うことでこれを非常にうまく処理します。これは明らかにAMIの構文とよく似ています。あなたがstarpyを使用しないことにした場合でも、それらが一般辞書をどのようにAMIの動作にマップしているかを見たいかもしれません。

  3. manager.confには、ユーザーの適切な認証クラスがありますか。コールを発信するためには、ユーザーは、あなたが/ voiceall /9198.33億SIPをダイヤルしようとしている書き込みの権限であなたの元に

を発信するクラスが必要になります。これは、アスタリスクがSIPチャネルを作成し、指定した拡張子に一致するコンテキストvoiceall-outbound(指定した同輩のデフォルトコンテキストなので)でpbx_threadを開始することを意味します。

最初に配置しようとしている内線番号は919833000000です。これに対応する内線番号はありません。最も近いのは_NXXNXXXXXXです。これはパターンが一致すること、最初の文字は数字[2-9]、次の2文字は数字[0-9]、4番目の文字は数字[2-9]、次の6文字文字は数字[0-9]で、合計10文字です。指定している拡張子は12文字です。私は起源が失敗することを期待するでしょう。

発信元が成功し、_NXXNXXXXXXと同じアプリケーションでパターンマッチ拡張があったとします。あなたが発信しているチャネルは、別のコンテキスト、内線、ダイヤルプランの優先順位、またはアプリケーションのいずれかに結びついています。あなたのケースでは、接続するアプリケーション(再生)、渡すデータ、コンテキストと優先度(拡張子なし)の両方を指定しています。それは有効ではありません。アスタリスクの「マネージャのshowコマンド発信」から:

EXTEN 拡張子を使用する(「コンテキスト」と「優先順位」を必要とする) コンテキスト コンテキストを使用する(「EXTEN」と「優先順位」を必要とする) 優先 優先順位を使用します( 'Exten'と 'Context'が必要です)

一般に、アプリケーション/データをContext、Exten、Priorityと組み合わせないでください。アプリケーション/データオプションは、あなたがダイヤルしたものだけで非常に単純なアクションをしたいときに存在します - 例では、メッセージを再生するのは法案に合っていますが、一般的にはダイヤルプランの何かにそれを接続してより多くの制御。

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

ます:

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

あなたの発信後、次のようになります。その場合には、次のような何かを行うことができます - 私は優先順位は、あなたがコンテキストを使用したいEXTENを仮定しますダイヤルプランを呼び出すためにSIPチャネルを使用していないことに注意してください。あなたは元の場所でSIPチャンネルを使用することができます。これは本当に個人的な好みです。 ダイヤルアプリケーションは、すでに私たちのためにSIPチャネルを作成し、発信元にそれを橋渡しするので、ローカルチャネルだけを使用します。私たちのローカルチャンネルでは、私たちがダイヤルしたパーティーにサウンドを出すために使用する私たちの内部再生拡張部に一端を接続し、アウトバウンド拡張部にもう一端を接続します。

+0

私は本当にあなたが詳細に説明するために入れた努力に感謝します。私の問題を解決しました。再び感謝します。:-) –

+0

問題はありません。あなたが望むなら、あなたの質問への答えとしてこれをマークしてください:-) –

関連する問題