Darks Codec
Darks codec — это облегчённый фреймворк для кодирования и декодирования сообщений в рамках протокола. Он поддерживает кодирование и декодирование объектов сообщений большинства протоколов на основе байтов.
Он помогает разработчикам легко и быстро создавать любой протокол обмена сообщениями. А также помогает решить проблему с пакетами, которые «зависают» в сети или теряются.
Это позволяет разработчикам уделять больше внимания проектированию, а не реализации протокола обмена сообщениями, что может улучшить дизайн программного обеспечения.
Простой пример
Если мы хотим создать протокол обмена сообщениями с прямым порядком байтов, например:
FB FA [ID 32bits] [VERSION 8bits] [COMMAND] FF
Мы можем создать класс JAVA, например:
public class SimpleMsg { int id; byte version; String command; }
Для простоты мы опускаем методы get/set.
Согласно протоколу обмена сообщениями нам нужны только идентификаторы начала и конца («FB FA» и «FF») помимо тела сообщения, поэтому мы можем настроить кодер объектов следующим образом:
ObjectCoder coder = new ObjectCoder(); coder.getCodecConfig().setEndianType(EndianType.LITTLE); coder.getCodecConfig().addWrap(new IdentifyWrapper(new OCInt16(0xFAFB), new OCInt8(0xFF)));
Теперь мы можем легко закодировать объект сообщения.
SimpleMsg msg = new SimpleMsg(); msg.id = 32; msg.version = 1; msg.command = "running"; byte[] bytes = coder.encode(msg); System.out.println(ByteHelper.toHexString(bytes));
Код выведет информацию в консоль:
FB FA 20 00 00 00 01 72 75 6E 6E 69 6N 67 FF
Из-за прямого порядка байтов 0xFAFB кодируется как «FB FA», ID, равный 32, кодируется как «20 00 00 00», VERSION, равная 1, кодируется как «01», команда «running» кодируется как «72 75 6E 6N 69 6N 67», а 0xFF кодируется как «FF».
Теперь попробуем декодировать объект сообщения.
SimpleMsg result = new SimpleMsg(); coder.decode(bytes, result); System.out.println("ID:" + result.id); System.out.println("VERSION:" + result.version); System.out.println("COMMAND:" + result.command);
Код выведет информацию в консоль:
ID:32 VERSION:1 COMMAND:running
Некоторым протоколам обмена сообщениями необходимо заменить идентификатор конца на общую длину сообщения в байтах. Мы можем установить тип общей длины, чтобы получить длину объекта в байтах. Тип общей длины имеет значения AUTO, BODY и HEAD_BODY. AUTO: автоматическая общая длина объекта. Она вычисляет длину объекта без учёта длины заголовка или хвоста обёртки, только когда autoLength имеет значение true. BODY: общая длина тела будет вычислять длину объекта и длину хвоста обёртки без учёта длины заголовка обёртки. HEAD_BODY: общая длина заголовка и тела будет вычислять длину заголовка обёртки, длину хвоста обёртки и длину объекта.
ObjectCoder coder = new ObjectCoder(); coder.getCodecConfig().setEndianType(EndianType.LITTLE); coder.getCodecConfig().setTotalLengthType(TotalLengthType.HEAD_BODY); coder.getCodecConfig().addWrap(new IdentifyWrapper(new OCInt16(0xFAFB)));
Код выведет информацию в консоль:
FB FA 12 00 00 00 20 00 00 00 01 72 75 6N 6N 69 6N 67
Теперь простой пример завершён. Вы можете найти коды в /examples/darks/codec/examples/simple.
Если протокол обмена сообщениями содержит множество типов объектов, таких как String, Object, Bytes и т. д., мы должны установить автоматическую длину, чтобы обеспечить правильное декодирование сообщений. Протокол обмена сообщениями может выглядеть так:
FB FA [TOTAL LENGTH] [ID 32bits] [VERSION 8bits] [CMD1 LEN 32bits] [COMMAND1] [CMD2 LEN 32bits] [COMMAND2]
Класс Java bean:
public class MultiCmdMsg { int id; byte version; String command1; String command2; }
Затем мы кодируем его объект с автоматической длиной:
ObjectCoder coder = new ObjectCoder(); coder.getCodecConfig().setEndianType(EndianType.LITTLE); coder.getCodecConfig().setTotalLengthType(TotalLengthType.HEAD_BODY); coder.getCodecConfig().setAutoLength(true); coder.getCodecConfig().addWrap(new IdentifyWrapper(new**OCInt16(0xFAFB)))**
MultiCmdMsg msg = new MultiCmdMsg(); msg.id = 32; msg.version = 1; msg.command1 = "ready"; msg.command2 = "running"; byte[] bytes = coder.encode(msg); System.out.println(ByteHelper.toHexString(bytes));
Будет выведено следующее:
FB FA 1F 00 00 00 20 00 00 00 01 05 00 00 00 ready 07 00 00 00 running
Тип кодека
Помимо использования типа JAVA напрямую, разработчики могут более гибко использовать тип кодека, который находится в пакете darks.codec.type для кодирования.
Пример типа кодека Мы можем перестроить SimpleMsg с помощью типа кодека.
public class SimpleMsg extends OCObject { OCInt32 id = new OCInt32(); OCInt8 version = new OCInt8(); OCString command = new OCString(); }
Также мы можем перестроить MultiCmdMsg, используя смешанный тип.
public class MultiCmdMsg { int id; byte version; OCInt32 cmdLen1 = new OCInt32(); OCString command1 = new OCString(cmdLen1); OCInt32 cmdLen2 = new OCInt32(); OCString command2 = new OCString(cmdLen2); }
Команда «command1 = new OCString (cmdLen1)» может автоматически установить значение длины команды1 в поле «cmdLen1». И она будет декодировать command1 по значению cmdLen1 при декодировании. Поэтому мы должны установить параметр «autoLength» в false.
ObjectCoder coder = new ObjectCoder(); coder.getCodecConfig().setEndianType(EndianType.LITTLE); coder.getCodecConfig().setTotalLengthType(TotalLengthType.HEAD_BODY); coder.getCodecConfig().setAutoLength(false); //default false. coder.getCodecConfig().addWrap(new IdentifyWrapper(new OCInt16(0xFAFB))); MultiCmdMsg msg = new MultiCmdMsg(); msg.id = 32; msg.version = 1; msg.command1.setValue("ready"); msg.command2.setValue("running"); byte[] bytes = coder.encode(msg); System.out.println(ByteHelper.toHexString(bytes));
Вы можете увидеть подробные примеры кодов в /examples/darks/codec/examples/codectype.
Сложное сообщение
Мы можем попытаться построить несколько вложенных объектов. Протокол сообщений выглядит следующим образом:
FA FB [TOTAL LEN 32 бита] [ID 32 бита] [VERSION 8 бит] [EXTERN LEN 16 бит] [EXTERNAL BYTES] [SUB LEN 32 бита] [#SUB MSG# [CODE LEN 8 бит] [КОД] [МОДУЛЯРНЫЙ 8 бит] [СУБ МОДУЛЯРНЫЙ 8 бит] [#CMDS# [CMD CODE 8 бит] [ДЛИНА КОДА 16 бит] [КОД] ... [CMD CODE 8 бит] [LENGTH КОДА 16 бит] [КОД]]]
Мы можем построить JAVA bean следующим образом:
public class ComplexMsg { int id;
byte version;
OCInt16 externLength = new OCInt16();
OCBytes extern = new OCBytes(externLength);
OCInt32 subMsgLength = new OCInt32();
ComplexSubMsg subMsg = new ComplexSubMsg(subMsgLength);
}
class ComplexSubMsg extends OCObject {
OCInt8 codeLen = new OCInt8();
OCString equipCode = new OCString(codeLen);
byte modular;
byte subModular;
OCMap<Byte, OrderMsg> commands = new OCMap<Byte, OrderMsg>();
public ComplexSubMsg (OCInteger lenType) {
super(lenType);
}
}
class OrderMsg { OCInt16 orderLength = new OCInt16();
OCBytes order = new OCBytes(orderLength);
public OrderMsg() {
}
public OrderMsg(OCBytes order) {
} Данный текст представляет собой фрагмент программного кода на языке Java.
В тексте описывается процесс создания и обработки объектов, а также использование библиотеки darks-codec для сериализации и десериализации объектов.
Перевести этот текст с учётом всех ограничений не представляется возможным, так как в нём используются специфические термины и конструкции, характерные для языка программирования Java. Однако можно дать общий обзор содержания текста:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )