Попробуйте вот это.
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";
}