set
11
2009

Enviando SMS no GNU/Linux

Essa semana vi no blog do Mauro Martins um post sobre mandar SMS a partir do Excel (recomendo ler lá antes). Fiquei curioso, mas por opção resolvi utilizar apenas o GNU/Linux. O exemplo a seguir pode ser feito utilizando qualquer sistema Linux, a linguagem Python (com o módulo do PySerial instalado) e um celular smartphone da Nokia (nesse caso um N95). O primeiro passo foi conectar o cabo USB e escolher o modo PC Suite.

No terminal:

# lsusb | grep Nokia
Bus 005 Device 004: ID 0421:04f0 Nokia Mobile Phone

É preciso carregar os módulos necessários, se você precisar compilar o kernel são as opções CONFIG_USB_ACM e CONFIG_USB_SERIAL do .config

# modprobe cdc-acm
# modprobe usbserial vendor=0x0421 product=0x04f0

Observe que os valores dos parametros do módulo usbserial são obtidos através do comando lsusb. A partir desse ponto será criado um device node referenciado por /dev/ttyACM0. O código é bem simples, aonde apenas instanciamos um objeto da classe PySerial e utilizamos os métodos de escrita e leitura.

import serial
ser = serial.Serial()
ser.port='/dev/ttyACM0'
ser.baudrate=19200
ser.rtscts=1
ser.timeout=3
ser.open()

Depois foi apenas usar os métodos write() e read() para fazer a prova do conceito. Como eu não sabia a quantidade de bytes a serem recebidos “chutei” um valor (10 bytes) e especifiquei um timeout para sair.

ser.write('AT'+'\x0d\x0a') # AT
ser.read(10)

O exemplo de envio de um SMS que o Mauro apresentou pode ser feito dessa forma, lembrando que a extensão ‘\x0d\x0a’ é o valor hexadecimal para o terminador de linha (o equivalente a pressionar [ENTER]).

ser.write('AT+CMGF=1'+'\x0d\x0a')
time.sleep(2)
ser.write('AT+CMGS="0XXYYYYYYYY"'+'\x0d\x0a')
time.sleep(2)
ser.write('www.coding.com.br'+'\x0d\x0a\x1a')
 # envia a mensagem (www.coding.com.br) para o número definido

Meus primeiros testes só funcionaram quando dei um atraso (não se esqueça do import time) entre cada comando, abritrariamente escolhi 2 segundos, mas acredito que esse valor possa ser menor (fiz testes e funcionou). Passei uma boa parte da noite experimentando diversos comandos AT que encontrei no manual, os comandos de faziam a requisição de alguma informação: nível do sinal, número de série, fabricante, etc funcionaram, mas quando tentei fazer uma requisição da lista de contatos ou das mensagens SMS não obtive sucesso (mas é claro que fiz testes rápidos sem dar atenção merecida a documentação).

Uma solução para fazer o equivalente no Excel é exportar a planilha no formato CSV e fazer um parser (lembrando que o Python já tem um módulo pronto que faz isso) ou então até mesmo fazer um plug-in para o OpenOffice ;-)

tags: , ,
posted in programação by Tiago Maluta

Follow comments via the RSS Feed | Deixe um comentário | Trackback URL

1 Comment to "Enviando SMS no GNU/Linux"

  1. Adriano Brito wrote:

    Ótimo artigo, testei aqui e funcionou no Ubuntu 9.04, com um Nokia 5310.

Leave Your Comment