Twilio 如何使用twiml连接呼叫

Twilio 如何使用twiml连接呼叫,twilio,twilio-twiml,twilio-programmable-voice,Twilio,Twilio Twiml,Twilio Programmable Voice,如链接中所示 我们需要创建TwiML应用程序,并设置语音请求url,例如拨打电话。那么makecall函数中应该写些什么来连接当前呼叫,因为如果我们使用拨号动词,那么它将进行另一次呼叫 注意:我使用Twilio可编程语音连接两个使用VOIP的Android设备 现在的问题是在MakeCall函数中应该发送什么Twiml响应来连接调用,因为在下面的函数中,如果我返回空白响应,那么调用就没有连接 [HttpPost] public ActionResult MakeCall() { var

如链接中所示

我们需要创建TwiML应用程序,并设置语音请求url,例如拨打电话。那么makecall函数中应该写些什么来连接当前呼叫,因为如果我们使用拨号动词,那么它将进行另一次呼叫

注意:我使用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调用和立即断开bcoz客户端谓词。现在,如何在拨号动词中附加客户端动词,我将使用客户端动词作为

dial.Append(client);
Twiml响应是

 <Response>
    <Dial callerId="client:21f421792"></Dial>
    <Client>2170561
  </Client>
</Response>
但我正在使用Android VOIP SDK在两台Android设备之间进行呼叫。 如果我使用新的拨号对象,它会将新呼叫作为子呼叫。这是我不想创造的。根据@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>

2170561
正如我在VOIP呼叫中所注意到的,如果客户机xml标记位于拨号标记内,那么它将成功连接,但它会计算每个呼叫的两个分支,并对两个呼叫收费。当一台设备想呼叫另一台设备时,Twilio的默认行为是在每次呼叫中中断两次呼叫,还是我出错了


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

如果您试图同时连接到移动可编程语音SDK驱动的设备,您将使用
拨号
动词和
客户端
名词。
Client
名词是您试图呼叫的另一个客户端的身份/名称

Twilio有一个无服务器函数,其示例代码如下所示,用于拨打电话,并根据到makeCall端点的客户端投递次数,确定是PSTN电话呼叫还是客户端对客户端电话呼叫,
const attr=isAValidPhoneNumber(event.to)?'编号':'客户'。该代码复制如下

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);
}

不确定那里发生了什么,也许您可以共享整个代码而不是片段?作为参考,这里是文档中的C#示例:@philnash此链接twilio.com/docs/voice/twiml/…用于向客户端拨号,我使用客户端对客户端呼叫(注意,客户端指两台android设备)。请检查已编辑的问题,谢谢。将网络拨到客户端与客户端拨到客户端是一样的(事实上,唯一的区别是,如果您将客户端拨到电话,然后您需要一个callerId作为您帐户中的号码)。如果要将
客户端添加到
拨号
中,则它确实应该嵌套在XML输出中。这是奇怪的行为。另外,我也不知道你说的儿童呼叫是什么意思,当你有两个端点(在这种情况下是两个客户端)时,呼叫将有两个分支,一个分支将是儿童。@philnash感谢回复,那么如果儿童呼叫状态为“无应答”,Twilio将如何收费。你会为两个分支收取费用,是的。一个呼叫分支是从第一个设备到Twilio,第二个呼叫分支是从Twilio到第二个设备。有关详细信息,请参阅本文:
<?xml version="1.0" encoding="utf-8"?>
<Response>
    <Dial>
    <Client>2170561
    </Client>
</Dial>
</Response>
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);
}