Как использовать twiml для соединения звонков

Как указано в ссылке https://github.com/twilio/voice-quickstart-android#bullet5,

нам нужно создать приложение TwiML, и URL-адрес голосового запроса должен быть установлен, например, для https://twiliodev.mycompany.com/makeCall, чтобы позвонить. Затем, что должно быть написано в функции makecall для подключения текущего вызова, потому что, если мы используем команду Dial, она выполняет другой вызов.

Примечание. Я использую программируемый голос Twilio для подключения двух устройств Android с помощью VOIP.

Теперь вопрос в том, какой ответ Twiml должен быть отправлен в функции MakeCall для подключения вызова, потому что в следующей функции, если я верну пустой ответ, вызов не будет подключен.

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

Редактировать @Alan Спасибо за ответ. Поскольку я использую С # на стороне сервера. Я использовал Dial Verb как

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

Который соединить вызов и немедленно отключить клиентский глагол 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>

Не могли бы вы помочь, как добавить глагол Client в команду Call?

Спасибо.


Редактировать 2

Как предлагает @philnash, этот С # ссылка предназначена для вызова от браузера к клиенту, и в этом случае он использует новый клиент для набора номера как

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 выполняет два вызова в каждом вызове, когда одно устройство хочет позвонить на другое устройство, или я ошибаюсь?

Опять же, обратите внимание, я говорю о VOIP-подключении двух устройств Android через URL-адрес запроса Twiml к нашему серверу.


person Giru Bhai    schedule 18.03.2020    source источник
comment
Не знаете, что там происходит, возможно, вы могли бы поделиться всем кодом, а не фрагментами? Для справки, вот пример C # в документации: twilio.com/docs/voice/twiml/   -  person philnash    schedule 19.03.2020
comment
@philnash эта ссылка twilio.com/docs/voice/twiml/… предназначена для набора номера через Интернет клиенту, и я использую клиентский вызов (обратите внимание, что клиент означает два устройства Android). Пожалуйста, проверьте отредактированный вопрос, спасибо.   -  person Giru Bhai    schedule 19.03.2020
comment
Набор номера через Интернет для клиента - это то же самое, что и от клиента к клиенту (фактически, единственная разница, которую вы получаете, - это если вы набираете номер клиента по телефону, а затем вам нужно, чтобы callerId был номером из вашей учетной записи). Если вы Append вставляете client в dial, это действительно должно быть вложено в вывод XML. Это странное поведение. Кроме того, я не уверен, что вы имеете в виду о дочерних вызовах, когда у вас есть две конечные точки (в данном случае 2 клиента), у вызова будет две ветви, и одна будет дочерней.   -  person philnash    schedule 19.03.2020
comment
@philnash, спасибо за ответ, тогда как Twilio взимает плату, если ребенок звонит в статус «Нет ответа».   -  person Giru Bhai    schedule 19.03.2020
comment
Если по ноге ребенка нет ответа, я думаю, с вас взимается плата за время, необходимое для звонка. Ценообразование не является моей областью знаний, возможно, вам будет лучше поговорить об этом с отделом продаж .   -  person philnash    schedule 19.03.2020
comment
@philnash, не могли бы вы взглянуть на раздел вопроса "Редактировать 3".   -  person Giru Bhai    schedule 19.03.2020
comment
Да, с вас взимается плата за две ветви вызова. Одна ветвь вызова идет от первого устройства к Twilio, а вторая ветвь вызова идет от Twilio ко второму устройству. Подробнее см. В этой статье: support.twilio.com/hc/en-us/articles/   -  person philnash    schedule 19.03.2020


Ответы (1)


Если вы пытаетесь подключиться к устройствам на базе Mobile Programmable Voice 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);
}
person Alan    schedule 18.03.2020