2

私は現在、「電子メールから音声通話」というプロジェクトに取り組んでいます。Pythonを使用して、電子メールを抽出して音声に変換し、WAVファイルに保存しました。今アスタリスクを使用しています(ubuntu 10.10osにAsterisk10.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:VOICEALL_PASSWORD@sip.voiceall.net: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()

私はアスタリスクに慣れていないので、私を助けてください。どんな助けでもありがたいです。前もって感謝します。

4

1 に答える 1

2

あなたのoriginコマンドについてコメントする前に注意すべき点がいくつかあります。

  1. AMI over TCP用のPythonラッパーライブラリはすでに存在します:starpy。あなたはそれをチェックしたいかもしれません、それはあなたがあなた自身を立ち上げて走らせるためにあなたがする必要があるであろう車輪の再発明の量を減らすでしょう。

  2. 一般に、AMIアクションのパラメーターごとに個別のTCP送信を使用するべきではありません。代わりに、各メッセージを個別に送信する必要があります。一般に、starpyは、各AMIアクションをキー/値ペアのディクショナリとして扱うことにより、これを非常にうまく処理します。これは、明らかにAMIの構文に非常によく対応しています。starpyを使用しないことにした場合でも、一般的な辞書をAMIアクションにマップする方法を確認することをお勧めします。

  3. manager.confにユーザーに適切な認証クラスがありますか?通話を発信するには、ユーザーは書き込み認証で発信クラスを必要とします

オリジネーションで、SIP / voiceall/919833000000にダイヤルしようとしています。これは、AsteriskがSIPチャネルを作成し、指定したものと一致する内線で、コンテキストvoiceall-outbound(指定したピアのデフォルトコンテキストのため)でpbx_threadを開始することを意味します。

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

オリジンが成功し、_NXXNXXXXXXと同じアプリケーションでパターンマッチ拡張があったと仮定しましょう。発信元のチャネルは、別のコンテキスト、内線番号、ダイヤルプランの優先度、またはアプリケーションなど、他の何かに関連付けられます。あなたの場合、あなたは両方を指定しました:接続するアプリケーション(再生)、それに渡すデータ、およびコンテキストと優先度(ただし拡張子なし)。それは無効です。アスタリスクの「managershowcommandorigin」から:

使用するExten拡張機能(「Context」および「Priority」が必要)コンテキスト使用するコンテキスト(「Exten」および「Priority」が必要)優先度使用する優先度(「Exten」および「Context」が必要)

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

[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/internal_playback@testing
Context: voiceall-outbound
Exten: 919833000000
Priority: 1

ダイヤルプランの呼び出しにSIPチャネルを使用しなくなったことに注意してください。発信元でSIPチャネルを使用することもできますが、ここでは個人的な好みです。DialアプリケーションはすでにSIPチャネルを作成し、それを発信元にブリッジするため、ローカルチャネルを使用するだけです。ローカルチャネルの場合、一方の端をダイヤルされた相手にサウンドを再生するために使用する内部再生拡張機能に接続し、もう一方の端をアウトバウンド拡張機能に接続します。

于 2012-04-06T16:03:55.123 に答える