Chamadas SIP do Asterisk terminadas após 2 minutos usando o serviço de entroncamento do Twilio

0

Eu tenho um servidor Asterisk hospedado no DigitalOcean que está recebendo chamadas após exatamente 120 segundos usando o serviço de entroncamento do Twilio. É notável que os softphones conectados diretamente não baixem suas chamadas. A porta 5060 está aberta no firewall como deveria ser.

Há um atendente automático recebendo a chamada e passando-a para um script, mas isso funciona totalmente sem perder a chamada usando um softphone com gole. Eu enviei um e-mail para o Twilio e eles disseram que o problema poderia ser porque o Asterisk não está enviando um 180 Ringing, o que eu pude entender porque não estou discando um telefone, apenas respondendo imediatamente.

O que realmente está eliminando a ligação?

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

contexto extensions.ael

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

Início da captura de pacotes de chamadas

21  4.827782    (Them)  (Us)    SIP/SDP 1341    Request: INVITE sip:[email protected] | 
22  4.831487    (Us)    (Them)  SIP 819 Status: 100 Trying | 
23  4.833205    (Us)    (Them)  SIP/SDP 1112    Status: 200 OK | 

Fim da captura de pacotes de chamadas

16066   124.821787  (Them)  (Us)    SIP 650 Request: BYE sip:[email protected]:5060 | 
16067   124.822736  (Us)    (Them(  SIP 700 Status: 200 OK |
    
por Mikey A. Leonetti 22.07.2015 / 18:43

1 resposta

0

O problema foi reportado pelo Twilio como nosso servidor não enviando nenhum dado RTP durante um tempo estendido, portanto a conexão estava expirando. O dialplan que eu estava usando tinha um script EAGI personalizado que gravaria a pessoa no telefone por um período indefinido de tempo. Este processo foi o tempo limite do outro lado.

Minha solução muito hacky foi a seguinte:

  1. Em vez de usar o comando RECORD FILE, usei o comando GET OPTION para jogar 10 segundos de silêncio, aguarde a tecla pound (#).
  2. Eu usei o EAGI stderr + 1 fd para capturar o áudio para um arquivo manualmente com o meu script.
  3. Eu usei o comando STREAM FILE para reproduzir a gravação para o usuário confirmar.

O envio dos 10 segundos de silêncio repetidamente impediu que o servidor atingisse o tempo limite. Eu poderia imaginar que enviar 1 segundo de silêncio faria a mesma coisa e economizar em largura de banda, mas sua milhagem pode variar.

Minha função de script Node.js substitui as funções WAIT FOR DIGIT ou 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
};
    
por 05.08.2015 / 19:01