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

    Навеяно этим топиком. Однажды у меня случился переезд и на новом месте проживания и мне потребовался срочно интернет. Насмотревшись рекламы Киевстара модем за 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.

    Всем спасибо за внимание.
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 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
                          через несколько минут опубликую топик, правда питонист из меня слабый, потому скрипты будут не универсальные. но может ктото поопытней поможет их развить в универсальную графическую утилитку.
                • 0
                  а отправлять принимать через такой модем смс проблематично? он залочен под киевстар? разлочиваентся?
                  • 0
                    под виндой принимать и отправлять умеет родной софт от операторов. Так как почти на всех модемах софт-лок то он либо легко обходится, либо лечится прошивкой без лока.
                    • 0
                      Конкретно в случае с Киевстаровским HUAWEI E1550 — там изначально исчерпаны попытки разлочки кодом, и заблокирована перепрошивка (любая попытка перепрошить обрывается с сообщением о неверной версии прошивки). Лечится через DC-Unlocker и подобный софт, увы — разлочка стоит денег (около 7 Евро).
                      • 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?

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