无法使用星号生成对手机的呼叫

时间:2012-04-05 08:47:56

标签: python voip asterisk

我目前正在开发一个项目'电子邮件到语音电话'。使用python i'v提取电子邮件&将其转换为语音并保存在WAV文件中。现在使用星号(我在我的ubuntu 10.10操作系统上安装了Asterisk 10.2.1)我想通过我的系统生成对用户的手机(比如919833000000 india的号码)。

我编写了一个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()

请帮助我,因为我是星号的新手。 任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:2)

在评论您的originate命令之前需要注意的一些事项:

  1. 已存在针对AMI over TCP的python包装器库:starpy。你可能想要检查一下,因为它会减少重新发明你需要做的轮子的数量,以便让自己开始运行。

  2. 通常,您可能不应该为AMI操作中的每个参数使用单独的TCP发送。相反,您应该单独发送每条消息。一般来说,starpy通过将每个AMI操作视为键/值对的字典来处理这一点,这显然可以很好地映射到AMI的语法。如果您决定不使用starpy,您可能仍希望了解他们如何将通用词典映射到AMI操作。

  3. 您是否在manager.conf中为您的用户提供了适当的身份验证类?为了发起呼叫,您的用户将需要写授权的原始类

  4. 在您的发起时,您尝试拨打SIP / voiceall / 919833000000。这意味着Asterisk将创建一个SIP通道并在上下文语音出站处启动其pbx_thread(因为它是您指定的对等方的默认上下文),在与您指定的扩展名匹配的扩展名上。

    首先,您尝试放置的扩展程序是919833000000.您没有与此匹配的扩展程序 - 您最接近的扩展程序是_NXXNXXXXXX。这指定它的模式匹配,第一个字符必须是数字[2-9],接下来的两个字符是数字[0-9],第四个字符是数字[2-9],接下来的六个字符是数字[0-9],总共10个字符。您指定的扩展名为12个字符。我希望原产地失败。

    假设原始版本确实成功,并且您使用了与_NXXNXXXXXX相同的应用程序的模式匹配扩展。您正在创建的频道将与其他内容绑定 - 另一个上下文,扩展,拨号方案中的优先级或应用程序。在您的情况下,您已经指定了两个:连接到(回放)的应用程序,您传递给它的数据,以及上下文和优先级(但没有扩展名)。那是无效的。从Asterisk'经理show命令发起':

    讯号分配延长     扩展使用(需要'上下文'以及'优先级') 上下文     要使用的上下文(需要' 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通道,并将其连接到我们发起的任何地方,因此我们只使用本地通道。对于我们的本地频道,我们将一端连接到我们用于向被拨打方播放声音的内部播放分机,另一端连接到我们的出站分机。