SIP-звонки Asterisk заканчиваются через 2 минуты с использованием услуги транкинга Twilio

У меня есть сервер Asterisk, размещенный на DigitalOcean, который прерывает вызовы ровно через 120 секунд, используя транкинговую службу Twilio. Примечательно, что напрямую подключенные программные телефоны не сбрасывают вызовы. Порт 5060 открыт на брандмауэре, как и должно быть.

Есть автосекретарь, принимающий вызов и передающий его сценарию, но он работает полностью, не прерывая вызов с помощью софтфона sip. Я отправил Twilio по электронной почте, и они сказали, что проблема может быть в том, что Asterisk не отправляет 180 Ringing, что я мог понять, потому что я не набираю телефон, просто отвечаю немедленно.

Что действительно отключает звонок?

sip.conf

[twilio]
type=peer
secret=secret
username=user
host=host.domain.com
dtmfmode=rfc2833
canreinvite=no
disallow=all
allow=ulaw
insecure=port,invite
fromuser=+15555555555
fromdomain=from-domain.domain.com
context=incoming
deny=0.0.0.0/0
permit=x.x.x.x/32
permit=x.x.x.x/32
permit=x.x.x.x/32
permit=x.x.x.x/32

контекст extensions.ael

+15555555555 => {
        Answer();
        EAGI(tincan.js);
        AGI(agi://127.0.0.1/saytext,"Goodbye.");
        Hangup();
}

Начало захвата пакета вызова

21  4.827782    (Them)  (Us)    SIP/SDP 1341    Request: INVITE sip:+15555555555@my.domain.com | 
22  4.831487    (Us)    (Them)  SIP 819 Status: 100 Trying | 
23  4.833205    (Us)    (Them)  SIP/SDP 1112    Status: 200 OK | 

Захват пакета конца вызова

16066   124.821787  (Them)  (Us)    SIP 650 Request: BYE sip:+15555555555@x.x.x.x:5060 | 
16067   124.822736  (Us)    (Them(  SIP 700 Status: 200 OK |

1 ответ

Решение

Twilio сообщила о проблеме, поскольку наш сервер не отправлял никаких данных RTP в течение продолжительного времени, поэтому время соединения истекло. План набора, который я использовал, запускал собственный сценарий EAGI, который записывал человека на телефон в течение неопределенного периода времени. Этот процесс истекает на другом конце.

Моим очень хакерским решением было следующее:

  1. Вместо того чтобы использовать команду RECORD FILE, я использовал команду GET OPTION, чтобы воспроизвести 10 секунд молчания и дождаться клавиши решетки (#).
  2. Я использовал EAGI stderr+1 fd для захвата аудио в файл вручную с помощью моего скрипта.
  3. Я использовал команду STREAM FILE, чтобы воспроизвести запись для подтверждения пользователем.

Отправка 10 секунд молчания неоднократно препятствовала тайм-ауту сервера. Я мог бы представить, что отправка 1 секунды тишины приведет к тому же и сэкономит пропускную способность, но ваш пробег может варьироваться.

Моя скрипт-функция Node.js, которая заменяет функции WAIT FOR DIGIT или RECORD FILE:

/**
 * Loop playing silence until interrupted
 * @param done =function( timedout ) Callback when the silence has been interrupted
 * @param maxRecordTime Length of time to be able to record max. Leave blank for no timeout.
 * @param stopTime Timestamp when the recording should be stopped
 */
Index.prototype.loopSilenceUntilInterrupted = function( done, maxRecordTime, stopTime ) {
    var that = this;

    // Set the stopTime?
    if( maxRecordTime!==undefined && stopTime===undefined )
        stopTime = Date.now()+maxRecordTime;

    this.context.getOption( "silence/10", "#", 10, function( error, response ) {
        if( response.result==35 )
            done( false ); // We have been diggery
        else if( stopTime!==undefined && Date.now()>=stopTime )
            done( true ); // We have timed out!
        else
            that.loopSilenceUntilInterrupted( done, maxRecordTime, stopTime ); // Do it again
    },
    0 ); // No cooldown
};
Другие вопросы по тегам