Проверка счета Киевстар модема в Linux

PHP*
Навеяно этим топиком. Однажды у меня случился переезд и на новом месте проживания и мне потребовался срочно интернет. Насмотревшись рекламы Киевстара модем за 199 грн, я приобрел данный набор. Настройка в Ubuntu через NetworkManager не потребовало никаких усилий. Но мне не хватало проверки денег на счету (не через браузер). Представляю вам скрипт, который мне помог это решить.



<?php

function decodePDU($in) {
 $b = 0; $d = 0;
 $out = "";
 foreach (str_split($in, 2) as $ss) {
  $byte = hexdec($ss);
  $c = (($byte & ((1 << 7-$d)-1)) << $d) | $b;
  $b = $byte >> (7-$d);
  $out .= chr($c);
  $d++;
  if ($d == 7) {
   $out .= chr($b);
   $d = 0; $b = 0;
  }
 }
 return $out;
}

function encodePDU($in) {
 $out = "";
 for ($i = 0; $i < strlen($in); $i++) {
  $t = $i%8+1;
  if ($t == 8)
   continue;
  $c = ord($in[$i])>>($i%8);
  $oc = $c;
  $b = ord($in[$i+1]) & ((1 << $t)-1);
  $c = ($b << (8-$t)) | $c;
  $out .= strtoupper(str_pad(dechex($c), 2, '0', STR_PAD_LEFT));
 }
 return $out;
}

if (!isset($argv) || !$argv[1]){
 die("Neet number of service. Sample: <script>.php *111#\n");
}

$number = $argv[1];

print "Number of service: $number \n";

$f = fopen ("/dev/ttyUSB2", "rw+");
fputs($f, "AT+CUSD=1,".encodePDU($number).",15\r\n");

while ($s = fgets($f)) {
 if (substr($s, 0, 5) == "+CUSD") {
  $s = decodePDU(substr(trim($s), 10, -3));
  echo $s."\n";
  if (strpos($s, "1 - Dalee") !== false) {
   fputs($f, "AT+CUSD=1,".encodePDU("1").",15\r\n");
  }
  else
   break;
 }
}

fclose($f);

?>


* This source code was highlighted with Source Code Highlighter.


Пример использования:

$ php huawei_e1550.php *111#
Number of service: *111#
Na rahunku: 9.62 grn. Nomer die do 15/06/11. Bonusy: 0.00 grn; 0.0 Kbytes
$ php huawei_e1550.php *121#
Number of service: *121#
Paket Vil'nyj Internet: na rahunku 0.000 Mb, termin dii do 01.01.0001


Возможно скрипт подойдет не только для Киевстар модема (для других не тестировался).
Также хочу заметить, что в Ubuntu 10.4 чтобы модем работал в режиме модема (а не как флешка), потребуется поставить пакет usb-modeswitch.

Всем спасибо за внимание.
+25
12 июля 2010, 01:18
38
le0pard 49,2

комментарии (37)

+1
FeNUMe #
как же вы вовремя:) сейчас же пойду тестить на киевстаровском ZTE mf100 из 3G пакета…
0
andrikos #
zte не катит под линух
huawei вот наш выбор
0
sht0rm #
На чем основано Ваше мнение?
Под арчем прикрутил gsm-ussd к своему ZTE MF100.
0
andrikos #
значит не все так плохо.

уж не упомню точно название модели от zte но я перелопатил кучу инфы но так и не смог его запустить под убунтой. а хуавей нашелся и заработал на 1-2-3
0
FeNUMe #
zte mf100 завелся в ubuntu10 без какихлибо шаманств.
+1
drjohnes #
Отлично даже работает. Именно MF100.
+1
ArtemPugachev #
Интересное решение. Вопрос: какой путь ставить при соединении через fopen для винды? Есть у меня одна фирма у которой всё под винду заточено. Хотелось бы сделать напоминалку о состоянии баланса…
+1
ArtemPugachev #
Скорей всего будет вида fopen(«COM1:», «rw+»);?
К сожалению сейчас не могу протестировать…
+1
le0pard #
Извините, но с Windows очень мало работал. Сомневаюсь, что там устройства хранятся в виде файлов (думаю знающий человек меня поправит, если что).
0
ZiggiPop #
емнип, устройства вроде com и lpt имеют такие же файловые метки как и в юниксах, только хранятся они в текущей для процесса директории «в очень скрытом виде», а не в специальном каталоге типа dev.
+1
FeNUMe #
для винды нужно будет открывать COM-порт на котором висит модем и скорее всего средствами пхп это сделать нельзя, либо сложнее чем просто fopen. Только зачем под виндой извращатся, ведь через софтину оператора все можно увидеть.
0
FeNUMe #
почемуто неверно декодируется полученый ответ от модема:(
например при получении ответа
+CUSD: 0,«0050006F0073006C007500670061002000500061006B0065007400790020006
40061006E007900680020006E00650020007000690064006B006C00690075006300680065006E0061»,72
(строку разбил пополам чтобы в комент влезла и вместо типографских кавычек там обычные двойные)
на экран выводится вот это:

есть идеи как исправить?
0
Mr_Floppy #
Возможно зависит от модема, но в моем телефоне (Philips) в ответах используется кодировка UCS2. Я на питоне делаю так:
>>> import serial
>>> ser = serial.Serial('COM7', timeout=0.5)
>>> ser.write('AT+CUSD=1,"*102#"\r\n')
19L
>>> hexstr = ser.readall().split(',')[1][1:-1]
>>> response = hexstr.decode('hex').decode('utf-16-be')
>>> print response.encode('cp866', 'ignore') # windows cmd
Баланс 299,43 руб. Сумма бонуса 0.30 руб.

Формат команды:
5.14 AT+CUSD – Unstructured supplementary service data (Sec 7.15)
5.14.1 Description
Allows control of the Unstructured Supplementary Service Data (USSD). Both network- and mobile-initiated
operations are supported. This command is used to enable the unsolicited result code +CUSD.

5.14.2 Format
Command
Possible response(s)

+CUSD=[<n>[,<str>[,<dcs>]]]
+CME ERROR: <err>

+CUSD?
+CUSD: <n>

+CUSD=?
+CUSD: (list of supported <n>s)


5.14.3 Field
<n>:
0 disable the result code presentation to the TE
1 enable the result code presentation to the TE
2 cancel session (not applicable to read command response)

<str>: string type USSD string
<dcs>: 3GPP TS 23.038 [25] Cell Broadcast Data Coding Scheme in integer format (default 0)

<m>:
0 no further user action required
1 further user action required
2 USSD terminated by network
3 other local client has responded
4 operation not supported
5 network time out
+1
FeNUMe #
я уже разобрался что это пхп с кодировкой шалит, переписал на скрипт на питон и все стало ок.
+1
Guria #
а поделиться питон вариантом не могли бы?
0
FeNUMe #
через несколько минут опубликую топик, правда питонист из меня слабый, потому скрипты будут не универсальные. но может ктото поопытней поможет их развить в универсальную графическую утилитку.
+1
Guria #
графику исключительно опционально. нам тут главное cli-подавай, а гуй, как говорится, всегда приложится.
0
FeNUMe #
0
Benderlidze #
а отправлять принимать через такой модем смс проблематично? он залочен под киевстар? разлочиваентся?
0
FeNUMe #
под виндой принимать и отправлять умеет родной софт от операторов. Так как почти на всех модемах софт-лок то он либо легко обходится, либо лечится прошивкой без лока.
0
Approved_by_Biolante #
Конкретно в случае с Киевстаровским HUAWEI E1550 — там изначально исчерпаны попытки разлочки кодом, и заблокирована перепрошивка (любая попытка перепрошить обрывается с сообщением о неверной версии прошивки). Лечится через DC-Unlocker и подобный софт, увы — разлочка стоит денег (около 7 Евро).
0
FeNUMe #
тут все зависит от версии прошивки модема, в более старых там все очень просто, в новых уже постарались все заблочить что только можно… так что все зависит от даты покупки.
0
FeNUMe #
вот тут народ коды нахаляву раздает:)
0
drunken #
wrong, эти е1550 залочены не кодом, а прошивкой.
простое обновление прошивки снимет лок, а вот активация voice-функций — это уже 4 евро.
0
Approved_by_Biolante #
Хорошо, попробуйте сейчас купить и перепрошить его, в таком случае. Год назад это было возможно. Сейчас, вряд ли найдется новый можем, который не заточён по полной — так, что перепрошивка уже на начальном этапе прервется.
Я это говорю не с целью поделиться тем, что прочитал на первом попавшемся форуме, а делюсь личным опытом.
Коды сейчас не помогают. Прошивка тоже. В новых партиях модемов возможность перепрошивки заблокирована. Флеш-коды там тоже не помогут.
0
drunken #
ну камрад, так не бывает, чтобы ничего не помогало. покупал пару месяцев назад и imei был из числа тех, куда, как писали ничего не вольешь и ничего не сломаешь. ошибались, все прошло на ура.
0
Approved_by_Biolante #
Значит, повезло. На моем не работали никакие из известных мне бесплатных вариантов (коды, перепрошивка).
0
Benderlidze #
а под линукс как? теми же ат командами по идее должен?
0
FeNUMe #
да должен, но я не пробовал пока. в сети видел вот такое сообщение:
«Я её юзал для моторолы. В частности этот код:
at+cmgf=1
at+cmgf?
at+cscs=”GSM”
at+cmgw=”+7905XXXXXXX”}Tekst soobsheniya~!gets”+cmgw:”
at+cmss=%%1
at+cmgd=%%1
Прекрасно работает на мотороле C350 и сименсе m55. А на моём модеме никак.
После строки at+cscs=”GSM” выдаёт ERROR.»

нужно пробовать и подбирать команды для конкретного модема.
0
alexeym #
>потребуется поставить пакет usb-modeswitch.

на mts мне хватало выполнить команду eject :)
0
FeNUMe #
не во всех дистрибутивах нормально отрабатывается извлечение виртсд и переключение в режим модема, хотя например в убунте10 вообще ничего делать не пришлось — только настроить соединение в менеджере сети.
0
MealstroM #
перл скрипты:
#encodepdu.pl
use Getopt::Std;
use Device::Gsm::Pdu;
@a=split(//,unpack(«b*», "*101#")); for ($i=7; $i < $#a; $i+=8) { $a[$i]="" } print uc(unpack(«H*», pack(«b*», join("", @a))))."\n"
#decodepdu.pl
use Getopt::Std;
use Device::Gsm::Pdu;
while(<>){print STDOUT Device::Gsm::Pdu::decode_text7('00'.$_)."\n";}

0
alexeym #
угу, только ещё модуль с cpanа ставить нужно
+3
nani #
А я для этих целей написал программу на C++ и Qt.



Помимо запроса баланса добавил туда возможность принимать СМС, отправлять СМС (на инглише), отправлять простые USSD запросы. Имеются также потуги подключения к интернету.
В общем, если кому интересно даю ссылку со всеми исходниками: rghost.ru/2102920 (Предупреждаю, программа очень сырая)
0
FeNUMe #
а версии для х86_64 нету? а то ругается стандартно /usr/lib/gio/modules/libgvfsdbus.so: неправильный класс ELF: ELFCLASS64
0
nani #
Это все, что есть
0
kostyl #
прошу прощения за оффтоп, но можно ли как то под FreeBSD запусить people.net на huawei?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.