Enviando SMS no GNU/Linux

September 11, 2009

[Warning: This post is a backup recovery from my previous Wordpress blog. All content was automatically converted accessing a MySQL database using a Python script (details). Mostly are in Portuguese but if you are interest I can translate to English. If you found any problem dont’t hesitate to contact me in comments.]

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 opo resolvi utilizar apenas o GNU/Linux. O exemplo a seguir pode ser feito utilizando qualquer sistema Linux, a linguagem Python (com o mdulo 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 mdulos necessrios, se voc precisar compilar o kernel so as opes 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 mdulo usbserial so obtidos atravs do comando lsusb. A partir desse ponto ser criado um device node referenciado por /dev/ttyACM0. O cdigo bem simples, aonde apenas instanciamos um objeto da classe PySerial e utilizamos os mtodos 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 mtodos write() e read() para fazer a prova do conceito. Como eu no 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 extenso '\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 nmero definido

Meus primeiros testes s funcionaram quando dei um atraso (no se esquea 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 requisio de alguma informao: nvel do sinal, nmero de srie, fabricante, etc funcionaram, mas quando tentei fazer uma requisio da lista de contatos ou das mensagens SMS no obtive sucesso (mas claro que fiz testes rpidos sem dar ateno merecida a documentao).

Uma soluo para fazer o equivalente no Excel exportar a planilha no formato CSV e fazer um parser (lembrando que o Python j tem um mdulo pronto que faz isso) ou ento at mesmo fazer um plug-in para o OpenOffice ;-)