用于与嵌入式设备之间传输数据的最有效格式

the*_*row 11 embedded parsing communication data-formats

我很难选择我的服务器和终端与之通信的格式.
我正在考虑:

  • JSON
  • YAML 太难解析了
  • CSV
  • Google Protobufs
  • 二进制打包/拆包(不使用cast/memset/memcpy来实现可移植性)
  • 某种形式的DSL
  • 您可能有任何其他建议

我的标准从最重要到最不重要的顺序排列:

  1. 哪个是最容易解析的?
  2. 哪个解析最快?
  3. 哪个字节最小?
  4. 哪个有可能拥有最可读的消息?
  5. 哪个有可能更容易加密?
  6. 哪个有可能更容易压缩?

编辑澄清:

  • 数据是双向传输的吗?是.
  • 什么是物理运输?以太网.
  • 数据是否格式化为数据包或流?两者但通常是包.
  • 端点有多少RAM?可能的最小量,取决于我选择的格式.
  • 你的数据有多大?尽可能大.但我不会收到庞大的数据集.
  • 终点是否有RTOS?没有.

pet*_*hen 5

关键因素是:

  • 你的客户有什么能力?(例如,您能否从架子上挑选一个 XML 解析器 - 由于性能原因而不排除其中的大部分?您可以即时压缩数据包吗?)
  • 您的数据的复杂程度如何(“平面”或深度结构化?)
  • 您需要高频更新吗?部分更新?

在我的经验中:

一个简单的文本协议(将自己归类为 DSL),其接口为

string RunCommand(string commandAndParams)
// e.g. RunCommand("version") returns "1.23"
Run Code Online (Sandbox Code Playgroud)

使许多方面变得更容易:调试、日志记录和跟踪、协议扩展等。为设备提供一个简单的终端/控制台对于跟踪问题、运行测试等来说是非常宝贵的。

让我们详细讨论限制,作为其他格式的参考点:

  • 客户端需要运行一个微解析器。这并不像听起来那么复杂(我的“微解析器库”的核心是 10 个函数,总共大约 200 行代码),但是基本的字符串处理应该是可能的
  • 写得不好的解析器是一个很大的攻击面。如果设备是关键/敏感的,或者预期在恶劣环境中运行,则实施需要格外小心。(对于其他协议也是如此,但是快速被黑的文本解析器很容易出错)
  • 高架。可以受混合文本/二进制协议或 base64(其开销为 37%)的限制。
  • 潜伏。对于典型的网络延迟,您不会希望发出许多小命令,某种批处理请求及其返回的方法会有所帮助。
  • 编码。如果您必须传输无法用 ASCII 表示的字符串,并且不能在两端使用 UTF-8 之类的东西,那么基于文本的协议的优势会迅速下降。

我只会在设备需要时使用二进制协议,设备处理能力非常低(例如,具有 256 字节 RAM 的 USB 控制器),或者您的带宽受到严重限制。我使用过的大多数协议都使用它,这很痛苦。

Google protBuf是一种使二进制协议更容易的方法。如果您可以在两端运行库,并且有足够的自由来定义格式,那么这是一个不错的选择。

CSV是一种将大量数据打包成易于解析的格式的方法,因此它是文本格式的扩展。但是,它的结构非常有限。只有当您知道您的数据适合时,我才会使用它。

XML/YAML/...我只会在处理能力不是问题、带宽不是问题或者您可以即时压缩并且数据具有非常复杂的结构时使用。JSON 在开销和解析器要求上似乎更轻一些,可能是一个很好的折衷方案。