У меня есть сервер 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 ответ1

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .