技术团队和市场营销团队在处理物联网(IoT)项目时,迟早会管理一个需要在设备群与云端之间建立数据流的项目。这些数据至关重要,因为市场营销部门希望为用户提供更多功能,业务团队需要数据驱动的决策,而技术团队则致力于优化与现有设备群的连接。所有这些原因都围绕着改善客户体验这一共同目标。这篇博文讨论了物联网项目的初始阶段,以及设备和云端之间可用的一些通信选项。它还根据您的需求和项目约束,提供了选择通信方法的具体指导。本文介绍了物联网项目的通信替代方案,从众所周知的解决方案到不太标准的方法。它将帮助您为项目选择合适的通信服务,并避免一些可能损害成本、范围和持续时间的常见错误。
IoT设备与设备数据
在我开始从事物联网项目之前,我对物联网持有一种以设备为中心的观点。连接设备是通过传感器和执行器与现实世界交互的关键物联网组件。然而,它只是解决方案的一部分——另一部分是数据。在一些项目中,您只需要设备数据。对于大多数物联网项目来说,第一次技术讨论通常集中在数据将如何在设备和云端之间流动,以及需要哪些通信协议。解决方案需要什么通信协议?通常,这取决于具体情况。通过我在不同项目、原型和行业的工作经验,我了解到您不必只使用一种协议。为每个项目选择合适的通信协议可能是一个探索之旅。确定协议的关键是将讨论分解为以下四个系统约束:
- 设备:设备有哪些物理限制,例如内存、可用通信接口、计算能力和功耗?
- 数据:设备上收集了哪些不同类型的数据?每种类型的数据收集了多少(容量)?数据流是双向的还是单向的?
- 成本:每种类型的数据传输成本是多少?将数据尽快传到云端是否值得付出这个成本?
- 安全:仅仅从设备发送和接收数据是不够的。通信需要通过支持身份验证、授权、验证和隐私策略的安全方法来管理。安全能力必须作为分析和选择通信协议时的基本要求来考虑。
注意:本文讨论的每种通信协议都可以实现不同的身份验证机制,例如 X.509 证书、自定义授权器和联合身份验证。
MQTT协议
MQTT 是物联网项目的标准消息传递协议。MQTT 是一种双向、轻量级且可扩展的协议。它也是一个高级应用层协议(类似于 HTTP,但具有不同的特性),并且得到许多库和编程语言的广泛支持。 MQTT 遵循发布-订阅通信模型,其中代理协调与客户端的通信。基本的 MQTT 消息包含两个主要组件:主题,它是消息内容的层次标识;以及有效负载,它可以以不同的格式提供,包括 JSON、二进制或文本。 如果项目需要一个通信通道来在设备和云端之间发送和接收消息,MQTT 非常合适。使用 MQTT,您可以将数据或设备状态发送到云端,并接收来自云端的请求和消息。在保持简单灵活设计的同时,MQTT 提供了可以简化软件应用程序的本机功能。例如,适当的主题层次结构设计可以有效地控制设备可以发布或接收的消息。有关更多信息,请参阅 为 AWS IoT Core 设计 MQTT 主题。 AWS IoT Core 服务支持 MQTT、MQTT5 和 MQTT over WebSocket 协议。AWS IoT Core 还充当 MQTT 代理,并将设备视为客户端。AWS IoT Core 功能提供了广泛的其他关键功能和服务。例如,它提供了实现设备自动配置以及基于设备类型、属性和标签控制和管静态或动态设备组(任务)的机制。AWS IoT Core 还支持从单设备操作过渡到组织和管理设备群。
数据流与MQTT
来自设备的 MQTT 消息通常包含设备测量值、状态、事件、控制数据或配置数据。该协议足够灵活,可以在同一条消息中包含一个或多个数据有效负载。例如,一条消息可能包含一个单一事件。或者,有效负载可能是一个 JSON 对象,其中包含特定时间点的异构设备测量值和设备状态。在其他情况下,基于流的通信可能比管理多条消息更可取。一个常见的用例与存储在设备非易失性存储器中的本地数据或缓存数据有关。设备可能会定期发送这些数据,或者根据请求按需发送。流也常用于发送大量的近实时数据。例如,发送来自不同设备的原始测量数据以在云端进行处理和分析。 Amazon Kinesis 服务支持数据或视频流的摄取、处理和分析。一个常见的用例是将数据从设备流式传输到 Amazon Kinesis Data Streams。有关更多信息,请参阅 使用 AWS IoT Core 和/或 Amazon Kinesis 从设备摄取数据的最佳实践。这两个通信通道通常在同一设备上使用,以满足与云端通信的不同需求。
仅发送消息模式
有些项目需要一个轻量级的、从设备到云端的单向通信层。由于应用程序、设备或项目的限制,并非总是能够在设备和云端之间建立双向通信。通信层也可能以这种方式实现,因为系统是由第三方开发的,可能无法添加新功能。 双向通信通常用于设备发送状态更新或测量值,而云端返回确认的情况。您可以使用不同的服务来支持物联网上的这种单向模式,例如 AWS IoT Core、Amazon API Gateway 或 AWS AppSync。由于这是一种仅发布协议,设备必须轮询云端数据更新。这意味着像设备断开连接检测这样的功能需要额外的工作量来实现,不像其他协议中这些功能是内置的。 当 MQTT 不可行时,可以使用 HTTPS 协议,并且可以利用消息响应来接收来自云端的数据。一旦数据进入 AWS,您可以使用超过 200 种 AWS 托管服务来处理、分析数据并为数据注入智能。
在设备上接收静态数据
设备或设备群可能需要从云端读取静态或半静态数据。例如,配置设置或软件更新。如果应用程序已经实现了 MQTT 协议,MQTT 影子是读取相对较小的静态数据(如配置)的有效过程。有关更多信息,请参阅 AWS IoT Core 消息代理和协议限制与配额。 对于可能包含版本号或状态以指示固件更新的大型文件,您可以直接从 Amazon Simple Storage Service (Amazon S3) 下载数据。
没有设备的物联网项目(罕见用例)
直接处理物联网设备并不总是可行的。即使您的目标是构建一个管理多个设备的物联网云应用程序,一些限制也可能使情况变得更加复杂。例如,当:
- 现场现有设备无法更新,或者更新它们需要太多的开发工作。
- 当前的设备通信功能不应更改,因为现有系统依赖于它们。
- 可能涉及第三方设备。这可能包括具有专有控制系统、专有通信协议或您的团队无法修改的封闭系统的设备。
如果您的目标是评估可行性和系统的概览,您应该开发一个物联网云基础设施和应用程序原型。这可以利用现有的设备遥测数据和控制功能。您可能会考虑两种不同的策略来实现此方法:
- 实现云到云的通信解决方案。
- 在现有设备 API 上开发一个包装器。 使用云到云通信的优点是能够将现有解决方案与新的开发隔离。您还可以使用不同的应用程序协议来传输设备遥测数据,并允许您控制数据。您可以利用 Amazon Virtual Private Cloud (Amazon VPC) 在现有应用程序和新应用程序之间建立虚拟网络。使用这种通信方法可能非常高效。例如,接收一组设备的测量值和状态。缺点是 Amazon VPC 需要额外的精力来管理设备。如果设备是第三方的,则需要共同开发,这可能是一个障碍。 第二个选择是通过使用 Amazon API Gateway 来开发一个包装器,并利用外部系统已有的可用 API。一个典型的用例是与 REST 或 WebSocket API 通信时。对于第三方 API,您可以考虑安全保护措施,以限制每秒、每分钟或每天的请求数量。这些都是需要注意的一些限制,因为它可能会限制您的可扩展性。
结论
物联网的优势之一在于其通信、数据存储及其在边缘做出决策的能力。处理物联网项目的一种方法是从设备(物)开始,然后根据设备能力进行设计。在这篇博文中,我们探讨了一种基于以数据为中心的模型的不同方法。首先关注数据有助于您设计更具成本效益的解决方案。您还可以使用不同的通信协议获取这些数据,并提供符合项目目标和限制的解决方案。