我该如何将Twilio用作我的Asterisk的SIP中继来进行呼入和呼出?

9
我有一个Twilio账户,其中有一个电话号码(假设为8881231234),并且我有一个Asterisk盒子。我想使用Twilio作为Asterisk的中继以便按他们的费率进行通话并从我的Asterisk上接听来电。
我没有找到任何将Asterisk与Twilio连接的规格说明。是否可以设置Asterisk,使得每个外向呼叫都通过Twilio路由,并使我的SIP电话响铃接听我8881231234号码上的电话?
2个回答

23

如下所述,Twilio现在可以作为SIP线路工作,您可以访问https://www.twilio.com/docs/sip-trunking了解更多信息。


此版本已废弃!!!您应该使用TWILIO自己的SIP TRUNKING...请单击此处阅读

Twilio不支持作为SIP线路工作... 它是面向想要基于其服务构建应用程序的开发人员。但是,并没有什么阻止您构建一个允许您通过Twilio拨出呼叫并在asterisk上从它们接收呼叫的应用程序。您需要一个HTTP服务器来返回Twilio要求的XMLs。

通过Twilio拨打电话

需要三个步骤:

  1. 在Twilio上创建域并设置用户
  2. 设置Asterisk,以便在拨打号码时到达Twilio
  3. 处理Twilio的请求并返回TwiML(一种特殊类型的XML,在他们的网站上有极好的文档)。他们为几乎所有语言提供SDK,但我会保持这个回复与语言无关,并且仅处理TwiML。

在Twilio上创建域

这应该是非常直接的......假设您有一个Twilio帐户,只需转到https://www.twilio.com/user/account/sip/domains并设置一个域。我有一个动态IP,所以我使用了凭据列表(并将在第2步中使用)。如果您有静态IP, 可以直接使用。我假设您称呼域为“example”,所以我将讨论域example.sip.twilio.com

作为语音URL,您应该放置一个指向您的Web服务器的URL(是的,您需要一个...但它可以是便宜的),指向可以处理他们请求的URL。在第三步中,我将向您展示它应该返回什么。

设置Asterisk,以便在拨打号码时到达Twilio

您需要做的第一件事是在您的sip.conf文件中添加设备

[twilio]
type = peer
username = myusername
remotesecret = mypassword
host = example.sip.twilio.com
qualify = no

然后,在您的extensions.conf文件中使用它(我使用前缀88呼叫Twilio...所以如果我拨打8818881231235,则会通过Twilio呼叫美国电话号码(888)123-1235)。

exten => _88.,1,Dial(SIP/${EXTEN:2}@twilio)

就这样... 当你拨打那个号码时,你就能联系到 Twilio。

处理 Twilio 的请求并返回 TwiML

在第一步中,Twilio 会调用您设置的 URL。它执行一个 HTTP POST 请求,其中有一个名为 To 的参数和 Asterisk 调用的 URL,所以如果你拨打了 8818881231235,你将在 To 参数中得到该号码。

sip:18881231235@example.sip.twilio.com

你应该获取该参数并提取其中的数字,然后直接返回。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Dial callerId="+18881231234">
    <Number>18881231235</Number>
  </Dial>
</Response>

如果你在使用PHP,你可以像这样做:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Dial callerId="+18881231234">
    <Number><?php preg_match('/:([0-9]+)@/', $_POST['To'], $matches); echo $matches[1]; ?></Number>
  </Dial>
</Response>

完成了,现在您可以使用Twilio作为主干线路拨打电话。

从Twilio接收电话

接收来自Twilio的电话更简单(当你弄清楚一些东西时)。首先,您应该为每个要求您白名单的IP设置一个设备,因此在您的sip.conf中,您应该添加以下内容:

[twiliocaller](!)
context = fromtwilio
type = peer
qualify=no
allowguest=yes
 
[twilioip-1](twiliocaller)
host=107.21.222.153
 
[twilioip-2](twiliocaller)
host=107.21.211.20
 
[twilioip-3](twiliocaller)
host=107.21.231.147
 
[twilioip-4](twiliocaller)
host=54.236.81.101
 
[twilioip-5](twiliocaller)
host=54.236.96.128
 
[twilioip-6](twiliocaller)
host=54.236.97.29
 
[twilioip-7](twiliocaller)
host=54.236.97.135
 
[twilioip-8](twiliocaller)
host=54.232.85.81
 
[twilioip-9](twiliocaller)
host=54.232.85.82
 
[twilioip-10](twiliocaller)
host=54.232.85.84
 
[twilioip-11](twiliocaller)
host=54.232.85.85
 
[twilioip-12](twiliocaller)
host=54.228.219.168
 
[twilioip-13](twiliocaller)
host=54.228.233.229
 
[twilioip-14](twiliocaller)
host=176.34.236.224
 
[twilioip-15](twiliocaller)
host=176.34.236.247
 
[twilioip-16](twiliocaller)
host=46.137.219.1
 
[twilioip-17](twiliocaller)
host=46.137.219.3
 
[twilioip-18](twiliocaller)
host=46.137.219.35
 
[twilioip-19](twiliocaller)
host=46.137.219.135
 
[twilioip-20](twiliocaller)
host=54.249.244.21
 
[twilioip-21](twiliocaller)
host=54.249.244.24
 
[twilioip-22](twiliocaller)
host=54.249.244.27
 
[twilioip-23](twiliocaller)
host=54.249.244.28

您需要设置一个号码来呼叫您的Asterisk。假设您的Asterisk域名为sip.example.com,您想让Twilio响铃到分机100,您需要设置以下内容:

 <Dial>
   <Sip>sip:100@sip.example.com</Sip>
</Dial>
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Dial>
    <Sip>sip:100@sip.example.com</Sip>
  </Dial>
</Response>

如果您使用Twilio提供的Twimlets,您不需要使用服务器来完成此操作...因此,使用回声Twimlet,您可以设置您的号码指向 http://twimlets.com/echo?Twiml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%3CResponse%3E%3CDial%3E%3CSip%3Esip%3A100%40sip.example.com%3C%2FSip%3E%3C%2FDial%3E%3C%2FResponse%3E&

这就完成了......您应该在fromtwilio上处理分机100的呼入电话。

更新:正如xinit在评论中指出的那样,Twilio可能从任何IP地址拨打您......甚至是您的域名(example.sip.twilio.com)指向的IP地址...所以您需要通过将其添加到模板来更新[twilio]设备。现在它应该看起来像这样:

[twilio](twiliocaller)
type = peer
username = myusername
remotesecret = mypassword
host = example.sip.twilio.com
qualify = no
如果您对我是如何得到这个答案感兴趣,可以查看我写的这些博客文章。 我从中复制了很多内容来调整这个答案。 从家里拨打 Twilio 电话 接收来自 Twilio 的电话

Twilio的布道者在此。天啊!非常感谢您发布这个绝对惊人的答案。 - Devin Rader
谢谢您的评论!我喜欢您的服务 :) 嘿,如果您有一个twimlet可以从To参数中提取电话号码(就像我在这里使用PHP一样),那将是非常好的,这样就有一种方法可以使用Twilio作为SIP传输线路而不需要一个Web服务器。 - g3rv4
1
在这两种情况下,您都需要使用双腿,并且您需要为双方支付费用。对于来电(假设您拥有美国号码),您需要支付每分钟1美分的费率(即呼入费率),加上SIP费率0.50美分(500,000分钟后会降低)。因此,在Twilio上,一个来电将花费1.5美分/分钟。按照同样的逻辑,如果您拨打到美国的外拨电话,则需要支付每分钟2美分+ SIP通话的0.5美分,总计每分钟2.5美分。 - g3rv4
我遇到了一个问题,偶尔会使用错误的上下文来处理传入的电话。原来,twilio的呼叫来自几个IP地址,这些地址也包含在twilioips列表中。由于[twilio]没有上下文,所以使用了默认上下文。可以通过指定twilio来解决这个问题。 - xinit
这是一个很好的观察 :) 我会在回复中包含它。谢谢! - g3rv4
显示剩余3条评论

8

Twilio似乎现在提供SIP中继服务。


没错,Twilio现在提供VoIP系统的SIP中继服务。您可以参考文档技能培训获取更多信息。 - beanserver
你说得完全正确。我已经修改了我的答案来考虑到那个问题。 - g3rv4
我已经改变了被接受的答案,因为人们应该完全去那里 :) - g3rv4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接