huawei e220 perl smstools

Num outro artigo tinha escrito sobre o envio de sms com o huawei e220 usando a libraria do CPAN Device::Modem para este caso comigo não resultou. O envio das sms nem sempre funciona, o texto enviado pelo atsend não é emitido pelo modem.
Sem conseguir confirmar de onde originava o problema pois a mesma string pelo minicom funciona sem problemas, usando um outro pc isto tudo funciona sem problemas sobrou a possibilidade de ser diferença na $LANG ou problema de configuração dos locales mas nada tem a ver pois as config’s estão iguais muda sim a versão do perl.

Para contornar todas estas dores de cabeça decidi-me a usar o smstools que funciona sem problemas só preciso de ler as mensagens ler os dados que pretendo dos ficheiros e está a funcionar sem grandes dores de cabeça.

De qualquer modo fica o código para envio das sms usando o Device::Modem funciona no ubuntu 8.04.

# Enviar sms
sub Enviar{
my ( $number, $out, $fromqueue ) = @_;
# Start modem connection
my $OK;
my $new;

my $modem = new Device::Modem( port => ‘/dev/ttyUSB0′ );

if ( $modem->connect( baudrate => 115200 ) ) {
} else {
print “Problem with connection… \n”;
exit 0;
}

# don’t echo my output
$modem->echo (0);

# Initialize
$modem->atsend( ‘ATZ’ . Device::Modem::CR );

# set text mode
$modem->atsend( ‘AT+CMGF=1’ . Device::Modem::CR );
chomp($out);
chomp($number);
# Start sending response
$modem->atsend( ‘AT+CMGS=”‘.$number.'”‘ . Device::Modem::CR );
$modem->atsend( $out . ” \cZ”  );
$modem->atsend( “\cZ”);

# Get Answer
$OK = $modem->answer();
chomp($OK);

if ( $OK =~ /OK/ ){
print “\tenviado\n”;
return 1;
}else {
if ( $fromqueue != 1 ) {
#QueueOut($number, $out);
print “Queue to send later\n”;
}
print “\tnot enviado\n”;
}

$modem->disconnect();

}

Esta função integra-se no meio de outras que “servem um propósito maior”.

Anúncios

perl + huawei e220 + sms

A necessidade de criar um serviço para receber mensagens de telemóvel (SMS) surgiu, um ex-colega aqui no trabalho já tinha andado a “inventar” à uns tempos com isto, eu sabia que ele tinha posto a coisa a andar com o huawei e220 e pelos vistos funciona com mais modelos para além deste, sendo para isto necessário estabelecer a porta de ligação para o dispositivo.

Um tutorial à maneira e um script de perl não muito perfeito  para testar a coisa…

#!/usr/bin/perl

use Device::Modem;

# Validade do numero
sub autorizado {
my ($numero) = @_;

open( numeros, “< numeros.txt”);
@contactos = <numeros>;

foreach $tlf (@contactos){
chomp($tlf);
# debug code
# print ” — “.$tlf . ” ” . $numero . “\n”;
if ( $tlf == $numero ) {
return true;
}
}
return false;
}

$modem = new Device::Modem( port => ‘/dev/ttyUSB0’ );

if ( $modem->connect( baudrate => 115200 ) ) {
} else {
exit 0;
}

$modem->echo (0);

if ( $modem->atsend( ‘AT+CMGL=”all”‘ . Device::Modem::CR )== 1 ) {
# done ;
}
$an = $modem->answer( );
@a     = split(/\n/, $an);

$k = $hit = 0;

foreach $answer (@a){
if ( ($answer =~ /.READ./)) {

($cm, $linha)  = split(/:/, $answer);
($id,undef, $number, undef, $data)  = split(/,/, $linha);
$number =~ s/\”//gi;
$hit = 1;
}else{
if($hit == 1 ) {
$bool = autorizado($number);
if ( $bool eq true ) {
print “numero = “.$number.” msg = “.$answer.”\n”;
$hit = 0;
}
}
}
}

$modem->disconnect();

Ficou a funcionar incluindo com verificação de números o que permite usar respostas automáticas a mensagens.

Nota: Apenas um programa pode usar a porta a cada execução a comunicação com o equipamento é  assíncrona e a lista de numeros.txt tem de conter o +351 antes do número ou altera-se o código.

Um breve teste que resultou em algo produtivo viva a class do cpan Device::Modem