8

使用 twilio,在现有呼叫(2 条腿 - 呼叫者腿和被叫腿)上,我想将呼叫移动到会议室。双腿必须出现在房间里 如何在不失去一条或另一条腿的情况下架起两条腿?

谢谢

问候

4

4 回答 4

11

防止呼叫掉线的技巧是使用父分支的“操作”url 拨入会议并修改子分支以在同一个会议中移动。

这是在 2 人之间开始通话然后将其升级为会议的详细流程

(1) 创建一个 TwiML 响应 API 以在会议中拨打电话(基于适合您的业务逻辑)。这是一个简单的 TwiML 示例(http://www.mocky.io/v2/584ac0f81000002b14fb0205

<Response>
<Dial>
<Conference>letItGoSimple</Conference>
</Dial>
</Response>

(2) 当您发起呼叫时,您的Url 参数应设置为返回 TwiML,如下所示(例如 Twiml:http ://www.mocky.io/v2/584ac8a3100000c914fb0214 )

<Response>
<Dial action="http://www.mocky.io/v2/584ac0f81000002b14fb0205" method="GET">
<Number>+44xxxxxxxx</Number>
</Dial>
</Response>

请注意,从第一步开始,操作 url 已设置为 TwiML。这在此流程中非常重要,因为这将防止您在修改呼叫的子分支时掉线。

(3) 执行第 2 步后,双方直接通话(无会议)

(4) 当您想将呼叫升级为会议时,POST 到子呼叫 SID,Url设置为 Twiml To Dial into meeting ,

Example : 
curl -XPOST https://api.twilio.com/2010-04-01/Accounts/ACxxxxxxxxxxxx/Calls/CAyyyyyyyyyyyyyy -d "Url=http://www.mocky.io/v2/584ac0f81000002b14fb0205" -d "Method=GET"  -u ‘accountSID:authToken'

修改呼叫的子分支很重要。

(5) 这是执行第 4 步时会发生的情况

  • 子呼叫将被重定向到 URL 并被拨入会议
  • 家长电话将采取行动,并将在同一会议中拨打

希望这可以帮助。

于 2016-12-09T15:09:19.310 回答
4

Twilio 员工在这里。

要添加到 am1704 的答案,同一主题的变体是使用<Redirect>动词 after <Dial>

<Response>
  <Dial>
    <Number>+44xxxxxxxx</Number>
  </Dial>
  <Redirect method="GET">http://www.mocky.io/v2/584ac0f81000002b14fb0205</Redirect>
</Response>

一旦子呼叫被移至会议,TwiML 将继续使用动词 after <Dial>

这两种技术都需要了解呼叫状态。在某些呼叫中,所需的下一步可能是<Hangup>. 在其他情况下,可能希望将父分支移至会议。

于 2016-12-09T15:52:31.787 回答
3

Twilio 布道者在这里。

因此,最好的答案是将两个电话都放入会议开始。它有点困难,因为您必须使用 API 来启动第二条腿,但它为您提供了更多的灵活性来移动呼叫腿。

如果那不可能,那么它会变得更具挑战性,因为今天没有很好的方法来获取第二个呼叫的 SID。您可能需要做的是使用 REST API 中的调用列表资源来查找第二个调用的 SID。您可以使用列表过滤参数 ToStatus来查找特定呼叫。一旦你有了第二段的呼叫资源,它就会包含一个名为 parent_call_sid 的参数,它是原始传入呼叫的​​ SID。

现在您已经拥有了两个呼叫段的 SID,您可以使用 REST API将两个呼叫重定向<Conference>到新的语音 URL,这些 URL 返回包含该名词的 TwiML 。

希望有帮助。

于 2014-04-07T17:44:34.287 回答
0

该线程很有帮助,但是有一个建议可以添加到 am1704 所说的内容中-

如果您想避免使用 am1704 使用的 action= 方法,您还可以移动子分支,然后使用第二个 HTTP (curl) 请求移动父分支。请注意,呼叫的方向在这里很重要:父支路是首先拨打的支路。同样重要的是,您要一个接一个地执行每个 curl 请求,而不是同时执行。

这是一个如何在 node.js 中发送 HTTP 请求的示例,该请求将更新其中一条腿。您需要执行两次。

var ACCTSID = process.env.ACCTSID;  // Twilio Account SID
var AUTHTOKEN = process.env.AUTHTOKEN;  // Twilio Auth Token
var request = require('request');

function parentFunction() { // update a call in progress to move it to a conference

  console.log('parameter: ' + parent); // log param

  SID = parent.SID ; console.log('SID to add to conf: ' + SID); // The SID of the parent call
  end = parent.end ; console.log('end call on exit: ' + end) // end conference on exit - true or false
  xml = '<Response><Dial><Conference endConferenceOnExit=\"' + end + '\" beep=\"' + beep +'\">' + key + '</Conference></Dial></Response>'; console.log('xml: ' + xml); //xml

  formData = {
    Twiml: xml
    }

   options = { 
     method: 'POST',
     auth: {
       user: ACCTSID,
       pass: AUTHTOKEN
     },
     url: 'https://api.twilio.com/2010-04-01/Accounts/' + ACCTSID + '/Calls/' + SID + '.json',
     headers:
     { 
       'cache-control': 'no-cache',
       'Content-Type': 'text/plain'
     },
     form: formData //your payload
   };

   request(options, function (error, response, body) {
     if (error) throw new Error(error);
     console.log('response body for: ' + SID + ':' + body);

  });
}
于 2020-11-09T08:57:07.243 回答