1

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

我们需要创建 TwiML 应用程序,并且应该为例如https://twiliodev.mycompany.com/makeCall设置语音请求 URL以拨打电话。那么应该在 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.Append(client);

和 Twiml 响应是

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

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

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

那么您能否帮助如何在调用动词中添加客户端动词。

谢谢。


编辑 2

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

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 连接。

4

1 回答 1

2

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

TwiML™ 语音:

Twilio 有一个无服务器函数,该函数具有以下用于拨打电话的示例代码,并根据您的客户端 POST 到 makeCall 端点的 To number,它确定它是 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);
}
于 2020-03-18T12:26:35.330 回答