在打开的拼接DDS中发布文件

时间:2012-07-11 10:17:55

标签: data-distribution-service

我已成功创建了一个包含基本类型的发布者和订阅者。现在我在尝试将文件(如xml,txt,视频,音频等)发布到DDS时遇到问题。我不知道如何在IDL文件中指定类型以及如何将整个文件发布到DDS(以及如何在订阅者端接收文件)。

还有一个问题:"在DDS中发布是否存在内存限制?"

3 个答案:

答案 0 :(得分: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类型,特别是如果你看一下提供的文档和示例并将其应用到你自己的类型

作为旁边的注释,您确定要分发完整的文件吗?根据具体情况,更好的方法可能是分析文件内容的结构并创建与之匹配的数据模型。您将在发布者端读取文件并将其转换为有意义的数据项而不是blob。这样,订阅者可以利用更高级的数据管理功能,例如通过仅订阅可用主题的子集来订阅内容的子集,或者通过使用基于内容的过滤器。这是否有意义取决于您的用例。

答案 1 :(得分:0)

但真正的问题是 - 为什么?通过DCPS传输不透明数据是一回事,但整个文件?是不是有几个协议更适合这个?您是否在内存中保留了大量文件,以便考虑类似于IPC的文件传输?我的答案是寻找FTP,NFS,SSHFS,SMB或HTTP。所有这些都可以与您的DDS流量和平共存,并且您可能看不到使用DDS进行文件传输的净收益

根据这个问题,Reinier的答案是正确的。 (顺便说一句,你真的应该考虑接受一些答案 - 你有两个未完成的答案!你可能不会让任何人在SO上回答你的下一个问题。)

答案 2 :(得分:0)

DDS可以为发送文件带来的一个好处是,您希望将文件发送给多个收件人。通过使用基于UDP并启用了多播的可靠协议,您可以同时将文件发送给多个收件人,而不会占用带宽来执行多个文件传输。