Twilio 如何使用twiml连接呼叫
如链接中所示 我们需要创建TwiML应用程序,并设置语音请求url,例如拨打电话。那么makecall函数中应该写些什么来连接当前呼叫,因为如果我们使用拨号动词,那么它将进行另一次呼叫 注意:我使用Twilio可编程语音连接两个使用VOIP的Android设备 现在的问题是在MakeCall函数中应该发送什么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
[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);
}