Как использовать twiml для подключения звонков - PullRequest
1 голос
/ 18 марта 2020

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

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

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

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

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

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

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

Какой вызов Connect и Немедленное отключение глагола клиента bcoz отсутствует. Теперь, как добавить клиентский глагол в глагол Dial, я использую клиентский глагол как

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

В соответствии с предложением @ philna sh эта c# ссылка предназначена для вызова от браузера к клиенту и использует нового клиента Dial как

var dial = new Dial();

, но я использую Android VOIP SDK для вызова между двумя android устройствами. Для которого, если я использую новый объект Dial, он будет устанавливать новый вызов как дочерний вызов. Который я не хочу создавать. И как запрос @ philna sh полный код для функции 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 использует два вызова в каждом вызове, когда одно устройство хочет позвонить на другое устройство, или я ошибаюсь?

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

1 Ответ

2 голосов
/ 18 марта 2020

Если вы пытаетесь соединиться с устройствами, совместимыми с Mobile Programmable Voice SDK, вы должны использовать глагол Dial с существительным Client. Client существительным будет имя / имя другого клиента, которому вы пытаетесь позвонить.

Голос TwiML ™:

Twilio имеет функцию без сервера, которая имеет Приведенный ниже пример кода, используемый для выполнения вызова, и на основе номера To, который ваша клиентская сторона отправляет в конечную точку 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);
}
...