Пользователь
0,0
рейтинг
12 июля 2010 в 01:18

Разработка → Проверка счета Киевстар модема в 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.

Всем спасибо за внимание.
le0pard @le0pard
карма
146,3
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • +1
    как же вы вовремя:) сейчас же пойду тестить на киевстаровском ZTE mf100 из 3G пакета…
    • 0
      zte не катит под линух
      huawei вот наш выбор
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          значит не все так плохо.

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

    есть идеи как исправить?
    • 0
      Возможно зависит от модема, но в моем телефоне (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
        я уже разобрался что это пхп с кодировкой шалит, переписал на скрипт на питон и все стало ок.
        • +1
          а поделиться питон вариантом не могли бы?
          • 0
            через несколько минут опубликую топик, правда питонист из меня слабый, потому скрипты будут не универсальные. но может ктото поопытней поможет их развить в универсальную графическую утилитку.
            • +1
              графику исключительно опционально. нам тут главное cli-подавай, а гуй, как говорится, всегда приложится.
  • 0
    а отправлять принимать через такой модем смс проблематично? он залочен под киевстар? разлочиваентся?
    • 0
      под виндой принимать и отправлять умеет родной софт от операторов. Так как почти на всех модемах софт-лок то он либо легко обходится, либо лечится прошивкой без лока.
      • 0
        Конкретно в случае с Киевстаровским HUAWEI E1550 — там изначально исчерпаны попытки разлочки кодом, и заблокирована перепрошивка (любая попытка перепрошить обрывается с сообщением о неверной версии прошивки). Лечится через DC-Unlocker и подобный софт, увы — разлочка стоит денег (около 7 Евро).
        • 0
          тут все зависит от версии прошивки модема, в более старых там все очень просто, в новых уже постарались все заблочить что только можно… так что все зависит от даты покупки.
          • 0
            вот тут народ коды нахаляву раздает:)
        • 0
          wrong, эти е1550 залочены не кодом, а прошивкой.
          простое обновление прошивки снимет лок, а вот активация voice-функций — это уже 4 евро.
          • 0
            Хорошо, попробуйте сейчас купить и перепрошить его, в таком случае. Год назад это было возможно. Сейчас, вряд ли найдется новый можем, который не заточён по полной — так, что перепрошивка уже на начальном этапе прервется.
            Я это говорю не с целью поделиться тем, что прочитал на первом попавшемся форуме, а делюсь личным опытом.
            Коды сейчас не помогают. Прошивка тоже. В новых партиях модемов возможность перепрошивки заблокирована. Флеш-коды там тоже не помогут.
            • 0
              ну камрад, так не бывает, чтобы ничего не помогало. покупал пару месяцев назад и imei был из числа тех, куда, как писали ничего не вольешь и ничего не сломаешь. ошибались, все прошло на ура.
              • 0
                Значит, повезло. На моем не работали никакие из известных мне бесплатных вариантов (коды, перепрошивка).
      • 0
        а под линукс как? теми же ат командами по идее должен?
        • 0
          да должен, но я не пробовал пока. в сети видел вот такое сообщение:
          «Я её юзал для моторолы. В частности этот код:
          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
    >потребуется поставить пакет usb-modeswitch.

    на mts мне хватало выполнить команду eject :)
    • 0
      не во всех дистрибутивах нормально отрабатывается извлечение виртсд и переключение в режим модема, хотя например в убунте10 вообще ничего делать не пришлось — только настроить соединение в менеджере сети.
  • 0
    перл скрипты:
    #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
      угу, только ещё модуль с cpanа ставить нужно
  • +3
    А я для этих целей написал программу на C++ и Qt.



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

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