Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как распарсить CSTA ASN.1 
V
    Опции темы
Cyr
Дата 7.4.2014, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Научите парсить CSTA сообщения.
Нашёл библиотеку NET::CSTA.
С помощью такого:  
Код

use Convert::ASN1;
my $pdu ="A1 34 02 01 03 02 01 15 30 2C 55 04 01 11 00 12 A0 24 B0 22 
    6B 11 30 0F 80 04 30 30 37 35 A1 07 30 05 80 03 31 31 31 63 
    07 30 05 80 03 31 31 31 4E 01 01 0A 01 16";
$pdu =~s/\s//g; # убираем пробелы
$pdu =pack ("H*", $pdu); # превращаем строку в бинарник
Convert::ASN1::asn_dump($pdu);

Смог получить голую ASN.1 структуру:
Код

0000   52: [CONTEXT 1] {
0002    1:   INTEGER = 3
0005    1:   INTEGER = 21
0008   44:   SEQUENCE {
000A    4:     [APPLICATION 21]
000C     :       01 11 00 12 __ __ __ __ __ __ __ __ __ __ __ __ ....
0010   36:     [CONTEXT 0] {
0012   34:       [CONTEXT 16] {
0014   17:         [APPLICATION 11] {
0016   15:           SEQUENCE {
0018    4:             [CONTEXT 0]
001A     :               30 30 37 35 __ __ __ __ __ __ __ __ __ __ __ __ 0075
001E    7:             [CONTEXT 1] {
0020    5:               SEQUENCE {
0022    3:                 [CONTEXT 0]
0024     :                   31 31 31 __ __ __ __ __ __ __ __ __ __ __ __ __ 111
0027     :               }
0027     :             }
0027     :           }
0027     :         }
0027    7:         [APPLICATION 3] {
0029    5:           SEQUENCE {
002B    3:             [CONTEXT 0]
002D     :               31 31 31 __ __ __ __ __ __ __ __ __ __ __ __ __ 111
0030     :           }
0030     :         }
0030    1:         [APPLICATION 14]
0032     :           01 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ .
0033    1:         ENUM = 22
0036     :       }
0036     :     }
0036     :   }
0036     : }

Как её заполнить CSTA директивами? Чтобы получить это:
Код

   CSTAEventReportArgument {
      crossRefIdentifier = 01110012
      eventSpecificInfo {
         callControlEvents {
            serviceInitiated {
               initiatedConnection {
                  both {
                     callID = 0075
                     deviceID {
                        staticID {
                           deviceIdentifier {
                              dialingNumber = 111
                           }
                        }
                     }
                  }
               }
               initiatingDevice {
                  deviceIdentifier {
                     deviceIdentifier {
                        dialingNumber = 111
                     }
                  }
               }
               localConnectionInfo = initiated
               cause = newCall
            }
         }
      }
   }



Это сообщение отредактировал(а) Cyr - 7.4.2014, 12:56
PM MAIL   Вверх
arto
Дата 7.4.2014, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



похоже, вы в $pdu длину потеряли
PM MAIL ICQ   Вверх
Cyr
Дата 7.4.2014, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



arto,  нет. с чего вы так решили?

Это сообщение отредактировал(а) Cyr - 7.4.2014, 14:24
PM MAIL   Вверх
arto
Дата 7.4.2014, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



длина вашего pdu 55 байтов, а первые октеты у вас A1 34.
Или я ошибаюсь?
PM MAIL ICQ   Вверх
Cyr
Дата 7.4.2014, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



длина pdu - 54 байта, а длина сообщения после первого октета равна 52 (34h).
так что там всё нормал. 
PM MAIL   Вверх
arto
Дата 8.4.2014, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# print A1 34 02 01 03 02 01 15 30 2C 55 04 01 11 00 12 A0 24 B0 22 6B 11 30 0F 80 04 30 30 37 35 A1 07 30 05 80 03 31 31 31 63 07 30 05 80 03 31 31 31 4E 01 01 0A 01 16 | perl -0777 -MData::Dumper -MNet::CSTA::ASN=CSTAapdu -lne 'print Dumper($CSTAapdu->decode(pack"H*",s#\s+##gsr))' 
$VAR1 = {
          'svcRequest' => {
                            'serviceArgs' => undef,
                            'serviceID' => 21,
                            'invokeID' => 3
                          }
        };
#

попытайтесь найти нормальную asn.1 грамматику для csta
PM MAIL ICQ   Вверх
Cyr
Дата 8.4.2014, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Цитата(arto @ 8.4.2014,  13:44)
попытайтесь найти нормальную asn.1 грамматику для csta

нашёл, 274 файла... все части CSTA. около 700 килобайт.
Видимо надо использовать только Convert::ASN1 и подсовывать туда эти файлы?


Это сообщение отредактировал(а) Cyr - 8.4.2014, 14:34
PM MAIL   Вверх
arto
Дата 9.4.2014, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



Посмотрите как сделано в Net::CSTA::ASN, там неполохой пример.
PM MAIL ICQ   Вверх
Cyr
Дата 11.4.2014, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Цитата(arto @ 9.4.2014,  08:53)
Посмотрите как сделано в Net::CSTA::ASN, там неполохой пример.

arto, в принципе в Net::CSTA::ASN практически тоже самое что и в полном CSTA. Почему же оно полностью не парсится?
Как определить, где конкретно (в каком месте) затык?

Это сообщение отредактировал(а) Cyr - 12.4.2014, 15:06
PM MAIL   Вверх
arto
Дата 14.4.2014, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



в модуле написано, что "this module currently implements CSTA phase I - mostly because my PBX (MD110 with 
Application Link 4.0) only supports phase I. Supporting multiple versions will 
require some thought since the versions are largly incompatible."

у вас какая версия csta?
PM MAIL ICQ   Вверх
Cyr
Дата 14.4.2014, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



arto, csta phase 3. но я смотрел определения(грамматику) и не смог найти отличия конкретно для моего примера.

Это сообщение отредактировал(а) Cyr - 14.4.2014, 08:57
PM MAIL   Вверх
arto
Дата 14.4.2014, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



попробуйте вручную распарсить ваш pdu
PM MAIL ICQ   Вверх
Cyr
Дата 15.4.2014, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



arto, парсится он нормально.
но видимо заставить делать это на perl для меня - не судьба.
Хочу пойти другим путём.
Как можно в цикле вывести ASN.1 теги и их значения?
Буду обрабатывать их через if ... else

Это сообщение отредактировал(а) Cyr - 15.4.2014, 11:16
PM MAIL   Вверх
arto
Дата 15.4.2014, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



вам распарсить грамматику?
PM MAIL ICQ   Вверх
Cyr
Дата 15.4.2014, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



arto, нет.
Мне просто в цикле надо пройти pdu и получить:
CONTEXT=1
INTEGER = 3
INTEGER = 21
SEQUENCE 
...
И т.д. 
А я уже через if ... else буду выводить, что это за информация и её значение.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.