跨平台发送大量数据的好方法是什么?

What's a good means to send lots of data across platforms?

提问人:sbi 提问时间:7/21/2015 更新时间:8/26/2015 访问量:132

问:

我们需要在非常不同的软件组件(从嵌入式设备到 Web 服务)之间发送数据。出于各种原因(事实上,我们让 Mosquitto 在最有问题的平台上进行编译,而不是其中最不重要的),我们决定使用 MQTT 消息代理协议。这是一个相当轻量级的协议,它为要发布的消息提供应用程序定义的有效负载。我们现在需要找到一种方法来指定该有效负载中的数据

目前的想法是使用一些现有的IDL,使其能够至少从C++Java访问数据,理想情况下还有Python和其他语言。如果这些平台的编码/解码 API 可用于将数据序列化到 MQTT 协议的有效负载中,并将其反序列化出来,这将是理想的选择。

有这样的东西吗?

注意:

  • 有很多数据。事实上,我们可能需要将其从当前规范中削减,以避免网络拥塞。XML 格式可能太健谈了。
  • 该格式应该易于编码和解码,因为在嵌入式平台上,CPU 份额很有价值。(这可能是不通过网络发送 XML 的另一个原因。
  • 如果所需的任何组件(IDL 编译器等)不是跨平台的,则它应该在 Windows 上运行。
  • 我不是网络专家。如果 IDL 是过去十年的事情,那么该技术已经向前发展,并且有更好的方法可以通过网络在平台之间移动数据,请继续提出建议。
Java C++ 跨平台 IDL

评论

0赞 r4phG 7/21/2015
JSon怎么样?它是纯文本,很容易解码
0赞 mark 7/21/2015
我不喜欢 IDL 给项目增加的复杂性。我跨网络链接使用 XML 和 JSON 文档/对象,并在某些情况下使用自定义二进制数据封装和压缩以提高效率。它很容易处理版本控制。我现在主要倾向于使用 JSON,以便于使用基于 Web 的技术进行通信和演示。JSON可能比XML稍微不那么“健谈”,但并不明显。解析器和编码器在面向对象的代码中很容易处理,具有简单的库。
0赞 sbi 7/21/2015
@r4phG:我不知道。我不需要使用 JSON,但据我所知,它可能几乎可以在任何语言/平台上使用。不过,我担心文本协议会生成太多字节,并且解析时间太长。你觉得怎么样?
0赞 r4phG 7/21/2015
好吧,正如@Mark提到的,它只是比XML少一点健谈,但它仍然是跨平台的,易于使用。但我真的不认为你的情况是“太多字节”的限制:)
0赞 sbi 7/21/2015
@r4phG:目前,我们获得了足够的数据,限制我们生产多少数据的因素是机器处理数据并将数据写入本地闪存的能力。您还需要考虑到,我们想要执行此操作的某些网络在高 EMI 环境中运行,其中一些可能会阻止 GB 以太网可靠运行。此外,在具有RT操作系统的嵌入式设备上,解析JSON将消耗多少CPU百分比,该设备必须以个位数的毫秒周期调度高优先级任务(通过工业总线获取数据)?

答:

2赞 Daniel 7/21/2015 #1

您可以使用谷歌协议缓冲区(本质上这是一种“二进制”XML,开销要小得多)。

AFAIK 存在 c++、java 和 python 库。

对于嵌入式 c++ 系统,您可以使用 NanoPb 实现,它是纯 C 代码中的轻量级 google 协议缓冲区实现(我们目前在嵌入式系统中使用该库)

查看 https://developers.google.com/protocol-buffers/

评论

0赞 sbi 7/21/2015
该协议缓冲的东西看起来很有趣。我目前正在阅读它。
0赞 sbi 9/11/2015
这是我们一直在走的路线。感谢您指出这一点!
1赞 Sergei Nikulov 7/21/2015 #2

您还可以查看 Apache ThriftCap'n'protoMsgpack

评论

0赞 sbi 7/22/2015
谢谢。我还没有充分研究 Apache Thrift。Cap'n Proto看起来非常有趣,但在C++中它需要C++11(我们并非在所有平台上都有)。在 MessagePack 中,与其他非编译数据描述语言(如 JSON)一样,所有数据都是动态类型的。(这使得它的 CPU 使用量相对较大,因为它需要从字符串转换。
0赞 Jacek Cz 8/26/2015 #3

我有搜索 Web 服务理念和首选代码生成(之前测试过来自 WSDL 的 SOAP 客户端生成)。通过这种方式,我找到了 Apache Thrift(顺便说一句,Thrift IDL 编译器是 Win 应用程序)。我从未与 IDL 的 CORBA 进行过实际接触,只阅读了很少的材料。(definition)->server service code(definition)->client of service

我的解决方案非常小,二进制协议的高速不是太重要,但 IDL 和许多生成的语言(包括古老的 Delphi)非常非常好。最初的主要语言是Java和C# - C++,Deplhi和动态语言是未来的选择。