domingo, março 21, 2010

Enviando e Recebendo SMS pelo modem 3G

Você pode usar o seu serviço 3G para enviar e receber mensagens SMS, além de navegar. Eis aqui o que eu fiz para conseguir isso, junto com algumas observações sobre as linhas de comandos e os programas disponíveis.

Modem 3G usado

  • ZTE MF622
  • lsusb:
  • Bus 001 Device 004: ID 19d2:0001 ONDA Communication S.p.A.

Operadora

  • Vivo
  • Plano Vivo Zap 250Mb

Programas usados

Para enviar

  • gsmsendsms

Para receber e/ou enviar usando o spool

  • gsmsmsd (daemon)

Ambos contidos no pacote gsm-utils, no Debian Lenny

O dispositivo padrão de modem que estes dois programas procuram é o /dev/mobilephone. Por isso o dispositivo teve que ser especificado, nas linhas de comando abaixo.

1. Configurando

Para enviar e receber mensagens, é necessário saber o dispositivo de modem a ser usado e o número telefônico da central de envio de mensagens.

1.1. Sobre o dispositivo de modem:

Com o modem MF622 configurado segundo a dica "Modem 3G ZTE MF622 com Operadora Vivo, no Debian Lenny", você terá três dispositivos ttyUSBx:

 
  /dev/ttyUSB0
  /dev/ttyUSB1
  /dev/ttyUSB2

Um pouco estranho, mas é isso mesmo, três dispositivos com um só modem. Aqui no meu equipamento de teste o USB1 está inativo. Então usei os modems ttyUSB0 e ttyUSB2.

2. Enviando SMS

Para enviar uma mensagem sem necessariamente estar rodando o daemon, você pode usar diretamente o gsmsendsms:

 
gsmsendsms -d /dev/ttyUSB0 -C +550101102010 -b 19200 91119222 "Oi, fulano"

onde:

-d

dispositivo usado

-C

número da central de envio de mensagens da Vivo.

Para outras operadoras, é necessário saber os telefones das suas centrais. Tentei descobrir isso, mas foi uma busca inútil, pois internet afora, os usuários dizem que os números parecem mudar com o tempo. Alguém confirma? Além disso, não há como testá-los sem assinar o serviço. Então, vá em frente e procure os da sua operadora, você mesmo.

 
  -b : baudrate (outros valores podem ser testados aqui)

O gsmsendsms, então, envia o SMS do número do seu modem para o número celular 91119222, com a mensagem "Oi, fulano".

3. Recebendo e enviando SMS

A forma de receber mensagens é rodando um daemon que fica ouvindo o dispositivo:

 
  gsmsmsd -d /dev/ttyUSB2

O daemon vai ficar ocupando o terminal, à espera de mensagens. Quando chegar uma, ele imprimirá na tela, assim:

 
  Type of message: SMS message
  ------ ------ ------ ------ ------ ------ ------ ------ ---------
  Message type: SMS-DELIVER
  SC address: '550112102010'
  More messages to send: 1
  Reply path: 0
  User data header indicator: 0
  Status report indication: 0
  Originating address: 'meu-número-de-cel'
  Protocol identifier: 0x0
  Data coding scheme: default alphabet
  SC timestamp: 01/06/2010 02:14:20 PM (+0200)
  User data length: 22
  User data header: 0x
  User data: 'teste pra dicas-l'
  ------ ------ ------ ------ ------ ------ ------ ------ ---------

(O que importa é o texto do SMS, que será a última linha dessa saída, o "User data")

O único problema aqui é que eventualmente o gsmsmsd erra e sai, com avisos semelhantes a esse:

 
  gsmsmsd[ERROR]: unexpected response '+ZMTime: 5;' when sending 'AT'

E se isso acontecer, você para de receber os SMS. O que eu fiz foi embrulhar o

gsmsmsd num laço while, que roda o programa novamente, se ele sair. Assim:

 
  while true ; do
        time gsmsmsd -d /dev/ttyUSB2 -s sms -C +550101102010
  if [ $? = 1 ] ; then
        continue
        else
        break
  fi
  done

(o "time" é opcional, serve para mostrar por quanto tempo o daemon rodou, antes de errar.

Pode omitir, se quiser.)

Nesse laço while, inseri também outros parâmetros, veja:

 
  -s sms

Define como spool o diretório "sms", dentro do meu $HOME

 
  -C +550101102010

Instrui o daemon a ligar para esse número para o envio da mensagem.

Com isso rodando, posso enviar um SMS assim:

 
  echo "91119222
  Nova mensagem de testes para dicas-l" > sms/sms1

O comando acima mostra como o arquivo deve ser salvo em sms/:

Primeira linha com o telefone do destinatário.

Segunda em diante, texto da mensagem.

Qualquer nome de arquivo serve.

Dois detalhes

a mensagem deve ter no máximo 160 caracteres. O daemon consulta o spool a cada cinco segundos. Depois de enviado o SMS, o arquivo é apagado.

Nesse laço, você pode comandar Ctrl+C (a forma indicada na man page para sair), que o laço interrompe. Se o gsmsmsd errar e sair, cai no caso do "continue", e o laço roda novamente o daemon.

Repare que, como existem dois dispositivos ativos, você pode fazer combinações de funcionalidades com eles. Você pode rodar o wvdial no primeiro, se conectar, e deixar o segundo para ouvir e enviar mensagens.

Outros programas a serem testados

gammu - Ferramenta de linha de comando para controle de modems. Tem diversas funções interessantes, inclusive de resgatar mensagens armazenadas no modem, o que não consegui com o gsm-utils. Em meus testes, teve um funcionamento irregular. Após um certo momento, parou de se comunicar com o dispositivo, definitivamente. Por isso não pude usar em produção. Provavelmente o suporte ao dispositivo seja incompleto.

kmobiletools - Ferramenta gráfica do kde, para controle de modems e celulares. Com funções de recebimento e envio de mensagens, mostrador de intensidade de sinal da rede e da bateria (para celulares), caderno de endereços e outras. Bem interessante, também, inclusive porque permite configurar ações a serem executadas quando uma mensagem chega, como alguma forma de chamar a atenção. Isso é melhor do que a solução de ter a mensagem mostrada no terminal, onde pode passar despercebida. O problema com esse programa, novamente, é o suporte ao dispositivo. O modem usado é parcialmente suportado, e o envio de mensagens não funcionou confiavelmente. Além disso, às vezes as mensagens chegam com caracteres incompreensíveis.

E é isso. Feliz sms'ing!