segunda-feira, 27 de junho de 2011

Enviando SMS interativamente (Asterisk + XMPP + Digivoice ou Khomp)


Ainda falando sobre Asterisk e XMPP e seus usos (veja mais neste post) uma ideia que tive no final de semana e coloquei hoje em testes foi o envio interativo de SMS utilizando para isso um Asterisk integrado com XMPP (e uma placa Digivoice GSM ou uma placa/EBS Khomp GSM).

Objetivo

Enviar SMS de forma interativa utilizando um servidor Asterisk conectado a um servidor XMPP.

Requisitos

Servidor Asterisk integrado com um servidor XMPP (Openfire, ejabberd, Prosody, etc...) e com o Google Talk. Saiba como realizar esta integração aqui.

O procedimento

Novamente o contexto proposto é muito simples e atende somente um ramal (já que envia a mensagem para um usuário específico) ficando aberto para melhorias via  AEL ou AGI de forma a estender o recurso para todos usuários de seu domínio XMPP e todos seus ramais.

O contexto funciona da seguinte maneira: o usuário disca para o número *767* (*SMS*) e recebe uma mensagem em seu cliente XMPP solicitando o destino do SMS. Após informar o número o usuário recebe uma nova mensagem solicitando que seja informado o conteúdo do SMS. Assim que informar o conteúdo o Asterisk envia o SMS para o destino.
[sendsms]

exten => *767*,1,Answer() ;Atende a chamada
same => n,Set(CANAL=${CUT(CHANNEL,,1)}) ;Armazena o canal
same => n,NoOp(Envio de SMS de ${CANAL}) ;Mensagem do Asterisk
same => n,NoOp(Mandando mensagem para ${JABBERDEST}@jabberpriv.propus.com.br) ;Mensagem do Asterisk
same => n,JabberSend(propuspriv,${JABBERDEST}@jabberpriv.propus.com.br,Envio de SMS - Informe a número de destino) ;Solicita o número do destinatário do SMS
same => n,Set(OPCAODEST=${JABBER_RECEIVE(propuspriv,${JABBERDEST}@jabberpriv.propus.com.br,30)}) ;Recebe o número do destinatário do SMS
same => n,JabberSend(propuspriv,${JABBERDEST}@jabberpriv.propus.com.br,Envio de SMS - Digite a mensagem) ;Solicita o conteúdo do SMS
same => n,Set(OPCAOMSG=${JABBER_RECEIVE(propuspriv,${JABBERDEST}@jabberpriv.propus.com.br,30)}) ;Recebe o conteúdo do SMS
same => n,JabberSend(propuspriv,${JABBERDEST}@jabberpriv.propus.com.br,Enviando a mensagem "${OPCAOMSG}" para ${OPCAODEST}) ;Mensagem para o usuário
same => n,DgSendSMS(g1,${OPCAODEST},${OPCAOMSG}) ;Envia o SMS (g1 = grupo de canais GSM)
same => n,HangUp
Finalizando

Novamente um recurso muito útil e facilmente implementável. E como no post anterior, melhorias no contexto são muito bem vindas. Fique à vontade para contribuir !!!

;-)

UPDATE 28/12/12: para enviar o SMS usando uma placa/EBS da Khomp altere a seguinte linha:

same => n,DgSendSMS(g1,${OPCAODEST},${OPCAOMSG}) ;Envia o SMS (g1 = grupo de canais GSM)

para:

same => n,KSendSMS(recurso,${OPCAODEST},${OPCAOMSG}) ;Envia o SMS

onde recurso pode ser tanto a placa (b0, b1) com um canal específico (b0c2, por exemplo).

8 comentários:

  1. Olá amigo. Gostei muito do seu artigo. Quero ver se você consegue me ajudar. Estou planejando montar um servidor asterisk que vai ter 1 tronco para linha comum (gvt), 5 troncos voip e 4 troncos gsm (vou usar uma placa para colocar chips gsm). Dentre várias aplicações, quero conseguir enviar SMS para meus clientes através dos chips GSM que estão neste servidor. O detalhe é que não quero fazer isso manualmente, e sim quero que meu sistema (que roda php+postgresql em outro local) envie para o servidor asterisk o número do meu cliente, a operadora dele (para selecionar o melhor chip) e a mensagem. Vou usar isto para comunicar ao cliente a situação do pedido. Pode me dar uma luz de como fazer tudo isso?

    ResponderExcluir
  2. Olá.

    Me parece que a melhor maneira de implementar o que você deseja é utilizando o Asterisk Manager Interface (AMI).

    Dê uma olhada nestes dois links:

    http://www.voip-info.org/wiki/view/Asterisk+manager+API

    http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/2010-September/044171.html

    []s

    ResponderExcluir
  3. Bom dia Marcelo,

    Tenho uma Central Telefônica na empresa onde trabalho rodando o Elastix, como implemento o envio de SMS através deste servidor?

    Desde já agradeço.

    Alan
    email: alan.rage@gmail.com

    ResponderExcluir
  4. Olá.

    Nunca usei o Elastix então não sei te informar se ele possui alguma interface para configurar este recurso.

    Me parece que o mais importante é inicialmente identificar a placa GSM em uso e quais os comandos que o driver da mesma dispõe para efetuar o envio.

    []s

    ResponderExcluir
  5. Marcelo,

    No Elastiz não tem esta GUI para configurar, mas como faço para identificar a placa GSM e os comando citados acima.

    Alan

    ResponderExcluir
  6. Se você não sabe qual é a placa, creio que deverá abrir o seu servidor para identificá-la.

    De posse da marca e modelo, você poderá verificar no manual do fabricante quais comandos estão disponíveis para envio de SMS.

    Observe que tais comandos só irão funcionar se a placa for GSM, ou seja, se você colocar os chips diretamente na mesma. Se você utilizar interfaces de celular, precisa verificar se as mesmas enviam SMS e como fazê-lo.

    []s

    ResponderExcluir
  7. Ola Marcelo

    Estou precisando montar uma Getway para envio ou recebimento de SMS, vc pode me infomar algum tutorial?
    o Asterisk poderia resolver esta demanda? tem algum outro open source para isso?
    obs: do sms recebido preciso extrair os dados (Numero e codigo? vamos tambem fazer quiz

    abs
    Geraldo
    gesoco@ig.com.br

    ResponderExcluir
    Respostas
    1. Olá Geraldo.

      Não conheço atualmente nenhum software que atenda sua demanda.

      Possivelmente iremos desenvolver algo assim para nossa solução de telefonia, mas atualmente desconheço algo pronto (não quer dizer que não exista, pois eu realmente ainda não procurei isso muito a fundo).

      []s

      Excluir