Uma situação bastante comum quando você precisa interligar duas (ou mais) filiais via IAX para que os usuários de ambos locais possam falar sem custo entre si, é a existência de uma banda limitada para o uso de voz.
Quando temos este cenário, normalmente surge um problema: como podemos garantir que não teremos mais ligações simultâneas do que permite a “banda reservada” para este recurso.
Com esta demanda nas mãos, criei um plano de discagem que permite limitar o número de ligações simultâneas quando for utilizado IAX2 (ou, com pequenas adaptações, qualquer outro tipo de canal, como, por exemplo, SIP).
Para efeito de demonstração, vamos supor que você utilize um codec que consuma 64Kbps para cada ligação (G.711 a-law). Vamos supor também que você tenha 256Kbps disponível para voz, podendo realizar então até quatro ligações simultâneas sem perda na qualidade (cortes, “voz robótica”, etc…).
A configuração necessária para tal controle é feita no extensions.conf, em três contextos diferentes (não esqueça de adaptar o exemplo à sua realidade):

  • o contexto [globals] é padrão do Asterisk e nele você pode declarar variáveis para uso no plano de discagem;
  • o contexto [from-iax] é o contexto que controlará as chamadas recebidas via IAX;
  • o contexto [saidaexterna] é o contexto de saída das chamadas (exceto chamadas entre ramais locais);

Contexto globals

No contexto [globals] você irá declarar a variável que controla o número máximo de chamadas permitidas, da seguinte forma:
; Controle de chamadas

; 256Kbps  = 4 chamadas a-law de 64Kbps cada
CALL_LIMIT_IAX=4 

Contexto from-iax

No contexto [from-iax]  você irá controlar as chamadas entrantes via IAX, da seguinte forma:
exten => _XXXX.,1,NoOp(Chamada via IAX)

same => n,NoOP(Chamada de origem ${CALLERID(num)} discando para ${EXTEN})
; Adiciona chamada no grupo do IAX2
same => n,NoOP(Adicionando chamada entrante ao grupo IAX2)
same => n,Set(GROUP()=”IAX2″)
; verifica o número de chamadas simultâneas no grupo
same => n,Set(SIMULTCALL=${GROUP_COUNT(“IAX2”)})
same => n,NoOp(Ligacoes em curso IAX2: ${SIMULTCALL} de ${CALL_LIMIT_IAX})
; verifica se a chamada pode ser realizada
same => n,GotoIf($[0${SIMULTCALL} <= 0${CALL_LIMIT_IAX}]?call:nocall)
; seção utilizada quando a chamada não pode ser realizada
same => n(nocall),NoOp(Limite de chamadas IAX2 excedido – chamada entrante recusada)
same => n,Playback(canais_iax_ocupados)
same => n,Hangup()
; seção utilizada para realização da chamada para ramais (sip)
same => n(call),Goto(sip,${EXTEN},1)
same => n,Hangup()

Contexto saidaexterna

No contexto [saidaexterna] você irá controlar as chamadas saintes via IAX e outras tecnologias como DAHDI, Khomp ou DGV, da seguinte forma:
exten => _X.,1,Progress

; AGI para obter a variável de discagem ${DIAL} com base no destino da ligação
;
; As saídas possíveis são, por exemplo:
; Khomp/Gebt/${EXTEN}
; Khomp/Ggsm/${EXTEN}
; DGV/g1/${EXTEN}
; IAX2/SPO/${EXTEN}
; SIP/vono/${EXTEN}
;
; Não vou postar o AGI porque ele é muito específico para a solução
; mas você pode gerar o seu próprio AGI com base na sua estrutura
;
same => n,AGI(dialout.agi)
; Obtém o tipo de canal de saída
same => n,Set(OUTCHAN=${DIAL:0:4})
; Verifica se o canal é IAX2. Se não for IAX2 vai diretamente para a discagem
same => n,GotoIf($[“${OUTCHAN}”=”IAX2”]?iax:call)
; Adiciona chamada no grupo IAX2
same => n(iax),NoOP(Adicionando chamada sainte ao grupo IAX2)
same => n,Set(GROUP()=”IAX2″)
; verifica o número de chamadas simultâneas IAX2
same => n,Set(SIMULTCALL=${GROUP_COUNT(“IAX2”)})
same => n,NoOp(Ligacoes em curso IAX2: ${SIMULTCALL} de ${CALL_LIMIT_IAX})
; verifica se a chamada pode ser realizada
same => n,GotoIf($[0${SIMULTCALL} <= 0${CALL_LIMIT_IAX}]?call:nocall)
; seção usada quando a chamada não pode ser realizada
same => n(nocall),NoOp(Limite de chamadas IAX2 excedido – chamada sainte recusada)
same => n,Playback(canais_iax_ocupados)
same => n,Hangup()
; disca
same => n(call),Dial(${DIAL},60,TWXr)
same => n,Hangup()

ATENÇÃO: É importante que este plano de discagem seja implementado em ambos servidores para que possamos garantir que não sejam recebidas e nem realizadas mais ligações do que o valor limite.
Agora é com você. Adapte e estenda este plano de discagem e se quiser compartilhar suas melhorias, fique à vontade para postá-las nos comentários.

Até a próxima.

Limitação do número de ligações simultâneas via IAX
Animated Social Media Icons by Acurax Responsive Web Designing Company
%d blogueiros gostam disto:
Visit Us On FacebookVisit Us On TwitterCheck Our FeedVisit Us On Linkedin