LINUX.ORG.RU

3g modem huawei e173eu-1 + perl script

 3g perl debian


0

3

Известно, что модемы от huawei принимают сообщения на /dev/ttyUSB0 и отвечают на /dev/ttyUSB2. для общения с модемом (отправка ussd запросов) существует много скриптов на perl, но они не хотят работать. сам я 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";}

cut добавил, но все равно не скрыло под спойлер. P.S. модуль к perl добавил так (perl -MCPAN -e 'install Device::Gsm::Pdu')

conformist ★★★
() автор топика
Ответ на: комментарий от Allakka
root@myWork:~$ gsm-ussd -m /dev/ttyUSB0 *101#
Broken command
root@myWork:~$ gsm-ussd -m /dev/ttyUSB1 *101#
No modem found at device "/dev/ttyUSB1". Possible causes:
* Wrong modem device (use -m <dev>)?
* Modem broken (no reaction to AT)
root@myWork:~$ gsm-ussd -m /dev/ttyUSB2 *101#
No modem found at device "/dev/ttyUSB2". Possible causes:
* Wrong modem device (use -m <dev>)?
* Modem broken (no reaction to AT)

тоже не хочет работать :(

conformist ★★★
() автор топика

В dmesg видно где девайс ?

2 девайса сделаны, чтоб не разрывая соединения можно было получить с него разные данные. У меня всегда работали ussd на последнем (ttyUSB2), а на ttyUSB0 живет gammu-smsd.

Я всегда использовал на in и out одно и тоже устройство. Нафига афтар сделал возможность скармливать команды на один девайс, а читать с другого - не понятно.

У e173 ответ на USSD в UTF16BE, так что его нужно еще перекодировать.

У меня вместо

$decoded_ussd_reply = Device::Gsm::Pdu::decode_text7('00'.$ussd_reply);
print STDOUT "USSD REPLY: $decoded_ussd_reply\n";
исправлено
$conv = Text::Iconv->new('utf16be','utf8');
print $conv->convert(pack('H*', $ussd_reply)),"\n"

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel
~$ /home/conformist/ussd.pl -v *101#
USSD MSG: *101#
PDU ENCODED: AA182C3602
Waiting for USSD reply...
^C

до декодирования даже не доходит скрипт. не может получить данные. почему 2 устройства? потому AT команды отправляются с /dev/ttyUSB0, а ответы приходят на /dev/ttyUSB2, я не зря это описал в начале. вывод minicom:

Добро пожаловать в minicom 2.6.2

ПАРАМЕТРЫ: I18n 
Дата компиляции Feb  7 2013, 21:36:21.
Port /dev/ttyUSB0, 10:41:55

Нажмите CTRL-A Z для получения подсказки по клавишам

AT+CUSD=1,"AA182C3602",15
OK
AT+CUSD=1,"*101#",15
ERROR

——————————————————————————————————————————————

Добро пожаловать в minicom 2.6.2

ПАРАМЕТРЫ: I18n                                                              
Дата компиляции Feb  7 2013, 21:36:21.                                       
Port /dev/ttyUSB2, 10:41:55                                                  
                                                                             
Нажмите CTRL-A Z для получения подсказки по клавишам                         
                                                                             
                                                                             
^STIN:0,0,0                                                                  
                                                                             
^STIN:99,1,0                                                                 
                                                                             
^BOOT:5514464,0,0,0,20                            
                                                  
^MODE:3,3                                         
                                                  
^SRVST:1                                          
                                                  
^MODE:3,3

^SIMST:1

^SRVST:2

^RSSI:24

^MODE:3,3

^BOOT:5514464,0,0,0,20

+CUSD: 0,"3199AB960355834816889C56CFDD793588FC06C1662E58CE2583C5682C103D2CCF9BDD793508
1E5E97E9A05333880515DD65F9397F728154A0693328A5BA9C456A0B1463C16E67B9DB05728741E4B
25

^RSSI:15

^MODE:3,3

^RSSI:20

^BOOT:5514464,0,0,0,20

^BOOT:5514464,0,0,0,20

conformist ★★★
() автор топика
Ответ на: комментарий от conformist

Это &%^$#&%$# если команда выдается в один порт, а ответ выдается в другой!

А что за девайс? у меня такой.

root@testing:~# gammu -s 1 identify
Device               : /dev/ttyUSB2
Manufacturer         : Huawei
Model                : E173 (E173)
Firmware             : 11.126.15.00.209

что мешает запустить

ussd.pl -i /dev/ttyUSB2 -o /dev/ttyUSB2 -v "*101#"
?

Дурацкий вопрос - а оно у тебя в сети ?

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel
ATI                                                                            
Manufacturer: huawei                                                           
Model: E173                                                                    
Revision: 11.126.16.04.174                                                     
IMEI: 8677670055*****                                                          
+GCAP: +CGSM,+FCLASS,+DS                                                       
                                                                               
OK
~$ /home/conformist/ussd.pl -i /dev/ttyUSB2 -o /dev/ttyUSB2 -v "*101#"
USSD MSG: *101#
PDU ENCODED: AA182C3602
Waiting for USSD reply...
^C

девайс — huawei E173eu-1 киевстар, украина. уже разлочен

conformist ★★★
() автор топика
Ответ на: комментарий от vel

я абсолютно нормально общаюсь с модемом AT командами. в одном ввел, в другом ответ. для упрощения этих действий был написан скрипт на перле, который декодирует команды и отправляет их через ttyUSB0 и слушает ttyUSB2, для получения ответа, перекодирует обратно и выдает ответ. проблема в том, что скрипт не получает ответа со второго устройства, скорее всего косяк в скрипте, но я не знаю перл

conformist ★★★
() автор топика
Ответ на: комментарий от conformist

Но в minicom-e ты ответ получал на тот же порт, что и запрос ?

гм. а я оказывается этот скрипт еще переписывал/упрощал...

if (! $opt_n) {
    open (RCVPORT, '+>', $opt_o) or die "Can't open '$opt_o': $!\n";
    print RCVPORT 'AT+CUSD=1,',$ussd_req,",15\r\n";
    print "Waiting for USSD reply...\n" if $opt_v;
vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

блин, ну честно, я уже раз 5 говорил о том, что на разных портах все происходит. я приложил вывод миникома, там 2 разных порта, с одного запрос, на второй приходит ответ

conformist ★★★
() автор топика
Ответ на: комментарий от conformist

Посылай свои команды в тот порт откуда, по-твоему, типа, ответы приходят. Это не баг, это фича. Порт откуда приходит ^BOOT, ^MODE, ^RSSI и т.д. это порт для unsolicited result codes. Посылай команды туда.

dvl36
()
Ответ на: комментарий от dvl36

я извиняюсь, действительно, ttyUSB2 принимает команды и тут же на них отвечает. я этого не знал, спасибо :)

conformist ★★★
() автор топика
Ответ на: комментарий от vel

переписал кусочек кода как у вас, все работает, но ответ не перекодируется, получается так:

~$ /home/conformist/ussd.pl -v *101#
USSD MSG: *101#
PDU ENCODED: AA182C3602
Waiting for USSD reply...
PDU USSD REPLY: B1986B260355834816889C56CFDD793588FC06C1662E58CE2583C5682C103D2CCF9BDD7935081E5E97E9A05333880515DD65F9397F728154A0693328A5BA9C456A0B1463C16E67B9DB05728741E4B2FB140205D7F4BC3D3C4EABC33A550C1653C56AB011
USSD REPLY: 

conformist ★★★
() автор топика
Ответ на: комментарий от vel

использовал ваш скрипт, все заработало, но не расшифровывало ответ, изменил концовку на это:

 $decoded_ussd_reply = Device::Gsm::Pdu::pdu_to_latin1($ussd_reply);
    print STDOUT "USSD REPLY: $decoded_ussd_reply\n";
но есть один нюанс. когда я запрашиваю *101*4#, то в миникоме наблюдаю следующее:
AT+CUSD=1,AA182CA6A28D00,15                                                     
+CUSD: 2
по условиям скрипта возвращает die, но мне нужно проверять остаток мегабайт на месяц, как пофиксить?

conformist ★★★
() автор топика
Ответ на: комментарий от vel

если бы это была стандартная if...else конструкция, я бы мог, но я не понимаю, что тут вообще написано:

  while (<RCVPORT>) {
        chomp;
        die "USSD ERROR\n" if $_ eq "+CUSD: 2";

conformist ★★★
() автор топика
Ответ на: комментарий от conformist

на человесеском языке все просто:

цикл: читаем сторку из модема в $_.

убираем EOL из *_;

завершаем программу если прочитанная строка не совпадает с «+CUSD: 2» ...

можно было написать

if($_ ne "+CUSD: 2") { die "USSD ERROR\n" };
но это же столько лишних скобок писать :)

vel ★★★★★
()
Ответ на: комментарий от vel

я все равно что-то не пойму, что мне делать. дело в том, что в миникоме на команду AT+CUSD=1,«AA182CA6A28D00»,15 ответ просто ОК, и все, то есть модем ничего не возвращает. а скрипт отвечает:

ussd.pl -v *101*4#
USSD MSG: *101*4#
PDU ENCODED: AA182CA6A28D00
Waiting for USSD reply...
Got unknown USSD message: +CUSD: 5

conformist ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.