如果我想在家里自动执行日常任务,最好使用 IRC 而不是 Web 服务?我在谷歌搜索并没有找到任何比较术语。
我可以使用 IRC 协议而不是 HTTP 与设备通信吗?它的优点和缺点是什么?
IRC 和 HTTP 都没有真正优化用作物联网协议(尽管理论上可以使用它们)。
什么使协议适用于物联网?
很难说一大类设备有什么意义,但许多物联网设备都是小型的、功率受限的微控制器。为了减少资源使用(功率、内存等),一个好的协议倾向于发送和接收尽可能少的数据。例如,一个MQTT PUBLISH数据包可以有 4 个字节的开销(以及主题字符串和有效负载)1。
另一方面,HTTP 请求往往相当重要:
今天的请求标头大小从~200 字节到超过 2KB 不等。随着应用程序使用更多 cookie 和用户代理扩展功能,700-800 字节的典型标头大小很常见
— SPDY 白皮书
其中大部分是为 Web 设计的,因此有许多不需要的功能(基本物联网设备不一定需要使用大量标头)。
服务器能够将数据推送到其客户端有时也很有用。HTTP 不容易支持这一点(您通常会轮询信息);IRC 确实如此,它是一种聊天协议。
请求模型
正如我之前所暗示的,通常 HTTP 请求是由客户端(即 IoT 设备)发起的,服务器会以任何新信息进行响应。但是,如果您的客户对收听新信息感兴趣……它只需要不断询问服务器。如果消息需要快速到达 IoT 设备,您可能需要每隔几秒轮询一次。这显然是相当浪费的,尤其是当您每次发送近 1 千字节的标头时。为小型 IoT 设备供电的小型AA 电池不会持续很长时间。
IRC 好一点,它是一个聊天协议。您可以加入频道,基本上是订阅来自那里的任何通知。但同样,你会得到很多你可能不需要的垃圾。IoT 设备可能对操作系统或 IRC 支持的所有其他花哨功能(例如CTCP 和 DCC)不感兴趣。这只会增加复杂性,使用更多带宽,并且浪费开发人员实施它的时间。
物联网替代品
有各种协议试图成为两种模型的“物联网等价物”:
1:我在这里有点欺骗你,因为使用 TCP 也有开销。但是IRC、HTTP和MQTT都使用TCP,因此使用这些协议中的任何一个都无法避免TCP带来的开销。
对的,这是可能的。我以前做过,并且有一些(但不是很多)使用 IRC 是个好主意的情况。
我多年前做过的一个示例部署是一个旧工厂的监控系统(虽然并不重要)。整个建筑物安装并部署了大约 30 个传感器,每个传感器只是将数据转储到专用的 IRC 通道中。对特定传感器输出感兴趣的人加入了频道,并在那里进行了对话,讨论了传感器输出值和案例。
使用 IRC 的主要优势是重用现有的基础设施——整个工厂使用 IRC 作为内部通信工具,并设置了两台服务器 IRC 网络。每个人都有一个 IRC 客户端并且知道如何使用它。而且我们不允许设置更多服务器,因此必须处理那里的内容。
我还发布了可用于此目的的IRC 客户端通信库。
另一方面,与 HTTP 相比,IRC 有许多明显的缺点:
实现更复杂的协议:
- 与无状态的 HTTP 不同,它是有状态的。这意味着您需要更多 RAM 来保持状态,并且您需要与服务器保持持久的 TCP 连接。
- 它没有那么简单,基于事件的代码没有很好的文档记录,并且在不同的 IRC 服务器上实现方式不同。很多时候你根本不知道什么是“标准行为”。
- 没有加密或正确的身份验证。不过,人们确实用 SSL 包装了 IRC。并且有各种身份验证黑客(即 nickbot),但这不是标准的一部分。
- 各种硬编码限制(例如,最大消息长度取决于 IRC 服务器,并且可能因服务器而异)。
与 HTTP 相比,它更受限制:
- 没有正确的方法来传输二进制数据,因为它是基于文本的协议。需要你处理UUE或base64等传输编码。
- 如果不使用 DCC,就无法传输大量数据(甚至 100k+),这需要客户端能够建立直接连接。
这些限制严重到使使用 IRC 毫无意义,除非 - 就像我的情况 - 您正在集成到已经基于 IRC 的环境中。
再概括一点,物联网有一些一般约束/特征,它们将适用于许多但并非所有用例:
- 可能有很多端点
- 通过不安全或可监听的传输层进行通信
- 需要处理部署和固件升级
- 经常处理有价值/敏感的数据
- 自动化消息传递,通常是小而快速的有效载荷
- 能量敏感有效载荷(清道夫或电池供电)
在 IoT / 功能是某些预先存在的功能的扩展的情况下,通常会有特定于应用程序的因素来驱动协议的选择。通常,开发人员最初会使用熟悉的协议设计产品,并计划在以后的修订中迁移到更优化的协议(上市时间胜过优化设计,尤其是在新兴市场)。
这使得“我可以使用此协议吗”以及“我应该使用此协议吗”与“这是此应用程序的最佳协议”或什至“此协议提供的改进是否值得迁移成本”的问题略有不同。 '