xmpp asterisk

Imagine que você possuiu um fila para atendimento telefônico do suporte de seus clientes e os membros desta fila variam em função de turnos. Todos os membros possuem também contas no seu servidor XMPP (Openfire, talvez) e ficam constantemente conectados neste para comunicarem-se entre si.

Não seria interessante se a cada chamada recebida na fila, todos os membros desta recebessem uma notificação via XMPP, informando inclusive o nome do cliente que está ligando?

Pois bem, isso pode ser feito e funciona muito bem.

E como faz?

Bom, existem algumas premissas que precisam ser atendidas:

  • É preciso ter um servidor Asterisk 11 ou superior funcional
  • É preciso ter um servidor XMPP funcional
  • É preciso que seu Asterisk já está devidamente configurado para “falar” com o seu servidor XMPP
  • É preciso ter uma forma de identificar qual o JID de cada ramal (isso pode ficar no DB, na tabela sip)
  • É preciso ter uma forma de identificar o cliente em função de seu número telefônico

Atendidos os requisitos, é hora de ajustar seu plano de discagem.

No arquivo /etc/asterisk/extensions.conf, antes da ligação ser enviada para a fila do suporte, inclua as seguintes linhas no contexto:

; o agi a seguir, não é tema deste post, mas ele deve identificar o nome do cliente baseado no callerid e colocá-lo na variável CUSTOMER
same => n,agi(getclient.agi)
; a variável QUEUE_XMPP pode ser setada no contexto [globals]
same => n,Set(QUEUE_XMPP="helpdesk")
same => n,Set(MSGXMPP="Suporte: Cliente ${CUSTOMER}")
same => n,macro(XMPPSuporte,${MSGXMPP},${QUEUE_XMPP})

O XMPPSuporte é uma macro que deve existir no arquivo /etc/asterisk/extensions.ael. Eis o código:

context macro-XMPPSuporte {

  s => {

  &XMPPSuporte(${ARG1},${ARG2});
  };
};

macro XMPPSuporte(MSGXMPP,QUEUE_XMPP) {

  x=0;
  num_members=${QUEUE_MEMBER(${QUEUE_XMPP},count)};

    if (${num_members} > 0) {

      Set(queue_members=${QUEUE_MEMBER_LIST(${QUEUE_XMPP})});

      NoOP(${num_members} membros na fila ${QUEUE_XMPP} - ${queue_members});

      while (${x} < ${num_members}) {

        x = ${x} + 1;

        if (${num_members} = 1) {

          Set(member=${queue_members});
        }
        else {

          Set(member=${CUT(queue_members,\,,${x})});
        }

        Set(ramal=${CUT(member,"/",2)});
        agi(get_exten_jid.agi); // Este agi busca o jid associado ao ramal, exemplo aqui (para DB Postgresql)
        Set(jid=${XMPPJID});
        Set(user=${CUT(jid,"@",1)});
        NoOP(Enviado mensagem para o ramal ${ramal} - jabber id ${jid});
        &SendJabberUra(${user},${MSGXMPP});
      }
    }
};

context macro-SendJabberUra {

  s => {

    &SendJabberUra(${ARG1},${ARG2});
  };
};

macro SendJabberUra(DST, MSG) {

  NoOp (Enviado mensagem para ${DST});

  // A variável XMPPDOMAIN pode ser setada também no contexto [globals]
  XMPPDOMAIN="seudominiojabber.com";
  // Não esqueça de setar a variável RESOURCE_XMPP no contexto [globals] de acordo com sua configuração
  JabberSend(${RESOURCE_XMPP},${DST}@${XMPPDOMAIN},${MSG});
};

É isso aí, basta adaptar o código a seu cenário e fazer uso do recurso.

Até.

 

Leia também:

Enviando uma mensagem XMPP para todos os membros de uma fila do Asterisk
Tags:         
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