Публикация файлов в открытом DDS сплайсинга

Я успешно создал издателя и подписчика с примитивными типами. Теперь у меня возникла проблема при попытке опубликовать файл (например, XML, TXT, видео, аудио и т. Д.) В DDS. Я не знаю, как указать типы в файле IDL и как опубликовать весь файл в DDS (а также как получить файл на стороне подписчика).

И еще один вопрос: "Есть ли ограничения памяти для публикации в DDS?"

3 ответа

Решение

Существует несколько способов распространения файла с использованием DDS. Наиболее простым (но не обязательно лучшим) является использование последовательности октетов (байтов) для захвата содержимого файла. Это может быть достигнуто определением IDL следующим образом:

const long MAX_NAME_LEN = 128;
const long MAX_FILE_SIZE = 100000;

typedef string<MAX_NAME_LEN> NameType;
typedef sequence<octet,MAX_FILE_SIZE> BinaryContentsType;

struct BinaryFile {
    NameType name; //@key
    BinaryContentsType contents;
};
#pragma keylist BinaryFile name

Поскольку ваш вопрос не является специфическим для OpenSplice DDS, но может быть применен к любой реализации DDS, я включил синтаксис для определения ключевого атрибута так, чтобы он работал с несколькими реализациями.

В вашем приложении вам нужно будет создать экземпляр типа и заполнить значения членов. Это будет выглядеть примерно так

BinaryFile instance = new BinaryFile();
instance.name = "SomeFileName";
// fill instance.contents by reading file into array of bytes.

contents Атрибут будет массивом байтов. После того, как содержимое было заполнено, просто вызовите write метод на BinaryFileDataWriterаналогично тому, что делают другие примеры.

Не существует реального ограничения на размер файла, распространяемого таким образом, кроме ограничений общей памяти, как настроено. Тем не менее, это хорошая практика, чтобы наложить ограничение на размер, поэтому последовательность в BinaryContentsType тип ограничен.

Вы не упомянули, какой язык программирования вы используете, поэтому трудно дать какие-либо подробности кодирования. Но поскольку вы упомянули, что начали работать с базовыми типами, должно быть легко понять, как опубликовать BinaryFileType тип, особенно если вы посмотрите на предоставленную документацию и примеры и примените это к своему типу.

Как примечание на стороне, вы уверены, что хотите распространять полные файлы? В зависимости от ситуации, лучшим подходом может быть анализ структуры содержимого файла и создание модели данных, которая соответствует этому. Вы будете читать файл на стороне издателя и переводить его в значимые элементы данных, а не в блоб. Таким образом, подписчики могут воспользоваться более продвинутыми функциями управления данными, такими как подписка на подмножество содержимого путем подписки только на подмножество доступных тем или использование фильтра на основе содержимого. Имеет ли это смысл, все зависит от вашего варианта использования.

Но настоящий вопрос - почему? Транспортировка непрозрачных данных через DCPS - это одно, а целые файлы? Разве несколько протоколов не подходят для этого лучше? Вы храните много файлов в памяти так, что считаете передачу файлов похожей на IPC? Мой ответ - поискать FTP, NFS, SSHFS, SMB или HTTP. Все это может мирно сосуществовать с вашим трафиком DDS, и вы, вероятно, не увидите никакой чистой выгоды от использования DDS для передачи файлов.

Ответ Рейнире правильный, согласно вопросу. (Кстати, вы действительно должны принять некоторые ответы - у вас есть два выдающихся! Вы можете не получить никого на SO, чтобы ответить на ваш следующий вопрос).

Одно преимущество, которое DDS может принести при отправке файлов, - это случай, когда вы хотите отправить файл нескольким получателям. Используя надежный протокол, построенный поверх UDP с включенной многоадресной передачей, вы можете отправить файл нескольким получателям одновременно, не используя пропускную способность для выполнения нескольких передач файлов.

Другие вопросы по тегам