【问题标题】:How to use twiml to connect calls如何使用 twiml 连接通话
【发布时间】:2020-06-29 11:37:56
【问题描述】:

如链接https://github.com/twilio/voice-quickstart-android#bullet5中给出的,

我们需要创建 TwiML 应用程序,并且应该设置语音请求 url,例如https://twiliodev.mycompany.com/makeCall 拨打电话。那么在 makecall 函数中应该写什么来连接当前调用,因为如果我们使用 Dial 动词,那么它会进行另一个调用。

注意:我正在使用 Twilio 可编程语音连接两个使用 VOIP 的 Android 设备。

现在的问题是应该在 MakeCall 函数中发送什么 Twiml 响应以使呼叫连接,因为在以下函数中,如果我返回空白响应则呼叫没有连接。

[HttpPost]
public ActionResult MakeCall()
{
    var response = new VoiceResponse();
    return TwiML(response);
}

编辑@Alan 感谢回复。 因为我在服务器端使用 c#。我用拨号动词作为

var dial = response.Dial(callerId: from);

缺少哪个 Connect 调用和 Immediately disconnect bcoz 客户端动词。现在如何在 Dial 动词中附加 Client 动词,我使用 Client 动词作为

dial.Append(client);

Twiml 响应是

 <Response>
    <Dial callerId="client:21f421792"></Dial>
    <Client>2170561
  </Client>
</Response>

它的返回模式错误 bcoz 我认为正确的模式是

 <Response>
        <Dial callerId="client:21f421792">
        <Client>2170561
      </Client></Dial>
    </Response>

那么请您帮忙如何在Call动词中添加Client动词。

谢谢。


编辑 2

正如@philnash 所建议的,这个c#link 是用于浏览器到客户端的调用,并且它使用新的拨号客户端作为

var dial = new Dial();

但我正在使用 Android VOIP SDK 在两个 android 设备之间进行通话。 如果我使用新的 Dial 对象,它将把新的呼叫作为子呼叫。我不想创建。根据@philnash 的要求,makeCall 函数的完整代码是

[HttpPost]
public ActionResult MakeCall()
{
    var response = new VoiceResponse();

    string from,to;

    if (Request.HttpMethod == HttpMethod.Post.Method)
    {
        from = Request.Form["From"];
        to = Request.Form["To"];
    }
    else
    {
        from = Request.QueryString["From"];
        to = Request.QueryString["To"];
    }

    var dial = response.Dial(callerId: from);
    var client = new Client(to);
    dial.Append(client);

    return TwiML(response);
}

编辑 3

<?xml version="1.0" encoding="utf-8"?>
<Response>
    <Dial>
    <Client>2170561
    </Client>
</Dial>
</Response>

正如我注意到的 VOIP 呼叫,如果客户端 xml 标记位于 Dial 标记内,则它成功连接,但每次呼叫计为两条腿,并为两次呼叫收费。当一个设备想要呼叫另一台设备时,Twilio 的默认行为是在每个呼叫中​​进行两个呼叫,还是我弄错了?

再次请注意,我正在谈论通过 Twiml 请求 url 到我们服务器的两个 android 设备 VOIP 连接。

【问题讨论】:

  • 不确定那里发生了什么,也许您可​​以共享整个代码而不是 sn-ps?作为参考,这是文档中的 C# 示例:twilio.com/docs/voice/twiml/…
  • @philnash 此链接 twilio.com/docs/voice/twiml/... 用于拨号网络到客户端,我正在使用客户端到客户端调用(注意客户端是指两个 android 设备)。请检查已编辑的问题,谢谢。
  • 从网络拨号到客户端与从客户端到客户端是一样的(事实上,唯一的区别是,如果您将客户端拨到电话,然后您需要一个 callerId 作为您帐户中的号码)。如果你是Appending clientdial 它真的应该嵌套在 XML 输出中。那是奇怪的行为。另外,我不确定您对子呼叫的含义是什么,当您有两个端点(在本例中为 2 个客户端)时,呼叫将有两条腿,一个 是孩子。跨度>
  • @philnash 感谢回复,然后 Twilio 如何收费,如果孩子呼叫状态为无人接听。
  • 您确实需要为两个通话段付费,是的。一个呼叫支路是从第一个设备到 Twilio,第二个呼叫支路是从 Twilio 到第二个设备。详情查看这篇文章:support.twilio.com/hc/en-us/articles/…

标签: twilio twilio-twiml twilio-programmable-voice


【解决方案1】:

如果您尝试将移动可编程语音 SDK 驱动的设备连接在一起,您可以使用 Dial 动词和 Client 名词。 Client 名词将是您尝试呼叫的其他客户端的身份/名称。

TwiML™ Voice:

Twilio 有一个无服务器函数,该函数具有以下示例代码,用于拨打电话,并根据您的客户端 POST 到 makeCall 端点的编号,它确定它是 PSTN 电话呼叫还是客户端到-客户电话,const attr = isAValidPhoneNumber(event.To) ? 'number' : 'client';。该代码复制如下。

exports.handler = function(context, event, callback) {
    let twiml = new Twilio.twiml.VoiceResponse();

    if(event.To) {
      // Wrap the phone number or client name in the appropriate TwiML verb
      // if is a valid phone number
      const attr = isAValidPhoneNumber(event.To) ? 'number' : 'client';

      const dial = twiml.dial({
        callerId: context.CALLER_ID,
      });
      dial[attr]({}, event.To);
    } else {
      twiml.say('Thanks for calling!');
    }

     callback(null, twiml);
};

/**
* Checks if the given value is valid as phone number
* @param {Number|String} number
* @return {Boolean}
*/

function isAValidPhoneNumber(number) {
  return /^[\d\+\-\(\) ]+$/.test(number);
}

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多