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

2024-10-01 13:37:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在做一个项目'电子邮件到语音电话'。使用python提取电子邮件,并将其转换为语音并保存在WAV文件中。现在使用asterisk(我在我的Ubuntu10.10操作系统上安装了asterisk 10.2.1),我想通过我的系统生成对用户手机的呼叫(比如919833000000印度号码)。在

我写了一个python代码来连接到asterisk管理器接口。我还配置了sip.conf公司以及扩展名.conf文件以及经理.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公司文件如下:

^{pr2}$

在扩展名.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()

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


Tags: 文件the代码sendhomeconfmanageraction
1条回答
网友
1楼 · 发布于 2024-10-01 13:37:49

在我评论你的原始命令之前,有几点需要注意:

  1. 针对TCP上的AMI的python包装库已经存在:starpy。你可能想检查一下,因为这将减少重新发明轮子的数量,你需要做的是让自己站起来并运行起来。

  2. 一般来说,您可能不应该为AMI操作中的每个参数使用单独的TCP发送。相反,您应该分别发送每个消息。一般来说,starpy很好地处理了这一点,它将每个AMI操作视为键/值对的字典,这显然很好地映射到AMI的语法。如果您决定不使用starpy,您可能还想看看它们是如何将通用字典映射到AMI操作的。

  3. 您在中为您的用户提供了适当的身份验证类吗经理.conf?为了发起呼叫,您的用户需要写授权上的originate类

在你的发端,你试图拨打SIP/voiceall/919833000000。这意味着Asterisk将创建一个SIP通道,并在context voiceall outbound(因为它是您指定的对等机的默认上下文)启动其pbx_线程,扩展名与您指定的内容相匹配。在

首先,您要放置的分机号是919833000000。您没有与此匹配的扩展名-最接近的扩展名是\u nxxnxxxxx。它指定模式匹配,第一个字符必须是数字[2-9],接下来的两个字符是数字[0-9],第四个字符是数字[2-9],接下来的六个字符是数字[0-9],总共10个字符。您指定的扩展名是12个字符。我认为起源会失败。在

假设origine确实成功了,并且您有一个模式匹配扩展,其应用程序与NXXNXXXXXX相同。您要发起的频道将绑定到其他内容-或者是另一个上下文、扩展、拨号计划中的优先级或应用程序。在您的例子中,您同时指定了两个应用程序:要连接的应用程序(播放),以及传递给它的数据,以及上下文和优先级(但没有扩展名)。那是无效的。从Asterisk的“manager show command originate”中:

延伸 要使用的扩展(需要“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()

你的起源看起来像这样:

^{pr2}$

你会注意到我们不再使用SIP通道来调用拨号计划。你仍然可以使用SIP通道在你的起源-这实际上只是个人偏好。 拨号应用程序已经为我们创建了一个SIP通道,并将它连接到我们所创建的任何地方,所以我们只使用本地通道。对于本地频道,我们将一端连接到内部播放分机,我们使用该分机向拨号方播放声音,另一端连接到出站分机。在

相关问题 更多 >