You are currently browsing the tag archive for the 'perl' tag.
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”.
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
Estava à frente do laptop a tentar me lembrar do título de uma musica no top ten. Após uma pesquisa no google encontrei o site que me dá a informação e por brincadeira em menos de um minuto surgiu o código em perl para me fazer a listagem na shell.
$ vi top10.pl
#!/usr/bin/perl
@var = `/usr/bin/lynx –dump http://www.seekalyric.com/music_charts/Europe`;
$go=0;
foreach $me (@var) {
chomp($me);
if ( $me =~ /.Chart last updated at./ ) {
print $me.”\n”;
$go = 1;
}
if ( $go == 1 && $me =~ !/.Chart last updated at./) {
$me =~ s/\[up\.gif\]//i;
$me =~ s/\[\d+\]//;
print $me.”\n”;
}
if ( $me =~ /Recommended Links/ ) {
exit 1;
}
}
:wq
$ chmod 755 ; ./top10.pl
Obrigado “Spidering Hacks” e http://www.seekalyric.com/music_charts/Europe
À três semanas contínuas que só vejo perl à frente para diferentes trabalhos, é o problema de php não estar nativamente incorporado em *nix.
Back to work…
