Здравствуйте!
Есть много(порядка 30) бинарных протоколов передачи данных. Каждый протокол описывает несколько пакетов. Пакеты битовые, т.е. скажем пакет из 6 байт: первые 3 бита — тип, 4 и 5 бит — получатель, 6-40 бит данные и т.п.
Осложняется еще тем, что архитектуры систем участвующик в обмене — разные(т.е. разные endians)
Поскольку таких пакетов будет много, хочу автоматизировать процесс работы с ними.
Облегчат ли работу с ними ASN1 компиляторы? Т.е. я думаю описать их в виде ASN1 нотации, сгенерить структуры С/С++, и автоматом получить сериализацию.
Основной вопрос: получится ли описать конкретные бинарные пакеты с пом. структур ASN1?
Если пакетов немного и всё это не будет торчать наружу (протоколы внутренние для системы и снаружи писаться плагинов для них не будет) — то ASN.1 может оказаться оверкиллом. Может быть, проще окажется вообще описать протоколы на XML а потом написать кодогенератор на любом скриптовом языке. В своё время юхал кодогенерацию на JScript — написание кодогенератора заняло порядка 1 дня.
Здравствуйте, Left2, Вы писали:
_>>Может есть другие решения, какие мнения?
L>Если пакетов немного и всё это не будет торчать наружу (протоколы внутренние для системы и снаружи писаться плагинов для них не будет) — то ASN.1 может оказаться оверкиллом. Может быть, проще окажется вообще описать протоколы на XML а потом написать кодогенератор на любом скриптовом языке. В своё время юхал кодогенерацию на JScript — написание кодогенератора заняло порядка 1 дня.
Пакетов 5-10 на протокол, т.е. от 150 до 300 пакетов всего
Здравствуйте, alexei_s, Вы писали:
_>Основной вопрос: получится ли описать конкретные бинарные пакеты с пом. структур ASN1?
Врядли. ASN1 предполагает четкую двоичную структуру сообщения, а именно: сначала идет тип элемента, затем длина, затем сам элемент. И так для всего (по кр.мере BasicEncodingRules, BER; про другие (DER/XER) — не знаю). Врядли Ваши протоколы четко этому следуют.
Здравствуйте, AlexCrush, Вы писали:
AC>Здравствуйте, alexei_s, Вы писали:
_>>Основной вопрос: получится ли описать конкретные бинарные пакеты с пом. структур ASN1?
AC>Врядли. ASN1 предполагает четкую двоичную структуру сообщения, а именно: сначала идет тип элемента, затем длина, затем сам элемент. И так для всего (по кр.мере BasicEncodingRules, BER; про другие (DER/XER) — не знаю). Врядли Ваши протоколы четко этому следуют.
Здравствуйте, alexei_s, Вы писали:
_>Здравствуйте! _>Есть много(порядка 30) бинарных протоколов передачи данных. Каждый протокол описывает несколько пакетов. Пакеты битовые, т.е. скажем пакет из 6 байт: первые 3 бита — тип, 4 и 5 бит — получатель, 6-40 бит данные и т.п. _>Осложняется еще тем, что архитектуры систем участвующик в обмене — разные(т.е. разные endians) _>Поскольку таких пакетов будет много, хочу автоматизировать процесс работы с ними. _>Облегчат ли работу с ними ASN1 компиляторы? Т.е. я думаю описать их в виде ASN1 нотации, сгенерить структуры С/С++, и автоматом получить сериализацию. _>Основной вопрос: получится ли описать конкретные бинарные пакеты с пом. структур ASN1?
Если ваши бинарные протоколы имели хоть какие-нибудь корни в ASN1, то где-то уже должны быть ASN1 описания для них. Тогда существует возможность использования ASN1 компиляторов. Раз у вас побитовое размещение полей, то речь идет об PER (packed encoding rules) и, к тому же, unaligned PER (т.е. без выравнивания отдельных полей под границу байта). AFAIK, большинство доступных ASN1 компиляторов могло с этим справляться.
Однако, если же протоколы самодельные, разработанные без оглядки на ASN1 (например, они были созданы для какой-нибудь самодельной железяки), тогда ASN1 может и не помочь. Но здесь нужно будет внимательно разбираться с тем, как спецификация ASN1 PER предписывает упаковывать разные типы данных.
Но закладываясь на ASN1 компилятор нужно еще иметь в виду, что из привязки к C++ не стандартизированны, т.е. каждый компилятор использует собственный набор C++ классов сериализации/десериализации данных. И выбрав конкретный ASN1 компилятор вы подсаживаетесь на "иглу" одного поставщика.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Однако, если же протоколы самодельные, разработанные без оглядки на ASN1 (например, они были созданы для какой-нибудь самодельной железяки), тогда ASN1 может и не помочь.
Да, именно так. Понял что АСН тут не поможет.
Может есть какие-то другие стандартные средства решения такой задачи?
Что хочется:
Описываем битовые пакеты на макро-языке.
Напускаем какой-то парсер — на выходе классы/структуры с++, и код сериализации/десериализации.
Здравствуйте, alexei_s, Вы писали:
_>Что хочется:
_>Описываем битовые пакеты на макро-языке. _>Напускаем какой-то парсер — на выходе классы/структуры с++, и код сериализации/десериализации.
Я о таких не слышал.
Но правильный совет вам уже дал Left2 выше -- напишите генератор C++ кода на каком-нибудь из скриптовых языков (хоть JavaScript, хоть Perl/Python/Ruby). Выйдет и быстрее, и дешевле.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, alexei_s, Вы писали: _>Есть много(порядка 30) бинарных протоколов передачи данных. Каждый протокол описывает несколько пакетов. Пакеты битовые, т.е. скажем пакет из 6 байт: первые 3 бита — тип, 4 и 5 бит — получатель, 6-40 бит данные и т.п. _>Осложняется еще тем, что архитектуры систем участвующик в обмене — разные(т.е. разные endians)
По моему твоя задача специально для Erlang-а.
Там есть бинарисы — битовыеп потоки, паттерн матчинг по ним (сопоставление с образцом), сериалиализация, независимость от архитектуры, прозрачная сетевая работа. См. например Re[2]: Ещё одно сравнение с участием Эрланга
Здравствуйте, Tonal-, Вы писали:
T>Здравствуйте, alexei_s, Вы писали: _>>Есть много(порядка 30) бинарных протоколов передачи данных. Каждый протокол описывает несколько пакетов. Пакеты битовые, т.е. скажем пакет из 6 байт: первые 3 бита — тип, 4 и 5 бит — получатель, 6-40 бит данные и т.п. _>>Осложняется еще тем, что архитектуры систем участвующик в обмене — разные(т.е. разные endians) T>По моему твоя задача специально для Erlang-а. T>Там есть бинарисы — битовыеп потоки, паттерн матчинг по ним (сопоставление с образцом), сериалиализация, независимость от архитектуры, прозрачная сетевая работа. См. например Re[2]: Ещё одно сравнение с участием Эрланга
Здравствуйте, alexei_s, Вы писали: T>>По моему твоя задача специально для Erlang-а. _>Все вкусно конечно и заманчиво, но к сожалению у нас c++ only
Тогда писать/находить библиотеку разбора + возможно препроцессоры/генераторы.
Если протоколы несложные, то и библиотека пишеться быстро.
Здравствуйте, Tonal-, Вы писали:
T>Здравствуйте, alexei_s, Вы писали: _>>Есть много(порядка 30) бинарных протоколов передачи данных. Каждый протокол описывает несколько пакетов. Пакеты битовые, т.е. скажем пакет из 6 байт: первые 3 бита — тип, 4 и 5 бит — получатель, 6-40 бит данные и т.п. _>>Осложняется еще тем, что архитектуры систем участвующик в обмене — разные(т.е. разные endians) T>По моему твоя задача специально для Erlang-а. T>Там есть бинарисы — битовыеп потоки, паттерн матчинг по ним (сопоставление с образцом), сериалиализация, независимость от архитектуры, прозрачная сетевая работа. См. например Re[2]: Ещё одно сравнение с участием Эрланга
Ммммм... вкусняшка
Вопросы:
— это натив?
— насколько это быстро(оптимально)?
— интегрируется ли с С++ на уровне объектных модулей(интересует майкрософт вижуал с++)?
— длл написать можно?
— для бинарисов этих подерживается прямой/обратный порядок бит в байте?
KK>Ммммм... вкусняшка KK>Вопросы: KK>- это натив?
это натураль! KK>- насколько это быстро(оптимально)?
эрланг — это не быстро. но зато масштабируемо.
KK>- интегрируется ли с С++ на уровне объектных модулей(интересует майкрософт вижуал с++)? KK>- длл написать можно?
Здравствуйте, Ka3a4oK, Вы писали: KK>Ммммм... вкусняшка KK>Вопросы: KK>- это натив?
VM
KK>- насколько это быстро(оптимально)?
Довольно быстро.
KK>- интегрируется ли с С++ на уровне объектных модулей(интересует майкрософт вижуал с++)?
Нет.
KK>- длл написать можно?
Да.
Причём существует несколько разноуровневых интерфейсов для интеграции.
KK>- для бинарисов этих подерживается прямой/обратный порядок бит в байте? http://erlang.org/doc/reference_manual/expressions.html#6.16
Посмотри/поспрошай в месном декларативном форуме — там довольно много и часто обсуждается.