我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
如何使用带有 亚马逊云科技 IoT Core 的协议缓冲区构建智能应用程序
协议缓冲区简介
协议缓冲区(Protobuf)为序列化结构化数据提供了一种平台中立的方法。Protobuf 与 JSON 类似,不同之处在于它更小、更快,并且能够使用您首选的编程语言自动生成绑定。
通过生成 Protobuf 代码实现物联网的敏捷性和安全性
关键优势来自使用Protobuf的代码生成器进行软件开发的简便性和安全性。您可以编写架构来描述应用程序组件之间交换的消息。代码生成器(
自动生成代码使开发人员无需编写编码和解码函数,并确保其在编程语言之间的兼容性。随着
在 亚马逊云科技 IoT Core 中使用协议缓冲区而不是 JSON 的其他优势包括:
- 架构和验证 :架构由发送方和接收方共同执行,确保实现适当的集成。由于消息由自动生成的代码进行编码和解码,因此消除了错误。
- 适应性 :架构是可变的,可以更改消息内容,保持向后和向前兼容性。
-
带宽优化
:对于相同的内容,使用 Protobuf 可以缩短消息长度,因为您发送的不是标头,只发送数据。随着时间的推移,这可以提供更好的设备自主权和更少的带宽使用量。最近一项关于
消息协议和序列化格式 的研究 表明,Protobuf 格式的消息最多可以比其等效 JSON 格式的消息小 10 倍。这意味着更少的字节数可以有效地通过线路传输相同内容。 -
高效解码
:解码 Protobuf 消息比解码 JSON 更高效,这意味着收件人函数的运行时间更短。
Auth0 运行的一项基准测试 显示,对于等效的消息负载,Protobuf 的性能可以比 JSON 高出 6 倍。
这篇博客文章将引导您部署使用 Protobuf 格式向 亚马逊云科技 IoT Core 发布消息的示例应用程序。然后,这些消息会被
让我们回顾一下 Protobuf 的一些基础知识。
协议缓冲区简而言之
消息架构是 Protobuf 的关键元素。架构可能如下所示:
架构的第一行定义了您正在使用的协议缓冲区的版本。这篇文章将使用
下行表示 将描述一个名为
Telemetry
的新消息定义。
具体而言,此消息有四个不同的字段:
-
一个msgType 字段,其类型为 msgTYPE,只能使用枚举值“GTYPE_ALERT”MSGTYPE_NORMAL” 或 “MS -
Instr
umentTag字段,其类型为字符串,用于标识发送遥测数据的测量仪器 -
类型为
google.protobuf.timestamp 的时间戳字段,用于表示测量时间 -
双精度类型的值字段 ,其中包含测量的值
请查阅
用 JSON 编写的
遥测
消息如下所示:
{
"msgType": "MSGTYPE_ALERT",
"instrumentTag": "Temperature-001",
"timestamp": 1676059669,
"value": 72.5
}
使用协议缓冲区(出于显示目的编码为 base64)的相同消息如下所示:
0801120F54656D70657261747572652D3030311A060895C89A9F06210000000000205240
请注意,消息的 JSON 表示形式为 115 字节,而 Protobuf 的表示形式只有 36 字节。
一旦定义了架构,
协议
就 可用于:
- 用你选择的编程语言创建绑定
-
创建一个
FileDescriptorSet,亚马逊云科技 IoT Core 使用它来解码收到的消息。
在 亚马逊云科技 IoT Core 中使用协议缓冲区
可以通过 亚马逊云科技 IoT Core 以多种方式使用 Protobuf。最简单的方法是将消息发布为
但是,当您想要解码Protobuf消息以进行过滤和转发时,您将获得最大的价值。过滤后的消息可以作为 Protobuf 转发,甚至可以解码为 JSON,以便与只能理解这种格式的应用程序兼容。
最近推出的
先决条件
要运行此示例应用程序,您必须具备以下条件:
-
安装了
协议的计算机。请参阅操作系统的官方安装 说明 。 -
亚马逊云科技 CLI(
安装说明 ) - 拥有亚马逊 S3、亚马逊云科技 IAM、亚马逊云科技 IoT Core 和 亚马逊云科技 CloudFormation 完全权限的 亚马逊云科技 账户和有效证书
- Python 3.7 或更新版本
示例应用程序:筛选 Protobuf 消息并将其作为 JSON 转发
要部署和运行示例应用程序,我们将执行 7 个简单步骤:
- 下载示例代码并安装 Python 要求
-
配置IOT_ENDPOINT 和 AWS_REGION 环境变量 -
使用
协议生成 Python 绑定和消息描述符 - 使用 Python 和 Protobuf 生成的代码绑定运行模拟设备
- 使用 亚马逊云科技 CloudFormation 创建 亚马逊云科技 资源并上传 Protobuf 文件描述符
- 检查匹配、筛选并以 JSON 形式重新发布 Protobuf 消息的 亚马逊云科技 IoT 规则
- 验证转换后的消息是否正在重新发布
步骤 1:下载示例代码并安装 Python 要求
要运行示例应用程序,您需要下载代码并安装其依赖项:
-
首先,从我们的 亚马逊云科技 github 存储库中下载并提取示例应用程序:
https://github.com/aws-samples/aws-iotcore-protobuf-sample - 如果您将其下载为 ZIP 文件,请将其解压缩
- 要安装必要的 python 要求,请在提取的示例应用程序的文件夹中运行以下命令
上面的命令将安装两个必需的 Python 依赖项:
boto3
(适用于 Python 的 AWS 开发工具包)和 protobuf。
步骤 2:配置您的 IOT_ENDPOIN
T 和 AWS_REGION 环境
变量
T 和 AWS_REGION 环境
变量
我们的模拟物联网设备将连接到 亚马逊云科技 IoT Core 端点以发送 Protobuf 格式的消息。
如果你运行的是 Linux 或 Mac,请运行以下命令。请务必
步骤 3:使用
协议
生成 Python 绑定和消息描述符
提取的示例应用程序包含一个名为
msg.proto 的文件,该文件 类似于
我们前面介绍的架构示例。
运行以下命令以生成您的模拟设备将用于生成文件描述符的代码绑定。
运行这些命令后,你应该在当前的文件夹中看到两个新文件:
filedescriptor.desc msg_pb2.py
步骤 4:使用 Python 和 Protobuf 生成的代码绑定运行模拟设备
提取的示例应用程序包含一个名为
simulate_device.py
的文件 。
要启动模拟设备,请运行以下命令:
使用 亚马逊云科技 控制台 上的 MQTT 测试客户端,验证消息是否已发送到 亚马逊云科技 IoT Core。
-
访问 亚马逊云科技 IoT Core 服务控制台:
https://console.aws.amazon.com/iot ;确保您位于正确的 亚马逊云科技 区域。 - 在 “ 测试 ” 下 ,选择 MQTT 测试客户端 。
-
在 “
主题” 筛选条件 下
,填写
test/telemetry_all - 展开 “ 其他配置 ” 部分,在 “ MQTT 负载显示 ” 下选择 “ 显示原始负载 ”。
- 单击 “ 订阅 ” ,观看 Protobuf 格式的消息到达了 亚马逊云科技 IoT Core MQTT 代理。
第 5 步:使用 亚马逊云科技 CloudFormation 创建 亚马逊云科技 资源并上传 Protobuf 文件描述符
提取的示例应用程序包含一个名为 support-infrastructure-template.yam
此模板定义了亚马逊 S3 存储桶、亚马逊云科技 IAM 角色和 亚马逊云科技 IoT 规则。
运行以下命令将 CloudFormation 模板部署到您的 亚马逊云科技 账户。确保将
和
所选的 亚马逊云科技 区域替换为唯一名称。
AWS IoT Core 对 Protobuf 格式消息的支持需要我们使用协议生成的文件描述符。
为了使其可用,我们会将其上传到创建的 S3 存储桶。运行以下命令上传文件描述符。请务必
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 规则,请执行以下步骤:
-
访问 亚马逊云科技 IoT Core 服务控制台:
https://console.aws.amazon.com/iot - 在左侧菜单的 “ 邮件路由 ” 下 ,单击 “规则”
- 该列表将包含一条名为 P rotobufaLerTrule 的 亚马逊云科技 物联网规则 ,点击 查看详情
- 在 SQL 语句下,注意 SQL 语句 ,我们将很快介绍每个元素的含义
- 在 “操作” 下,记下 “ 重新发布到 亚马逊云科技 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 decode (...) .msgType = 'msgTYPE_ALERT' 将对传入的 Protobuf 格式消息进行解码,并且只有包含值为 MSGTYPE_ALERT 的 msgType 字段的消息才会被转发
步骤 7:验证转换后的消息是否已重新发布
如果您点击此 亚马逊云科技 IoT 规则中的单个操作,您会注意到它会将消息重新发布到主题/telemetry_aler
ts 主题
。
目标主题
test/telemetry_aler
t s 是 亚马逊云科技 IoT 规则操作定义的一部分,可在示例应用程序的 亚马逊云科技 CloudFormation 模板中找到。
要订阅该主题并查看 JSON 格式的消息是否已重新发布,请按照以下步骤操作:
-
访问 亚马逊云科技 IoT Core 服务控制台:
https://console.aws.amazon.com/iot - 在 “ 测试 ” 下 ,选择 MQTT 测试客户端
-
在 “
主题” 筛选器
下,填写
test/telemetry_alerts - 展开 “ 其他配置 ” 部分,在 “ MQTT 负载显示屏” 下, 确保选择 “ 自动格式化 JSON 有效负载 ” 选项
-
单击 “
订阅
” ,然后观看 JSON 转换后带有
msgTYPE_ALERT 的消息的到来
如果您检查模拟设备的代码,您会发现大约20%的模拟消息属于
MSGTYPE_ALE
RT 类型,并且消息每5秒发送一次。您可能需要等待才能看到警报消息到达。
清理
要在运行此示例后进行清理,请运行以下命令:
结论
如图所示,在 亚马逊云科技 IoT Core 上使用 Protobuf 就像编写 SQL 语句一样简单。与 JSON 相比,Protobuf 消息在节省成本(减少带宽使用、提高设备自主性)和便于使用任何
协议 支持的编
程语言进行开发方面都具有优于 JSON 的优势。
有关使用 亚马逊云科技 IoT Core 规则引擎解码 Protobuf 格式消息的更多详细信息,请参阅 A
示例代码可以在github存储库中找到:
解码
功能在将数据转发到亚马逊 Kinesis Data Firehose 时特别有用,因为它可以接受 JSON 输入,而无需您编写 亚马逊云科技 Lambda 函数来执行解码。
有关 亚马逊云科技 IoT 规则操作的可用服务集成的更多详细信息,请参阅
作者简介
José Gardiazabal
José Gardiazabal 是 亚马逊云科技 原型设计和云工程团队的原型设计架构师,通过在 亚马逊云科技 上展示可能性的艺术,帮助客户充分发挥潜力。他拥有电子学学士学位和计算机科学博士学位。他之前曾从事医疗硬件和软件的开发。
Donato Azevedo
Donato Azevedo 是 亚马逊云科技 原型设计和云工程团队的原型设计架构师,通过在 亚马逊云科技 上展示可能性的艺术,帮助客户充分发挥潜力。他拥有控制工程学士学位,此前曾在石油和天然气以及金属和矿业公司的工业自动化部门工作。
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。