如何使用带有 亚马逊云科技 IoT Core 的协议缓冲区构建智能应用程序

协议缓冲区简介

协议缓冲区(Protobuf)为序列化结构化数据提供了一种平台中立的方法。Protobuf 与 JSON 类似,不同之处在于它更小、更快,并且能够使用您首选的编程语言自动生成绑定。

亚马逊云科技 IoT Core 是一项托管服务,可让您连接数十亿 IoT 设备并将数万亿条消息路由到 亚马逊云科技 服务,从而使您能够将应用程序无缝扩展到数百万台设备。通过集成 亚马逊云科技 IoT Core 和 Protobuf,您还可以从 Protobuf 的精益数据序列化协议和自动生成代码绑定中受益。

通过生成 Protobuf 代码实现物联网的敏捷性和安全性

关键优势来自使用Protobuf的代码生成器进行软件开发的简便性和安全性。您可以编写架构来描述应用程序组件之间交换的消息。代码生成器( 协议 或其他)解释架构并使用您选择的编程语言实现编码和解码功能。Protobuf 的代码生成器维护良好并得到广泛使用,从而生成了经过实战考验的强大代码。

自动生成代码使开发人员无需编写编码和解码函数,并确保其在编程语言之间的兼容性。随着 亚马逊云科技 IoT Core 新推出的支持协议缓冲区消息格式的规则引擎 ,您可以在设备上运行用 C 编写的生产者应用程序,以及用 Python 编写的 亚马逊云科技 Lambda 函数使用器,所有这些都使用生成的绑定。

在 亚马逊云科技 IoT Core 中使用协议缓冲区而不是 JSON 的其他优势包括:

  • 架构和验证 :架构由发送方和接收方共同执行,确保实现适当的集成。由于消息由自动生成的代码进行编码和解码,因此消除了错误。
  • 适应性 :架构是可变的,可以更改消息内容,保持向后和向前兼容性。
  • 带宽优化 :对于相同的内容,使用 Protobuf 可以缩短消息长度,因为您发送的不是标头,只发送数据。随着时间的推移,这可以提供更好的设备自主权和更少的带宽使用量。最近一项关于 消息协议和序列化格式 的研究 表明,Protobuf 格式的消息最多可以比其等效 JSON 格式的消息小 10 倍。这意味着更少的字节数可以有效地通过线路传输相同内容。
  • 高效解码 :解码 Protobuf 消息比解码 JSON 更高效,这意味着收件人函数的运行时间更短。 Auth0 运行的一项基准测试 显示,对于等效的消息负载,Protobuf 的性能可以比 JSON 高出 6 倍。

这篇博客文章将引导您部署使用 Protobuf 格式向 亚马逊云科技 IoT Core 发布消息的示例应用程序。然后,这些消息会被 亚马逊云科技 IoT Core 规则引擎 规则 有选择地过滤。

让我们回顾一下 Protobuf 的一些基础知识。

协议缓冲区简而言之

消息架构是 Protobuf 的关键元素。架构可能如下所示:

syntax = "proto3";

import "google/protobuf/timestamp.proto";

message Telemetry
{
  enum MsgType
  {
    MSGTYPE_NORMAL = 0;
    MSGTYPE_ALERT = 1;
  }
  MsgType msgType = 1;
  string instrumentTag = 2;
  google.protobuf.Timestamp timestamp = 3;
  double value = 4;
}

架构的第一行定义了您正在使用的协议缓冲区的版本。这篇文章将使用 proto3 版本语法,但也支持 prot o2

下行表示 将描述一个名为 Telemetry 的新消息定义。

具体而言,此消息有四个不同的字段:

  • 一个 msgType 字段,其类型 为 msgTYPE,只能使用枚举值 MSGTYPE _NORMAL” 或 “MS GTYPE_ALERT”
  • Instr umentTag 字段,其类型为 字符串 ,用于标识发送遥测数据的测量仪器
  • 类型为 google.protobuf.timestamp 的时间 字段,用于表示测量时间
  • 精度类型的 字段 ,其中包含测量的值

请查阅 完整文档 ,了解所有可能的数据类型以及有关语法的其他信息。

用 JSON 编写的 遥测 消息如下所示:

{
  "msgType": "MSGTYPE_ALERT",
  "instrumentTag": "Temperature-001",
  "timestamp": 1676059669,
  "value": 72.5
}

使用协议缓冲区(出于显示目的编码为 base64)的相同消息如下所示:

0801120F54656D70657261747572652D3030311A060895C89A9F06210000000000205240

请注意,消息的 JSON 表示形式为 115 字节,而 Protobuf 的表示形式只有 36 字节。

一旦定义了架构, 协议 就 可用于:

  1. 用你选择的编程语言创建绑定
  2. 创建一个 FileDescriptorSet ,亚马逊云科技 IoT Core 使用它来解码收到的消息。

在 亚马逊云科技 IoT Core 中使用协议缓冲区

可以通过 亚马逊云科技 IoT Core 以多种方式使用 Protobuf。最简单的方法是将消息发布为 二进制负载 , 并让接收方应用程序对其进行解码。这已经受到 亚马逊云科技 IoT Core 规则引擎的支持,适用于任何二进制负载,而不仅仅是 Protobuf。

但是,当您想要解码Protobuf消息以进行过滤和转发时,您将获得最大的价值。过滤后的消息可以作为 Protobuf 转发,甚至可以解码为 JSON,以便与只能理解这种格式的应用程序兼容。

最近推出的 支持协议缓冲区消息格式的 亚马逊云科技 IoT 规则引擎 允许您以托管的方式轻松做到这一点。在以下部分中,我们将指导您部署和运行示例应用程序。

先决条件
要运行此示例应用程序,您必须具备以下条件:

  • 安装了 协议 的计算机。请参阅操作系统的 官方安装 说明
  • 亚马逊云科技 CLI( 安装说明
  • 拥有亚马逊 S3、亚马逊云科技 IAM、亚马逊云科技 IoT Core 和 亚马逊云科技 CloudFormation 完全权限的 亚马逊云科技 账户和有效证书
  • Python 3.7 或更新版本

示例应用程序:筛选 Protobuf 消息并将其作为 JSON 转发

要部署和运行示例应用程序,我们将执行 7 个简单步骤:

  1. 下载示例代码并安装 Python 要求
  2. 配置 IOT_ENDPOINT 和 AWS_REGION 环境 变量
  3. 使用 协议 生成 Python 绑定和消息描述符
  4. 使用 Python 和 Protobuf 生成的代码绑定运行模拟设备
  5. 使用 亚马逊云科技 CloudFormation 创建 亚马逊云科技 资源并上传 Protobuf 文件描述符
  6. 检查匹配、筛选并以 JSON 形式重新发布 Protobuf 消息的 亚马逊云科技 IoT 规则
  7. 验证转换后的消息是否正在重新发布

步骤 1:下载示例代码并安装 Python 要求

要运行示例应用程序,您需要下载代码并安装其依赖项:

  • 首先,从我们的 亚马逊云科技 github 存储库中下载并提取示例应用程序: https://github.com/aws-samples/aws-iotcore-protobuf-sample
  • 如果您将其下载为 ZIP 文件,请将其解压缩
  • 要安装必要的 python 要求,请在提取的示例应用程序的文件夹中运行以下命令
pip install -r requirements.txt

上面的命令将安装两个必需的 Python 依赖项: boto3 (适用于 Python 的 AWS 开发工具包)和 protobuf。

步骤 2:配置您的 IOT_ENDPOIN T 和 AWS_REGION 环境 变量

我们的模拟物联网设备将连接到 亚马逊云科技 IoT Core 端点以发送 Protobuf 格式的消息。

如果你运行的是 Linux 或 Mac,请运行以下命令。请务必 使用您选择的 亚马逊云科技 区域进行替换。

export AWS_REGION=<AWS_REGION>
export IOT_ENDPOINT=$(aws iot describe-endpoint --endpoint-type iot:Data-ATS --query endpointAddress --region $AWS_REGION --output text)

步骤 3:使用 协议 生成 Python 绑定和消息描述符

提取的示例应用程序包含一个名为 msg.proto 的文件,该文件 类似于 我们前面介绍的架构示例。

运行以下命令以生成您的模拟设备将用于生成文件描述符的代码绑定。

protoc --python_out=. msg.proto
protoc --include_imports -o filedescriptor.desc msg.proto

运行这些命令后,你应该在当前的文件夹中看到两个新文件:

filedescriptor.desc msg_pb2.py

步骤 4:使用 Python 和 Protobuf 生成的代码绑定运行模拟设备

提取的示例应用程序包含一个名为 simulate_device.py 的文件 。

要启动模拟设备,请运行以下命令:

python3 simulate_device.py

使用 亚马逊云科技 控制台 上的 MQTT 测试客户端,验证消息是否已发送到 亚马逊云科技 IoT Core。

Subscribe to a topic

  1. 访问 亚马逊云科技 IoT Core 服务控制台: https://console.aws.amazon.com/iot ;确保您位于正确的 亚马逊云科技 区域。
  2. 在 “ 测试 ” 下 ,选择 MQTT 测试客户端
  3. 在 “ 主题” 筛选条件 下 ,填写 test/t elemetry_all
  4. 展开 “ 其他配置 ” 部分,在 “ MQTT 负载显示 ” 下选择 “ 显示原始负载 ”。
  5. 单击 “ 订阅 ” ,观看 Protobuf 格式的消息到达了 亚马逊云科技 IoT Core MQTT 代理。

View subscriptions

第 5 步:使用 亚马逊云科技 CloudFormation 创建 亚马逊云科技 资源并上传 Protobuf 文件描述符

提取的示例应用程序包含一个名为 support-infrastructure-template.yam l 的 AWS CloudFormation 模板。

此模板定义了亚马逊 S3 存储桶、亚马逊云科技 IAM 角色和 亚马逊云科技 IoT 规则。

运行以下命令将 CloudFormation 模板部署到您的 亚马逊云科技 账户。确保将 S3 存储桶 所选的 亚马逊云科技 区域替换为唯一名称。

aws cloudformation create-stack --stack-name IotBlogPostSample \
--template-body file://support-infrastructure-template.yaml \
--capabilities CAPABILITY_NAMED_IAM \
--parameters ParameterKey=FileDescriptorBucketName,ParameterValue=<YOUR_BUCKET_NAME> \
--region=<AWS_REGION>

AWS IoT Core 对 Protobuf 格式消息的支持需要我们使用协议生成的文件描述符。 为了使其可用,我们会将其上传到创建的 S3 存储桶。运行以下命令上传文件描述符。请务必 使用您在部署 CloudFormation 模板时选择的相同名称进行替换。 aws s3 cp 文件描述符.desc s3:///msg/filedescriptor.desc

第 6 步:检查匹配、筛选并以 JSON 形式重新发布 Protobuf 消息的 亚马逊云科技 IoT 规则

假设你想要过滤消息 类型为 MSG TYP E_ALE RT 的消息 ,因为这些消息表明可能存在危险的操作条件。CloudFormation 模板创建了一条 亚马逊云科技 IoT 规则,用于解码我们模拟设备发送到 亚马逊云科技 IoT Core 的 Protobuf 格式的消息,然后它选择警报并以 JSON 格式重新发布,以便另一个 MQTT 主题响应者可以订阅。要检查 亚马逊云科技 IoT 规则,请执行以下步骤:

  1. 访问 亚马逊云科技 IoT Core 服务控制台: https://console.aws.amazon.com/iot
  2. 在左侧菜单的 “ 邮件路由 ” 下 ,单击 “规则”
  3. 该列表将包含一条名为 P rotobufaLerTrule 的 亚马逊云科技 物联网规则 ,点击 查看详情
  4. 在 SQL 语句下,注意 SQL 语句 ,我们将很快介绍每个元素的含义
  5. 在 “操作” 下,记下 “ 重新发布到 亚马逊云科技 IoT 的单项操作” 主题
SELECT
  VALUE decode(encode(*, 'base64'), "proto", "<YOUR_BUCKET_NAME>", "msg/filedescriptor.desc", "msg", "Telemetry")
FROM
  'test/telemetry_all'
WHERE
  decode(encode(*, 'base64'), "proto", "<YOUR_BUCKET_NAME>", "msg/filedescriptor.desc", "msg", "Telemetry").msgType = 'MSGTYPE_ALERT'

此 SQL 语句执行以下操作:

  • 选择值解码 (...) 表示整个解码的 Protobuf 负载将作为 JSON 负载重新发布到目标 亚马逊云科技 IoT 主题。 如果你想转发仍采用 Protobuf 格式的消息,你可以用简单的 SELECT 替换为*
  • WHER E de code (...) .msgType = 'msgTYPE_ALERT' 将对传入的 Protobuf 格式消息进行解码,并且只有包含值为 MSGTYPE_ALE RT 的 msgType 字段的消息才会被转发

步骤 7:验证转换后的消息是否已重新发布

如果您点击此 亚马逊云科技 IoT 规则中的单个操作,您会注意到它会将消息重新发布到主题/telemetry_aler ts 主题

Republish to AWS IoT topic

目标主题 test/telemetry_aler t s 是 亚马逊云科技 IoT 规则操作定义的一部分,可在示例应用程序的 亚马逊云科技 CloudFormation 模板中找到。

要订阅该主题并查看 JSON 格式的消息是否已重新发布,请按照以下步骤操作:

  1. 访问 亚马逊云科技 IoT Core 服务控制台: https://console.aws.amazon.com/iot
  2. 在 “ 测试 ” 下 ,选择 MQTT 测试客户端
  3. 在 “ 主题” 筛选器 下,填写 test/t elemetry_alerts
  4. 展开 “ 其他配置 ” 部分,在 “ MQTT 负载显示屏” 下, 确保选择 自动格式化 JSON 有效负载 ” 选项
  5. 单击 “ 订阅 ” ,然后观看 JSON 转换后带有 m sgTYPE_ALERT 的消息的到来

如果您检查模拟设备的代码,您会发现大约20%的模拟消息属于 MSGTYPE_ALE RT 类型,并且消息每5秒发送一次。您可能需要等待才能看到警报消息到达。

View the decoded alerts

清理

要在运行此示例后进行清理,请运行以下命令:

# delete the file descriptor object from the Amazon S3 Bucket
aws s3 rm s3://<YOUR_BUCKET_NAME>/msg/filedescriptor.desc

# detach all policies from the IoT service role
aws iam detach-role-policy --role-name IoTCoreServiceSampleRole \
  --policy-arn $(aws iam list-attached-role-policies --role-name IoTCoreServiceSampleRole --query 'AttachedPolicies[0].PolicyArn' --output text)

# delete the AWS CloudFormation Stack
aws cloudformation delete-stack --stack-name IotBlogPostSample

结论

如图所示,在 亚马逊云科技 IoT Core 上使用 Protobuf 就像编写 SQL 语句一样简单。与 JSON 相比,Protobuf 消息在节省成本(减少带宽使用、提高设备自主性)和便于使用任何 协议 支持的编 程语言进行开发方面都具有优于 JSON 的优势。

有关使用 亚马逊云科技 IoT Core 规则引擎解码 Protobuf 格式消息的更多详细信息,请参阅 A WS IoT Core 文档。

示例代码可以在github存储库中找到: https://github.com/aws-samples/aws-iotcore-protobuf-sample

解码 功能在将数据转发到亚马逊 Kinesis Data Firehose 时特别有用,因为它可以接受 JSON 输入,而无需您编写 亚马逊云科技 Lambda 函数来执行解码。

有关 亚马逊云科技 IoT 规则操作的可用服务集成的更多详细信息,请参阅 亚马逊云科技 IoT 规则操作文档


作者简介




José Gardiazabal José Gardiazabal 是 亚马逊云科技 原型设计和云工程团队的原型设计架构师,通过在 亚马逊云科技 上展示可能性的艺术,帮助客户充分发挥潜力。他拥有电子学学士学位和计算机科学博士学位。他之前曾从事医疗硬件和软件的开发。




Donato Azevedo Donato Azevedo 是 亚马逊云科技 原型设计和云工程团队的原型设计架构师,通过在 亚马逊云科技 上展示可能性的艺术,帮助客户充分发挥潜力。他拥有控制工程学士学位,此前曾在石油和天然气以及金属和矿业公司的工业自动化部门工作。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。