Мудак и член партии Справедливый Хохлосрач (betment_6) wrote,

huawei e1550 и linux: отправить USSD-запрос

Вот например тут обсуждалась проблема с этим устройством. Там написано, что USSD-запрос нужно отправлять кодированным в "GSM 7 bit default alphabet (3GPP 23.038)". Предложенный там скрипт на php не торт. Не горя желанием вдаваться в детали и писать кодер-декодер для этого я поискал в CPAN по слову pdu, и кое-что нашел. Это модуль Device::Gsm::Pdu. Вот мой скрипт на perl:

#!/usr/bin/perl


use Getopt::Std;
use Device::Gsm::Pdu;


# defaults
$opt_i = "/dev/ttyUSB2";
$opt_o = "/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 to work for (just mine) Huawei E1550 GSM/UMTS USB modem.


Options:
  -i port   Port to receive data from. Default: $opt_i
  -o port   Port to send AT commands to. Default: $opt_o
  -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_o) or die "Can't open '$opt_o': $!\n";
    print SENDPORT 'AT+CUSD=1,',$ussd_req,",15\r\n";
    close SENDPORT;
    open (RCVPORT, $opt_i) or die "Can't open '$opt_i': $!\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;
        }
        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";}






ussd_msg пишется привычным способом:
# script.pl "*111#"
USSD REPLY: Na Vashomu rahunku 6.66 grn.



upd: если не расшифровывается USSD-ответ, замените вызов функции decode_text7('00'.$ussd_reply) на pdu_to_latin1($ussd_reply)
(без нолей)
Tags: hardware, perl
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded  

  • 14 comments