在不同平台之间发送大量数据的好方法是什么?

3
我们需要在非常不同的软件组件之间发送数据(从嵌入式设备到Web服务)。由于各种原因(将Mosquitto编译到最困难的平台上是其中最小的原因之一),我们决定使用MQTT消息代理协议。这是一种相当轻量级的协议,为要发布的消息提供了一个应用程序定义的有效载荷。现在我们需要找到一种方法指定该有效载荷中的数据。
目前的想法是使用一些现有的IDL,它提供了至少可以访问来自C ++Java的数据的能力,最好还包括Python和其他语言。如果这会带有编码/解码 API,可用于将数据序列化到MQTT协议的有效负载中,以及将其反序列化出来,则这将是理想的。

有类似的东西吗?

注意:

  • 将会有大量的数据。实际上,为了避免网络拥塞,我们可能需要从当前规格中削减它。XML格式可能对此过于冗长。
  • 格式应易于编码和解码,因为在嵌入式平台上,CPU共享是宝贵的。(这可能是不发送XML的另一个原因。)
  • 如果用于此的任何组件(IDL编译器等)不是跨平台的,则应在Windows上运行。
  • 我不是网络专家。如果IDL是上个十年的事情,技术已经发展,有更好的方法在网络上在平台之间传输数据,请建议。

JSON怎么样?它是纯文本,而且很容易解码。 - r4phG
我不是IDL在项目中增加的复杂性的忠实拥护者。我使用XML和JSON文档/对象跨网络链接,并在某些情况下使用自定义二进制封装数据和压缩以提高效率。易于处理版本控制。现在我更倾向于使用JSON,因为它在与基于Web的技术进行通信和呈现时易于使用。JSON可能比XML稍微“低调”一些,但并没有显著差异。解析器和编码器在面向对象的代码中很容易处理,只需使用简单的库即可。 - mark
@r4phG:我不知道。我还没有需要使用JSON,但据我所知,它可能可用于任何语言/平台。但我担心文本协议会生成太多字节并且解析时间太长。你怎么看? - sbi
好的,正如@Mark所提到的,它比XML少了一些冗长,但仍然是跨平台和易于使用的。但我不太清楚在你的情况下“太多字节”的限制是什么 :) - r4phG
@r4phG:目前我们已经获取了足够的数据,限制我们生产的数量的因素是机器处理数据和将数据快速写入本地闪存的能力。您还需要考虑到我们想要跨越的某些网络在高EMI环境下运行,其中一些可能会阻止GB以可靠的方式运行以太网。此外,在具有RT OS的嵌入式设备上解析JSON将消耗多少CPU百分比,该操作系统必须安排高优先级任务(通过工业总线获取数据)并具有单位数字ms周期? - sbi
@sbi 好的,我明白了。但是,即使你找到了一些更小的东西,如果它带有XML/JSon或其他内容,我想体积的损失也不会很明显。所以你的带宽问题可能很难解决。对于解析问题,与其考虑需要解析的数据量,不如考虑如何通过计算数据来减轻CPU使用率?(线程/将数据切分为独立部分...)。我不是专家,只是试图提供一些想法,因为这个主题很有趣。 - r4phG
3个回答

2
您可以使用Google协议缓冲区(本质上这是一种带有更少开销的“二进制”XML)。
据我所知,存在C++、Java和Python库。
对于嵌入式C++系统,您可以使用NanoPb实现,它是纯C代码的轻量级Google协议缓冲区实现(我们目前在我们的嵌入式系统中使用该库)。
请参阅https://developers.google.com/protocol-buffers/

那个协议缓冲区的东西看起来很有趣。我目前正在研究它。 - sbi
这是我们一直走的路线。感谢您指出这一点! - sbi

1

谢谢。我还没有充分了解Apache Thrift。Cap'n Proto看起来非常有趣,但是它需要C++11(我们不在所有平台上都有)。在MessagePack中,就像其他非编译数据描述语言(如JSON)一样,所有数据都是动态类型。(这使得它与比较CPU密集型的工作相比较,因为它需要从字符串转换。) - sbi

0

我曾经搜索过WebService的哲学,希望能够生成首选代码(定义)->服务器服务代码(定义)->服务客户端(之前已经测试了从WSDL生成SOAP客户端)。通过这种方式,我发现了Apache Thrift(顺便说一句,Thrift IDL编译器是Windows应用程序)。我从未实际接触过IDL的CORBA,只是读了一些资料。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接