USSD запрос баланса

Обсуждение ПО и его настройки
Ответить
Zlodeyz
Сообщения: 5
Зарегистрирован: 02 июн 2019, 14:01

02 июн 2019, 19:49

Здравствуйте. Подскажите как расшифровать USSD ?
Оборудование Микротик SXT LTE kit.
Делаю запрос
/interface lte at-chat lte1 input="AT+CUSD=1,\"*102#\",15"

ответ
May/23/2019 16:03:15 lte,async lte1: sent at+cusd=1, *102#,15
May/23/2019 16:03:15 lte,async lte1: rcvd OK
May/23/2019 16:03:15 lte,async,event +CUSD: 0,"002d0031002e0030003000200440002e", 17

Выяснил особенность если стоит только 4G USSD не работают. Оператор Ростелеком(теле2). Должна стоять еще галка 3g.
И когда делаешь запрос , модем переключается на 3g, и выполняет USSD.


Zlodeyz
Сообщения: 5
Зарегистрирован: 02 июн 2019, 14:01

02 июн 2019, 20:13

Если расшифровать на самом микротике проблема. То переслать бы это закодированное сообщение на мой телефон. Пусть телефон расшифрует.


Zlodeyz
Сообщения: 5
Зарегистрирован: 02 июн 2019, 14:01

04 июн 2019, 12:35

Вот автор выложил скрипт по расшифровке СМС
viewtopic.php?p=60260#p60260
Может сможет в него добавить проверку USSD


Zlodeyz
Сообщения: 5
Зарегистрирован: 02 июн 2019, 14:01

04 июн 2019, 14:14

Сделал программку для расшифровки https://yadi.sk/d/cJ0fn0O2sTy9Dg
Последний раз редактировалось Zlodeyz 04 июн 2019, 14:27, всего редактировалось 1 раз.


Andrey.Radomanov
Сообщения: 5
Зарегистрирован: 28 фев 2018, 10:43

04 июн 2019, 14:17

Попробуйте вот это.
USSD-команда указывается в начале скрипта.
Декодирует UTF-8 кириллицу в транслит.
Пример обработки строки с балансом и уведомлением по e-mail можете посмотреть в моем обработчике "sms_patrol" (см. ссылку выше).
Для тех, кто никогда не работал со скриптами: Сохраните это в виде скрипта (например: "ussd_110") и выполняйте через в терминале или через scheduler командой: /system script run ussd_110

Код: Выделить всё

#For R11e-LTE:
#:local ussd "*110#";

#for Huawei must be in PDU-format. Converter: http://smstools3.kekekasvi.com/topic.php?id=288
#:local ussd "AA580C3602";

#---- system variables ---
:local smsArray ({});

/interface lte at-chat lte1 input="AT+CMGF=0";

:put "Sending USSD command \"$ussd\" and waiting to response...\n";
:local content [/interface lte at-chat lte1 input="AT+CUSD=1,\"$ussd\",15" as-value wait=yes];
:set content ($content->"output");
#:put $content;

:if ([:typeof [:find $content "+CUSD: "]] = "num") do={

  :local symbols {"-";" ";" ";"!";"\"";"#";"\$";"%";"&";"'";"(";")";"*";"+";",";"-";".";"/";"0";"1";"2";"3";"4";"5";"6";"7";"8";"9";":";";";"<";"=";">";"?";"@";"A";"B";"C";"D";"E";"F";"G";"H";"I";"J";"K";"L";"M";"N";"O";"P";"Q";"R";"S";"T";"U";"V";"W";"X";"Y";"Z";"[";"\\";"]";"^";"_";"`";"a";"b";"c";"d";"e";"f";"g";"h";"i";"j";"k";"l";"m";"n";"o";"p";"q";"r";"s";"t";"u";"v";"w";"x";"y";"z";"{";"|";"}";"~"};

  :local symbolsUTF [:toarray "2013,000A,0020,0021,0022,0023,0024,0025,0026,0027,0028,0029,002A,002B,002C,002D,002E,002F,0030,0031,0032,0033,0034,0035,0036,0037,0038,0039,003A,003B,003C,003D,003E,003F,0040,0041,0042,0043,0044,0045,0046,0047,0048,0049,004A,004B,004C,004D,004E,004F,0050,0051,0052,0053,0054,0055,0056,0057,0058,0059,005A,005B,005C,005D,005E,005F,0060,0061,0062,0063,0064,0065,0066,0067,0068,0069,006A,006B,006C,006D,006E,006F,0070,0071,0072,0073,0074,0075,0076,0077,0078,0079,007A,007B,007C,007D,007E"];

  :local symbolsRus [:toarray "A,B,V,G,D,E,Yo,Zh,Z,I,Y,K,L,M,N,O,P,R,S,T,U,F,Kh,C,Ch,Sh,Sch,',I,',E,Yu,Ya,a,b,v,g,d,e,yo,zh,z,i,y,k,l,m,n,o,p,r,s,t,u,f,kh,c,ch,sh,sch,',i,',e,yu,ya,_,!,_,_,_,%,&,',(,),*,+,_,-,.,/,0,1,2,3,4,5,6,7,8,9"];

  :local symbolsRusUTF [:toarray "0410,0411,0412,0413,0414,0415,0401,0416,0417,0418,0419,041A,041B,041C,041D,041E,041F,0420,0421,0422,0423,0424,0425,0426,0427,0428,0429,042A,042B,042C,042D,042E,042F,0430,0431,0432,0433,0434,0435,0451,0436,0437,0438,0439,043A,043B,043C,043D,043E,043F,0440,0441,0442,0443,0444,0445,0446,0447,0448,0449,044A,044B,044C,044D,044E,044F"];


  :local strtoupperTo [:toarray "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"];

  :local strtoupperFrom [:toarray "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"];


  :local hexstr "0123456789ABCDEF";
  :local ascii " !\"#\$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";

  :local contentLen [ :len $content ] ;  
  :local lineEnd 1;
  :local lineStart 0;
  :local line "";

  :do {
    :set lineStart [:find $content "+CUSD:" ($lineEnd-1)] ;
    :if ([:typeof $lineStart] = "num") do={
       :set lineEnd [:find $content "+CUSD:" $lineStart] ;
       :if ([:typeof $lineEnd] = "nil") do={
         :set lineEnd [:find $content "\n" $lineStart] ;
         :if ([:typeof $lineEnd] = "nil") do={
           :set lineEnd ($contentLen+1);
          }
        }
       :set line [:pick $content $lineStart $lineEnd];

       :local i;
       #:put ("Line:'" . $line . "'\n");
       :if ( ( [:typeof [:find $line "+CUSD"]] != "nil" ) and ([:typeof [:find $line ",\""]] != "nil") and ([:typeof [:find $line "\","]] != "nil") and (([:find $line ",\""]) < ([:find $line "\","])) ) do={

         :local sms [:pick $line ([:find $line ",\""]+2) [:find $line "\","]];
         :local smsNum [:pick $line ([:find $line "\","]+2) ([:len $line]-1)];
    
         #:put ("sms-raw $smsNum:'$sms'\n");

         #strtoupper:
         :for i from=0 to=([:len $sms]-1) do={
           :local char "";
           :if ($i < ([:len $sms]-1)) do={
             :set char [:pick $sms $i ($i+1)];
            } else={
             :set char [:pick $sms $i];
            }
           :local ind [:find $strtoupperFrom $char];
           :if ([:typeof $ind]="num") do={
             :if ($i < ([:len $sms]-1)) do={
               :set sms ( [:pick $sms 0 $i] . [:pick $strtoupperTo $ind] . [:pick $sms ($i+1) ([:len $sms])]);
             } else={
               :set sms ( [:pick $sms 0 $i] . [:pick $strtoupperTo $ind]);
             }
           }
         }
         :local decodedSMS "";
         :for i from=0 to=([:len $sms]-1) step=4 do={
           :local char [:pick $sms $i ($i+4)];
           :local ind [:find $symbolsRusUTF $char];
           :if ([:typeof $ind]="num") do={
             :set decodedSMS ($decodedSMS.[:pick $symbolsRus $ind]);
           } else={
             :set ind [:find $symbolsUTF $char];
             :if ([:typeof $ind]="num") do={
               :set decodedSMS ($decodedSMS.[:pick $symbols $ind]);
             } else={
               :if ($char!="\r") do={
                 :set decodedSMS ($decodedSMS."[".$char."]");
               }
             }
           }
         }
         :set sms $decodedSMS;
         #:put ("SET ".($smsNum)." ".$sms);
         :set ($smsArray->($smsNum)) $sms;
       }
     } else={
      :set lineEnd $contentLen;
     }
  }
} else={
  :put "USSD $ussd answer not recieved.";
};

:foreach k,v in=$smsArray do={
  :put "USSD \"$ussd\" answer #$k: $v\n";
  :log warning "USSD \"$ussd\" answer #$k: $v\n";
}



Zlodeyz
Сообщения: 5
Зарегистрирован: 02 июн 2019, 14:01

04 июн 2019, 14:39

СПАСИБО !!!!! РАБОТАЕТ !!!!!
Еще подскажи как установить режим 3g перед выполнение скрипта
и после отключить 3g

Сам отвечу
/interface lte at-chat lte1 input="AT*BAND=??,78,147,160,524487,0,2,0"

1 = 0001 - 3G
5 = 0101 - 4G
11= 1011 - 3G+4G
15= 1111 - GSM+3G+4G

Пример - работает только 4G
/interface lte at-chat lte1 input="AT*BAND=5,78,147,160,524487,0,2,0"


Andrey.Radomanov
Сообщения: 5
Зарегистрирован: 28 фев 2018, 10:43

02 июл 2019, 14:31

Вот еще один пример перевода модема в режим 3G перед отправкой USSD. Этот скрипт для R11-e LTE (для Huawei надо исправить на отправку PDU-кодировке ):

Код: Выделить всё

:local ussd "*111*0887#";
:local lteMode [/interface lte get [find name="lte1"] network-mode];

:if ([:typeof [:find $lteMode "3g"]] = "nil") do={
  :log info "Switching to 3G-mode before send USSD...";
  /interface lte set [find name="lte1"] network-mode="3g";
  :log info "Waiting 60 seconds...";
  :delay 60;
}

:log info "Sending USSD request $ussd";
/interface lte at-chat lte1 input="AT+CUSD=1,\"$ussd\",15";

:if ([:typeof [:find $lteMode "3g"]] = "nil") do={
  :log info "Waiting 120 seconds for SMS...";
  :delay 120;
}

:if ([:typeof [:find $lteMode "3g"]] = "nil") do={
  :log info "Returning to 4G-mode.";
  /interface lte set [find name="lte1"] network-mode=$lteMode;
}


Sertik
Сообщения: 634
Зарегистрирован: 15 сен 2017, 09:03

04 июл 2019, 23:17

Простите за вопрос, у меня модем Микротик R11-e LTE.
Команда в терминал /interfacе lte at-chat lte1 input="AT+CUSD=1,\"*102#\",15"
выдаёт просто output: OK и никакого баланса
Почему так ?


Чего не знаем то нагуглим
Sertik
Сообщения: 634
Зарегистрирован: 15 сен 2017, 09:03

05 июл 2019, 22:45

Ребята, ну подскажите, пожалуйста, какого же ... у меня не работает то ? Как будто просто команду "AT" посылаешь ...


Чего не знаем то нагуглим
ShumaDK
Сообщения: 1
Зарегистрирован: 22 авг 2019, 10:13

22 авг 2019, 10:15

Sertik писал(а):
04 июл 2019, 23:17
Простите за вопрос, у меня модем Микротик R11-e LTE.
Команда в терминал /interfacе lte at-chat lte1 input="AT+CUSD=1,\"*102#\",15"
выдаёт просто output: OK и никакого баланса
Почему так ?
Результат выполнения команды смотрите в LOG-е микротика.


Ответить