2

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

还有一个问题:“在 DDS 中发布是否有任何内存限制?”

4

3 回答 3

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 实现,因此我包含了用于定义 key 属性的语法,以便它可以与多个实现一起使用。

在您的应用程序中,您必须实例化类型并填充成员的值。这看起来像

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

contents属性将是一个字节数组。内容填写完毕后,只需调用writea 上的方法BinaryFileDataWriter,与其他示例类似。

除了配置的共享内存的限制之外,以这种方式分发的文件的大小没有真正的限制。但是,最好对大小施加限制,这就是BinaryContentsType类型中的序列有界的原因。

你没有提到你使用的是什么编程语言,所以很难给出任何编码细节。但是由于您提到您确实开始使用基本类型,因此应该很容易弄清楚如何发布该BinaryFileType类型,特别是如果您查看提供的文档和示例并将其应用于您自己的类型。

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

于 2012-07-12T01:37:11.597 回答
0

但真正的问题是——为什么?通过 DCPS 传输不透明数据是一回事,但整个文件呢?不是有几个更适合这个的协议吗?您是否将大量文件保存在内存中,以至于您认为文件传输类似于 IPC?我的回答是寻找 FTP、NFS、SSHFS、SMB 或 HTTP。所有这些都可以与您的 DDS 流量和平共存,您可能会发现使用 DDS 进行文件传输没有任何净收益。

根据问题,Reinier 的回答是正确的。(顺便说一句,您真的应该考虑接受一些答案——您有两个出色的答案!您可能不会让任何人回答您的下一个问题)。

于 2012-07-13T01:41:52.347 回答
0

One benefit that DDS can bring to sending files is for the case where you want to send a file to multiple recipients. Through the use of a reliable protocol built on top of UDP with Multicast enabled, you can then send the file to several recipients at the same time without incurring the bandwidth usage to perform multiple file transfers.

于 2013-11-12T16:35:32.273 回答