Desvio para o Asterisk pt.1

É… passei um bom tempo sem postar aqui, mas pretendo me empenhar novamente.

Começarei a fazer alguns posts sobre desvios no Asterisk.

As centrais convencionais possuem variados tipos de desvios. Os mais comuns são: desvio imediato, desvio condicional, desvio se ocupado e desvio se não houver resposta. Serão o total de três posts, dois descrevendo cada um dos desvios e o terceiro com um contexto para cancelar todos os desvios, verificar desvios ativos, e o plano de discagem para verificar antes de discar para o ramal . 😉

Hoje irei comentar sobre a facilidade de desvio imediato, desvio se ocupado e desvio se não houver resposta.

O desvio imediato é uma facilidade onde o usuário do ramal “A” digita um código + o número do ramal “B”. Quando este código for ativo, toda vez que alguém ligar para o ramal “A” a ligação será desviada e chamará no ramal “B”, sem ao menos tentar chamar o ramal “A”.

O desvio se ocupado funciona quase igual, a única funcionamento que muda é que o desvio só é utilizado quando o ramal está ocupado e o desvio se não houver resposta é quando o ramal chama e estoura o tempo chamando, assim é utilizado o desvio para o ramal desejado.

O contexto “desvio-imediato” servirá para ativar/desativar o mesmo. Para utilizarmos a facilidade de desvio, será usado o AstDB, pela questão de ter o acesso fácil via dialplan.

O código *50 serve para ativar o desvio. Quando o usuário discar o código para ativar, o Asterisk irá atendê-lo após 1 segundo (parâmetro 1 na app Answer()) e irá verificar na tabela do AstDB se existe a família “Desvio” com a chave “${CALLERID(num)}” (o número do ramal que está chamando a facilidade). Se houver a chave indicada, ele envia o chamador para desvio-imediato,*50,8, onde será executado um playback informando que já existe um desvio ativo e será enviado para a extensão desvio-imediato,h,1, onde será esecutado um HangUp(). Se não houver a chave indicada, será direciona para a tag continua, onde será executado um áudio solicitando para entrar com um número de ramal, será lido o número do ramal com a opção Read() e será inserido no AstDB o número do ramal. Após isso será executado um áudio informando que o desvio foi ativo e irá desligar o canal.

O código *51 serve para desativar o desvio. Quando o usuário discar o código, o Asterisk irá atender a ligação, verificar se o desvio existe no AstDB, se existir o Asterisk irá deletar e tocar um áudio informando que o desvio foi desativado, se não existir o Asterisk irá somente informar que não existe desvio imediato ativo.

Agora, o desvio se ocupado e o desvio se não houver resposta funcionam exatamente iguai a esse. Porém cada um deve possuir sua extensão para ativar/desativar e sua própria família no AstDB.

Segue aqui o exemplo do extensions.conf.

Note que o desvio se não houver resposta chama algumas aplicações à mais. Na extensão *54, prioridade 7, ele executa um áudio informando para entrar com o número de vezes que o ramal será chamado antes de desviar. Após ler o número de 1 dígito (de 1 à 9, se for zero ele irá executar um áudio informando que a opção é inválida e retornar para solicitar novamente o número), ele irá multiplar o mesmo por 4 (cada toque é quatro segundos, o Asterisk chama por segundos, portanto…) e salvar no AstDB. Na extensão *55, prioridade 5, o número de toques será deletado do AstDB.

Notas:

  • Os áudios citados são exemplos abstratos. Eles não existem no Asterisk, você terá que gravá-los e adcionar na pasta padrão de áudios (“/var/lib/asterisk/sounds/”).
  • No contextos de desvio, extensão *50, *52 e *54, prioridade 5, aplicação Read(), o valor “4” é referente ao número de dígitos dos seus ramais. Modifique conforme a necessidade.
  • Eu NÃO TESTEI, por isso verifiquem antes de utilizar, mas é para estar correto e funcionando.

Bom, esses desvios foram simples, o problema será o desvio condicional!

Até mais!

Esse post foi publicado em Tutoriais e marcado . Guardar link permanente.

3 respostas para Desvio para o Asterisk pt.1

  1. Wagner Nunes disse:

    Grande Rodrigo, beleza veio??? Correria???

    Em uma olhada rapida eu daria duas sugestões, a primeira é depois da prioridade 1 usar prioridade n visto que os goto estão chamando das flags… assim facilita a manutenção quando vc precisar modificar alguma coisa.. e eu tbm não testei, mas acho que as prioridades 4 e 5 vão dar pau, tipo, estão dando noop do dbDel…

    Mas meu, muito bacana o posto, eu curto este estilo de programação de recurso!

    • Rodrigo Lang disse:

      Opa Wagner! Aqui tudo tranquilo e por aí?

      Seguinte. Eu não sou muito chegado em utilizar o “n”, prefiro colocar as prioridades mesmo. Sou chato mesmo! Heheheheh

      Quanto a questão do Noop funciona assim mesmo. Quando o Asterisk executa o Noop ele executa a função que está entre parenteses e mostra o retorno. Se bem me lembre, essa sugestão está no próprio help do dbDel (core show function dbDel).

      Um teste simples de fazer é com a função MATH. Exemplo: NoOp(Soma de 2 + 2 é igual à: ${MATH(2+2,int)})

      Mas obrigado pelo comentário!

      Abraços!

      • Wagner Nunes disse:

        Grande Rodrigo, beleza meu???
        Cara, show de bola, eu realmente nunca tinha pensado em rodar uma função dentro de um noop, pow, testei aqui e ficou bem legal!!!!

        Valew pela dica!!!!

        Abraço!

Deixe um comentário