XMPP 对于 IoT 设备发送短而频繁的消息是否有很大的开销?

物联网 沟通 联网 xmpp
2021-06-27 00:25:01

我一直在阅读有关 XMPP 作为 IoT 设备的潜在通信协议的文章,但是在阅读了一个来源之后,如果您担心每条消息的开销,我不确定它是否真的是一个合适的协议。

该消息来源指出:

但是,XMPP 有许多问题,使其对于嵌入式 IOT 协议而言有些不受欢迎。作为基于 XML 的协议,XMPP 非常冗长,甚至比 HTTP 还要冗长,并且数据开销很大。从 IOT 连接设备向服务器发送一个字节的数据的单个请求/响应交换超过 0.5 kB。

有一个规范草案将使用称为高效 XML 交换 (EXI) 的 XML 编码来压缩 XMPP。但即使使用 EXI,同样的一字节数据仅从 XMPP 就获得了数百字节的协议开销。EXI 也是一种比现在可用的其他选项更难处理的格式。由于这些固有问题,一般建议避免在嵌入式 IoT 应用程序中使用 XMPP。

然而,XMPP宣传自己适用于物联网应用程序(虽然它没有具体说它是低开销的),因此为物联网设备推荐/推广如此庞大、看似冗长的协议似乎很奇怪。

对于少量数据,XMPP 的开销真的像来源建议的那样大吗?例如,发送 8 字节消息时会有多少开销?

此外,如果使用EXI压缩(如源中所述),开销是否如此之大这也会带来一些陷阱吗?

3个回答

虽然可以公平地说 XML 是冗长的,但应该认识到这种冗长并不完全是与内容相关的“开销”,因为它封装了语义;任何强调动态而不是静态结构的协议的症状都是开销。例如,HTML 实际上是一种轻松的 XML 形式,它以动态结构传达内容,该结构可以被视为内容的一个方面。您可以将表格的内容与表格本身区分开来,但内容是具有特定关系的表格数据这一事实是内容不可或缺的;如果我只是把每个单元格作为一个长字符串传输,那么结构和那些关系就消失了,所以我丢失了信息,这不是内容吗?

让我们考虑可能构成一些表格数据的 8 字节消息。如果我使用一个非常静态的协议,我可以在没有额外开销的情况下至少通过定义这样的协议来传输它:

  • 每条消息正好是 8 个字节,因此我们不需要指明长度或包含任何终止序列。
  • 8 个字节始终用于引用 2 x 2 网格,其中每个单元格包含一个 16 位值。

如果我所有的消息都完全如此,那么使用 XML、HTML 或 XMPP 可能会被认为是愚蠢的——我在总是相同和预先确定的结构组件上浪费带宽,并且在创建和解析它的两端浪费相应的计算时间。一个仅包含一个 2 x 2 表格且每个单元格中有几个字符的最小的、合适的 HTML 页面可能至少有 100 个字节,以适应格式和协议开销。

但是,如果不是我的所有消息都完全如此,那么指定它是哪种消息可能不是“有效负载”的文字部分,但它是内容方面的必要组成部分。我只需要额外的两个字节就可以做到这一点,并引入更多的活力:

  • 消息现在是可变长度的,0-255 个字节,第一个字节表示长度。
  • 对于不同的预定义消息类型,有(最多)256 个代码,其中之一是“2 x 2 表”,即第二个字节。

现在,我的 8 个字节的表内容需要 2 个字节的开销,但是在使用此自定义协议可以发送哪些类型的消息方面存在更广泛的可能性。

它仍然远不及 HTML 页面或XML 命名空间规范(或其集合,这就是XMPP 本质上是什么的可能性

因此,基于此,如果您所做的主要是发送简单的 8 字节消息,那么 XMPP 可能有点矫枉过正。然而,不一定那么多。声称“从 IoT CONNECTED DEVICE 向服务器发送一个字节的数据的单个请求/响应交换超过 0.5 kB”在我看来,瞥一眼相关的 RFC,是潜在的夸大其词(但请注意,所有我只是瞥了一眼,我从未实现或使用过 XMPP)。我不怀疑你可以构建一个这样的例子,但这可能不是一个最小的例子。

由于该协议是面向 TCP 的,如果我们正在做一次性的事情,建立“一个由 'jabber:client' 命名空间限定的 XML 流”只需要被视为消息的一部分——设备联系服务器发送 8 个字节,发送数据,断开连接。如果这种关系更加持久(通常在 IoT 环境中),那么我们可以假设设备已经与目的地建立了连接。在这种情况下,如果消息的最终目的地是服务器(而不是服务器要将消息传递到的另一个客户端),那么协议开销可能是最小的。

<message><body>8 bytes.</body></message>

微不足道的 33 个字节的“开销”。值得指出的是,XML 是文本,因此如果您的消息通常是二进制的,那么它就会变得不太合适,因为需要对数据进行编码(例如,到base64),这会增加额外的开销和计算要求。

所以,最终:

XMPP 对于 IoT 设备发送短而频繁的消息是否有很大的开销?

如果存在持久连接并且消息在很大程度上是非结构化的,我不这么认为。但是,如果您不需要它提供的东西(结构方面的活力),那么可能有更合适的方法。

追求这一点,如果我们有一个上下文,其中单个中央服务器正在处理和/或依赖各种设备之间的消息,即使这些设备中的任何一个可能总是简单明了,一个协议可以封装各种消息仍然有用。如果客户端设备的资源有限,我们可以对大部分协议进行硬编码,并且包装来自该端的每条消息成为一项非常简单的任务;我相信许多部署 HTTP 服务器的物联网设备都会这样做(这与“简单客户端,复杂服务器”相反)。这些服务器不能处理任何类型的 HTTP 请求(除非通过预先格式化的拒绝),并且有一个非常明确的、集中的事情将要做的事情和他们将发送的响应,但由于它们仍然作为 HTTP 服务器正常运行,

首先,我应该说 XML 已被用于封装实时消息,并取得了一些成功,而且规模很大,特别是用于在 XMPP 中进行 IM 和在线状态的通信。似乎也有一些公司打算利用他们的 XML 知识来尝试为这个数据表示系统寻找另一个应用领域。

然而,并不是每个人都相信 XML 是消息系统中一切问题的答案。例如,近年来出现了明显的转变,在线系统使用 JSON 而不是 XML 作为序列化数据的方式,如果我暂时戴上我的开发人员帽子,我会说从本机编码/解码的工具表示(例如在 Python、PHP、Javascript 中)似乎比 JSON 比 XML 的等价物更容易使用,即使 XML 有更多的时间来获得正确的答案。

XML 是计算机难以处理的表示,因为它需要一个相对复杂的文本解析器,然后是某种分层表示,以允许在程序中提取其数据。因为涉及的文本太多,您需要相当多的内存用于编码/解码。

通常似乎不清楚 XML 为数据的表示增加了多少价值:如果核心消息不是很深的层次结构,那么添加大量文本碎片似乎是不必要的,但矛盾的是,如果有很多层次结构,那么从它的文本表示将是一项艰巨的工作,需要大量资源。此外,我不清楚用文本表示的好处:当我们第一次编写和调试通信系统时,通常会使用监视/解码工具(例如 Wireshark)来帮助我们找出问题所在。从长远来看,一切正常,没有人需要仔细查看来回传递的消息(只有计算机)。计算机更喜欢二进制表示。文本表示在部署的任何阶段都不会使任何人受益。

XML 对人类来说难以阅读(和手动构建),同时对计算机来说也是一项艰巨的工作;因此,它是一个既不适合计算机也不适合人类的系统。

重要的是,物联网有一些特殊的限制,使其变得高效。IoT 设备通常具有有限的处理能力和存储(通常没有大规模的二级存储,只有一些 RAM 和 EEPROM)。物联网设备可能拥有最简单的通信链接,甚至可能没有 TCP/IP 堆栈。将会有各种各样的微控制器设计,甚至不会达到使用标准操作系统(例如 Linux、Android)的复杂程度;这限制了提供易于使用的 XML 接口的现成工具的数量。

总而言之,我怀疑对于物联网,数据表示最好根据具体情况而定,具体取决于硬件限制、通信方式(例如广播、数据报、可靠等)、通信频率等。XML 当然不应该被认为是物联网的必要条件

  1. 许多年前我确实分析了使用的差异

    支付网络中的XML用于支付交易表示(卡号、日期、时间、终端 ID 和附加元素列表)与传统的比较

    位图ISO8583

  2. XML 有巨大的开销。如果您考虑对具有 10000 多个节点的网络的影响,每个节点每小时/每天向中央主机发送 10 多条消息,那么 XML 就会消失,您确实需要更高效的东西。