У многих операторов сотовой связи для того, чтобы иметь возможность совершать исходящие вызовы и отправлять смс, необходимо, что бы баланс на лицевом счете абонента был больше некоторой суммы. Для этого приходится постоянно следить за своим балансом. Чтобы облегчить себе жизнь, сделаем простой автоинформатор, который будет сам проверять баланс и при достижении некоторого заданного порога будет отправлять нам смс.
Создадим автоинформатора для оператора сотовой связи "Мегафон". Для проверки баланса будем использовать 3G-модем HuaweiE1550 и ОС Ubuntu 10.10.
Узнавать баланс на лицевом счете мы будем с помощью услуги "Баланс друга". Для этого с помощью USSD-меню *755# на телефноне абонента разрешаем проверку баланса с номера сим-карты, вставленной в 3G-модем. Теперь с модема мы можем проверить баланс абонента, выполнив USSD-запрос *755#Номер абонента#
Следующий шаг-подключение и настройка 3G-модема Huawei E1550. При подключении ОС Ubuntu 10.10 правилно его распознает, но подключает как виртуальный CD-ROM. О том, как переключить его в режим модема можно прочитать в этой статье
Для выполнения USSD-запроса будем использовать perl.
Необходимо установить для него следующее дополнение: Device::GSM
Ниже приведен сам perl-скрипт:
#!/usr/bin/perl use Getopt::Std; use Device::Gsm::Pdu; # defaults $opt_r = "/dev/ttyUSB1"; $opt_s = "/dev/ttyUSB0"; my $USAGE = <<__EOU; Usage: $0 [-i input_port] [-o output_port] [-n] [-h] [-v] ussd_msg Description: Send and receive 7-bit PDU-encoded USSD messages. Written and tested for Huawei E1550 GSM/UMTS USB modem. Options: -r port Port to receive data from. Default: $opt_r -s port Port to send AT commands to. Default: $opt_s -n Do not send any data to port. Useful with -v. -h Print this help. -v Be verbose. __EOU sub HELP_MESSAGE {print "$USAGE\n"; exit;} sub VERSION_MESSAGE {}; getopts ('i:o:hnv'); HELP_MESSAGE() and exit if (! $ARGV[0]) or defined($opt_h); print "USSD MSG: $ARGV[0]\n" if $opt_v; my $ussd_req = Device::Gsm::Pdu::encode_text7($ARGV[0]); $ussd_req =~ s/^..//; print "PDU ENCODED: $ussd_req\n" if $opt_v; my $ussd_reply; if (! $opt_n) { open (SENDPORT, '+<', $opt_s) or die "Can't open '$opt_s': $!\n"; print SENDPORT 'AT+CUSD=1,',$ussd_req,",15\r\n"; close SENDPORT; open (RCVPORT, $opt_r) or die "Can't open '$opt_r': $!\n"; print "Waiting for USSD reply...\n" if $opt_v; while (<RCVPORT>) { chomp; die "USSD ERROR\n" if $_ eq "+CUSD: 2"; if (/^\+CUSD: 0,\"([A-F0-9]+)\"/) { $ussd_reply = $1; print "PDU USSD REPLY: $ussd_reply\n" if $opt_v; last; } if (/^\+CUSD: 1,\"([A-F0-9]+)\"/) { $ussd_reply = $1; print "PDU USSD REPLY2: $ussd_reply\n" if $opt_v; last; } print "Got unknown USSD message: $_\n" if /^\+CUSD:/ and $opt_v; } } if ($ussd_reply) { $decoded_ussd_reply = Device::Gsm::Pdu::decode_text7('00'.$ussd_reply); print STDOUT "USSD REPLY: $decoded_ussd_reply\n"; } else {print "No USSD reply!\n";}
Видно, что он посылает запрос на устройство /dev/ttyUSB0 и ждет получения ответа с устройства /dev/ttyUSB1.
Сохраним этот скрипт под именем megafon.pl и дадим ему права на выполнение. Работает он просто:
./megafon.pl запрос
Ответ он вернет на стандартный поток вывода (STDOUT).
Теперь напишем простой bash-скрипт, который будет отправлять запрос о балансе, сохранять ответ в файл, извлекать из ответа сумму, сравнивать с заданным порогом и если она меньше, то отправлять sms:
#!/bin/bash ./megafon.pl *755#номер# > megafon SUM=`awk '{print $6}' megafon|awk -F"," '{print $1}'` SUM1=`awk '{print $6}' megafon` MIN=60 if (( $SUM < $MIN )) then echo "Megafon $SUM1"|gammu sendsms TEXT +7номер fi
Для отправки смс используется утилита gammu. Её необходимо предварительно установить командой:
apt-get install gammu
и создать файл настроек для неё ~/.gammurc такого вида:
[gammu] port=/dev/ttyUSB0 connection=at name=huawei e1550 model=
Теперь можно создать задание для cron,что бы наш скрипт выполнялся, например, каждый день в определенное время.