从事物中摄取 AWS IoT 数据 - AWS IoT SiteWise

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

从事物中摄取 AWS IoT 数据

在本教程中,学习如何使用设备影子 AWS IoT SiteWise 从一组设备中提取数据。 AWS IoT 设备阴影是存储 AWS IoT 设备当前状态信息的JSON对象。有关更多信息,请参阅 AWS IoT 开发人员指南中的设备影子服务

完成本教程后,可以在中 AWS IoT SiteWise 根据 AWS IoT 内容设置操作。通过使用 AWS IoT 东西,您可以将您的操作与的其他有用功能集成 AWS IoT。例如,您可以配置 AWS IoT 功能以执行以下任务:

  • 配置其他规则以将数据流式传输到AWS IoT EventsAmazon Dyn amoDB 等。 AWS 服务有关更多信息,请参阅 AWS IoT 开发人员指南 中的规则

  • 使用 AWS IoT 队列索引服务对您的设备数据进行索引、搜索和汇总。有关更多信息,请参阅 AWS IoT 开发人员指南中的实例集索引服务

  • 使用来审核和保护您的设备 AWS IoT Device Defender。有关更多信息,请参阅 AWS IoT 开发人员指南中的 AWS IoT Device Defender

在本教程中,您将学习如何将数据从设备影子提取 AWS IoT 到中的资产。 AWS IoT SiteWise为此,您需要创建一件或多件 AWS IoT 事,然后运行一个脚本,用内存使用数据更新每件事物的设备影子。CPU在本教程中,您将使用CPU和内存使用数据来模仿真实的传感器数据。然后,您创建一条规则,其中包含一个 AWS IoT SiteWise 操作,该操作会在 AWS IoT SiteWise 每次事物的设备影子更新时将这些数据发送到资产。有关更多信息,请参阅 使用 AWS IoT Core 规则摄取数据

先决条件

要完成本教程,您需要:

  • 一个 AWS 账户。如果没有,请参阅设置一个 AWS 账户

  • 一台运行Windows、macOSLinux、或Unix访问的开发计算机 AWS Management Console。有关更多信息,请参阅 AWS Management Console入门

  • 具有管理员权限的 AWS Identity and Access Management (IAM) 用户。

  • Python3 安装在您的开发计算机上或安装在要注册为 AWS IoT 事物的设备上。

步骤 1:创建 AWS IoT 策略

在此过程中,创建一个允许您的设备访问 AWS IoT 本教程中使用的资源的 AWS IoT 策略。

创建 AWS IoT 策略
  1. 登录到 AWS Management Console

  2. 查看支持AWSAWS IoT SiteWise 的地区。如有必要,切换到其中一个受支持的区域。

  3. 导航到 AWS IoT 控制台。如果出现 “Connect 设备” 按钮,请选择该按钮。

  4. 在左侧导航窗格中,选择安全,然后选择策略

  5. 选择创建

  6. 输入 AWS IoT 策略的名称(例如,SiteWiseTutorialDevicePolicy)。

  7. 在 “政策文件” 下 JSON,选择在JSON表单中输入以下政策。Replace(替换) region 以及 account-id 使用您的地区和账户 ID,例如us-east-1123456789012

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:region:account-id:client/SiteWiseTutorialDevice*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": [ "arn:aws:iot:region:account-id:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update", "arn:aws:iot:region:account-id:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/delete", "arn:aws:iot:region:account-id:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/get" ] }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": [ "arn:aws:iot:region:account-id:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/accepted", "arn:aws:iot:region:account-id:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/delete/accepted", "arn:aws:iot:region:account-id:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/get/accepted", "arn:aws:iot:region:account-id:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/rejected", "arn:aws:iot:region:account-id:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/delete/rejected" ] }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": [ "arn:aws:iot:region:account-id:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/accepted", "arn:aws:iot:region:account-id:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/delete/accepted", "arn:aws:iot:region:account-id:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/get/accepted", "arn:aws:iot:region:account-id:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/rejected", "arn:aws:iot:region:account-id:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/delete/rejected" ] }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": "arn:aws:iot:region:account-id:thing/SiteWiseTutorialDevice*" } ] }

    此策略使您的 AWS IoT 设备能够建立连接并使用MQTT消息与设备影子通信。有关MQTT消息的更多信息,请参阅什么是MQTT? 。要与设备影子互动,你的 AWS IoT 东西会发布和接收有关以开头的主题的MQTT消息$aws/things/thing-name/shadow/。此策略包含一个称为 “事物” 策略变量${iot:Connection.Thing.ThingName}。此变量在每个主题中替换关联事物的名称。该iot:Connect语句限制了哪些设备可以建立连接,从而确保事物策略变量只能替换以开头的名称SiteWiseTutorialDevice

    有关更多信息,请参阅AWS IoT 开发人员指南中的事物策略变量

    注意

    此策略适用于名称以 SiteWiseTutorialDevice 开头的事物。要为您的事物使用不同的名称,您必须相应地更新策略。

  8. 选择创建

步骤 2:创建和配置 AWS IoT 事物

在此过程中,您将创建和配置一个 AWS IoT 事物。你可以将你的开发计算机指定为一个 AWS IoT 东西。随着你的进步,请记住,你在这里学习的原则可以应用于实际项目。你可以灵活地在任何能够运行的设备上制作和设置 AWS IoT 东西 AWS IoT SDK,包括 AWS IoT Greengrass 和免费RTOS。有关更多信息,请参阅AWS IoT SDKsAWS IoT 开发人员指南》

创建和配置 AWS IoT 事物
  1. 打开命令行并运行以下命令,以便为本教程创建目录。

    mkdir iot-sitewise-rule-tutorial cd iot-sitewise-rule-tutorial
  2. 运行以下命令为您的事物证书创建一个目录。

    mkdir device1

    如果您正在创建其他事物,请相应地增加目录名称中的数字,以跟踪哪些证书属于哪个事物。

  3. 导航到 AWS IoT 控制台

  4. 在左侧导航窗格中,选择管理部分中的所有设备。然后选择 Things (事物)

  5. 如果显示 您还没有任何事物 对话框,请选择 创建事物。否则,请选择创建事物

  6. 创建事物页面上,选择创建单个事物,然后选择下一步

  7. 指定事物属性页面上,为 AWS IoT 事物输入名称(例如 SiteWiseTutorialDevice1),然后选择下一步。如果您正在创建其他事物,请相应地增加事物名称中的数字。

    重要

    事物名称必须与您在步骤 1:创建策略中创建的 AWS IoT 策略中使用的名称相匹配。否则,您的设备将无法连接到 AWS IoT。

  8. 配置证书 - 可选页面上,选择自动生成新证书(推荐),然后选择下一步。证书可以安全 AWS IoT 地识别您的设备。

  9. 在 “将策略附加到证书-可选” 页面上,选择您在步骤 1:创建策略中创建的 AWS IoT 策略,然后选择创建事物

  10. 下载证书与密钥对话框中,执行以下操作:

    1. 选择 下载 链接以下载事物的证书、公钥和私钥。将所有三个文件保存到您为事物证书创建的目录(例如,iot-sitewise-rule-tutorial/device1)。

      重要

      这是您唯一一次可以下载在设备成功连接 AWS IoT时所需的事物证书和密钥。

    2. 选择下载链接,以下载根 CA 证书。将根 CA 证书保存到 iot-sitewise-rule-tutorial。我们建议下载 Amazon 根 CA 1。

  11. 选择完成

现在,你已经在电脑上注册了一个 AWS IoT 东西。采取以下步骤之一:

  • 继续步骤 3:在不创建其他 AWS IoT 内容的情况下创建设备资产模型。您可以只使用一个事物完成本教程。

  • 在另一台计算机或设备上重复本部分中的步骤以创建更多 AWS IoT 事物。在本教程中,我们建议您遵循此选项,以便可以从多个设备提取唯一数据CPU和内存使用数据。

  • 在同一台设备(您的计算机)上重复此部分中的步骤以创建更多 AWS IoT 事物。每个 AWS IoT 设备都会从您的计算机接收相似CPU的内存使用数据,因此请使用这种方法来演示从多个设备摄取非唯一数据。

步骤 3:创建设备资产模型

在此过程中,您将在中创建一个资产模型 AWS IoT SiteWise 来表示流式传输CPU和内存使用情况数据的设备。为了处理代表设备组的资产中的数据,资产模型要求同一类型的多个资产之间保持一致的信息。有关更多信息,请参阅 模拟工业资产

创建表示设备的资产模型
  1. 导航到 AWS IoT SiteWise 控制台

  2. 在左侧导航窗格中,选择 模型

  3. 选择 创建模型

  4. 模型详细信息下,输入您的模型的名称。例如,SiteWise Tutorial Device Model

  5. 测量定义 下,执行以下操作:

    1. 名称 中,输入 CPU Usage

    2. 单位 中,输入 %

    3. 数据类型 保留为 双精度

    测量属性表示设备的原始数据流。有关更多信息,请参阅 定义来自设备的数据流(测量)

  6. 选择添加测量以添加第二个测量属性。

  7. 测量定义 下的第二行中,执行以下操作:

    1. 名称 中,输入 Memory Usage

    2. 单位 中,输入 %

    3. 数据类型 保留为 双精度

  8. 指标定义 下,执行以下操作:

    1. 名称中,输入 Average CPU Usage

    2. 公式 中,输入 avg(CPU Usage)。自动完成列表出现时,从该列表中选择 CPU Usage

    3. 时间间隔 中,输入 5 minutes

    指标属性可定义聚合计算,用于处理一个时间间隔内的所有输入数据点,并针对每个时间间隔输出一个数据点。此指标属性每 5 分钟计算每台设备的平均CPU使用量。有关更多信息,请参阅 汇总来自房产和其他资产(指标)的数据

  9. 选择添加指标以添加第二个指标属性。

  10. 指标定义 下的第二行中,执行以下操作:

    1. 名称中,输入 Average Memory Usage

    2. 公式 中,输入 avg(Memory Usage)。自动完成列表出现时,从该列表中选择 Memory Usage

    3. 时间间隔 中,输入 5 minutes

    此指标属性每 5 分钟计算一次每台设备的平均内存使用量。

  11. (可选)添加您对每个设备进行计算时感兴趣的其他指标。一些有趣的函数包括 minmax。有关更多信息,请参阅 使用公式表达式。在步骤 4:创建一个设备实例集资产模型,您将创建一个父资产,该资产可以使用来自整个设备队列的数据来计算指标。

  12. 选择创建模型

步骤 4:创建设备队列资产模型

在此过程中,您将制作一个资产模型 AWS IoT SiteWise 来符号化您的设备集合。在此资产模型中,您可以建立一种结构,允许您将大量设备资产链接到一个总体机队资产。之后,您将概述车队资产模型中的指标,以整合来自所有联网设备资产的数据。这种方法可让您全面了解整个车队的集体表现。

创建表示设备队列的资产模型
  1. 导航到 AWS IoT SiteWise 控制台

  2. 在左侧导航窗格中,选择 模型

  3. 选择 创建模型

  4. 模型详细信息下,输入您的模型的名称。例如,SiteWise Tutorial Device Fleet Model

  5. 层次结构定义 下,执行以下操作:

    1. 层次结构名称 中,输入 Device

    2. 层次结构模型 中,选择您的设备资产模型 (SiteWise Tutorial Device Model)。

    层次结构定义父(队列)资产模型和子(设备)资产模型之间的关系。父资产可以访问子资产的属性数据。以后创建资产时,需要根据父资产模型中的层次结构定义将子资产与父资产关联。有关更多信息,请参阅 定义资产模型层次结构

  6. 指标定义 下,执行以下操作:

    1. 名称中,输入 Average CPU Usage

    2. 公式 中,输入 avg(Device | Average CPU Usage)。显示自动完成列表时,选择 Device 以选择层次结构,然后选择 Average CPU Usage,从之前创建的设备资产中选择指标。

    3. 时间间隔 中,输入 5 minutes

    此指标属性计算Device层次结构中与车队资产关联的所有设备资产的平均CPU使用率。

  7. 选择添加指标以添加第二个指标属性。

  8. 指标定义 下的第二行中,执行以下操作:

    1. 名称中,输入 Average Memory Usage

    2. 公式 中,输入 avg(Device | Average Memory Usage)。显示自动完成列表时,选择 Device 以选择层次结构,然后选择 Average Memory Usage,从之前创建的设备资产中选择指标。

    3. 时间间隔 中,输入 5 minutes

    此指标属性通过 Device 层次结构计算与队列资产关联的所有设备资产的平均内存使用量。

  9. (可选)添加您有兴趣跨设备队列计算的其他指标。

  10. 选择创建模型

步骤 5:创建和配置设备资产

在此过程中,您将根据您的设备资产模型生成设备资产。然后,为每个测量属性定义属性别名。属性别名是标识资产属性的唯一字符串。稍后,您可以使用别名而不是资产 ID 和属性 ID 来识别要上传数据的属性。有关更多信息,请参阅 将工业数据流映射到资产属性

创建设备资产并定义属性别名
  1. 导航到 AWS IoT SiteWise 控制台

  2. 在左侧导航窗格中,选择 资产

  3. 选择 创建资产

  4. 模型信息下,选择您的设备资产模型,SiteWise Tutorial Device Model

  5. 资产信息下,输入资产的名称。例如,SiteWise Tutorial Device 1

  6. 选择 创建资产

  7. 对于新设备资产,请选择 编辑

  8. CPU Usage 下,输入 /tutorial/device/SiteWiseTutorialDevice1/cpu 作为属性别名。您可以在属性别名中包含 AWS IoT 事物的名称,这样您就可以使用单个 AWS IoT 规则从所有设备提取数据。

  9. Memory Usage 下,输入 /tutorial/device/SiteWiseTutorialDevice1/memory 作为属性别名。

  10. 选择保存

如果您之前创建了多个 AWS IoT 内容,请对每台设备重复步骤 3 到 10,并相应地增加资产名称和属性别名中的数字。例如,第二个设备资产的名称应为 SiteWise Tutorial Device 2,其属性别名应为 /tutorial/device/SiteWiseTutorialDevice2/cpu/tutorial/device/SiteWiseTutorialDevice2/memory

步骤 6:创建和配置设备队列资产

在此过程中,您将形成从您的设备队列资产模型派生的设备队列资产。然后,将您的个人设备资产关联到舰队资产。这种关联使舰队资产的指标属性能够编译和分析来自多个设备的数据。这些数据为您提供了整个机队集体绩效的综合视图。

创建设备队列资产并关联设备资产
  1. 导航到 AWS IoT SiteWise 控制台

  2. 在左侧导航窗格中,选择 资产

  3. 选择 创建资产

  4. 模型信息中,选择您的设备实例集资产模型 SiteWise Tutorial Device Fleet Model

  5. 资产信息下,输入资产的名称。例如,SiteWise Tutorial Device Fleet 1

  6. 选择 创建资产

  7. 对于新设备队列资产,请选择 编辑

  8. 在 “与此资产关联的资产” 下,选择 “添加关联资产”,然后执行以下操作:

    1. 层次结构 下,选择 Device。此层次结构标识设备和设备队列资产之间的层次关系。您在本教程前面的设备队列资产模型中定义了此层次结构。

    2. 资产 下,选择您的设备资产 SiteWise Tutorial Device 1

  9. (可选)如果您之前创建了多个设备资产,请对您创建的每个设备资产重复步骤 8 到 10。

  10. 选择保存

    现在,您应该可以看到设备资产按层次结构进行组织。

步骤 7:在 AWS IoT Core 中创建向设备资产发送数据的规则

在此过程中,您需要在中建立规则 AWS IoT Core。该规则旨在解释来自设备影子的通知消息,并将数据传输到您的设备资产 AWS IoT SiteWise。每次设备影子更新时,都会 AWS IoT 发送一条MQTT消息。您可以创建一条规则,当设备阴影根据MQTT消息发生变化时采取行动。在这种情况下,目标是处理更新消息,提取属性值,然后将其传输到您的设备资产 AWS IoT SiteWise。

使用 AWS IoT SiteWise 操作创建规则
  1. 导航到 AWS IoT 控制台

  2. 在左侧导航窗格中,选择消息路由,然后选择规则

  3. 选择 创建规则

  4. 输入规则的名称和说明,然后选择下一步

  5. 输入以下SQL语句,然后选择 “下一步”。

    SELECT * FROM '$aws/things/+/shadow/update/accepted' WHERE startsWith(topic(3), "SiteWiseTutorialDevice")

    此规则查询语句起作用,因为 Device Shadow 服务将影子更新发布到 $aws/things/thingName/shadow/update/accepted。有关设备影子的更多信息,请参阅 AWS IoT 开发人员指南中的设备影子服务

    WHERE 子句中,此规则查询语句使用 topic(3) 函数从主题的第三段获取事物名称。然后,该语句筛选掉名称与教程设备名称不匹配的设备。有关的更多信息 AWS IoT SQL,请参阅《AWS IoT 开发人员指南》中的AWS IoT SQL参考资料。

  6. 规则操作下,选择向 AWS IoT SiteWise中的资产属性发送消息数据,然后执行以下操作:

    1. 选择 按属性别名

    2. 属性别名 中,输入 /tutorial/device/${topic(3)}/cpu

      ${...}语法是一个替换模板。 AWS IoT 评估大括号内的内容。此替换模板从主题中提取事物名称,以创建对每个事物唯一的别名。有关更多信息,请参阅 AWS IoT 开发人员指南中的替换模板

      注意

      由于替换模板中的表达式与 SELECT 语句分开评估,因此您不能使用替换模板来引用使用 AS 子句创建的别名。除了支持的函数和运算符之外,您只能引用原始负载中存在的信息。

    3. 条目 ID -可选中,输入 ${concat(topic(3), "-cpu-", floor(state.reported.timestamp))}

      条目IDs唯一标识每次输入值的尝试。如果条目返回错误,您可以在错误输出中找到条目 ID 以对问题进行故障排除。此条目 ID 中的替换模板将事物名称与设备报告的时间戳组合起来。例如,生成的条目 ID 可能看起来像 SiteWiseTutorialDevice1-cpu-1579808494

    4. 时间(以秒为单位)中,输入 ${floor(state.reported.timestamp)}

      此替换模板从设备报告的时间戳计算时间(以秒为单位)。在本教程中,设备将 Unix 纪元时间中的时间戳(以秒为单位)报告为浮点数。

    5. 偏移量(以纳秒为单位)- 可选中,输入 ${floor((state.reported.timestamp % 1) * 1E9)}

      此替换模板通过转换设备报告时间戳的小数部分来计算时间(以秒为单位)的纳秒偏移量。

      注意

      AWS IoT SiteWise 要求您的数据具有以 Unix 纪元时间为单位的当前时间戳。如果您的设备没有准确报告时间,您可以使用 timestamp() 从 AWS IoT 规则引擎获取当前时间。此函数以毫秒为单位报告时间,因此您必须将规则操作的时间参数更新为以下值:

      • 时间(以秒为单位)中,输入 ${floor(timestamp() / 1E3)}

      • 偏移量 (以纳秒为单位) 中,输入 ${(timestamp() % 1E3) * 1E6}

    6. 数据类型 中,选择 双精度

      此数据类型必须与您在资产模型中定义的资产属性的数据类型相匹配。

    7. 中,输入 ${state.reported.cpu}。在替换模板中,您可以使用.运算符从JSON结构中检索值。

    8. 选择 添加条目 为内存使用量属性添加新条目,然后再次为该属性完成以下步骤:

      1. 选择 按属性别名

      2. 属性别名 中,输入 /tutorial/device/${topic(3)}/memory

      3. 条目 ID -可选中,输入 ${concat(topic(3), "-memory-", floor(state.reported.timestamp))}

      4. 时间(以秒为单位)中,输入 ${floor(state.reported.timestamp)}

      5. 偏移量(以纳秒为单位)- 可选中,输入 ${floor((state.reported.timestamp % 1) * 1E9)}

      6. 数据类型 中,选择 双精度

      7. 中,输入 ${state.reported.memory}

    9. 在 “IAM角色” 下,选择 “创建新角色”,为该规则操作创建IAM角色。此角色允许将数据推送 AWS IoT 到设备队列资产及其资产层次结构中的属性。

    10. 输入角色名称,然后选择创建

  7. (可选)配置可用于对规则进行故障排除的错误操作。有关更多信息,请参阅 对规则进行故障排除 (AWS IoT SiteWise)

  8. 选择 下一步

  9. 查看设置并选择创建以创建规则。

步骤 8:运行设备客户端脚本

在本教程中,您没有使用实际设备来报告数据。取而代之的是,你运行一个脚本来更新你的 AWS IoT 设备影子,CPU并使用内存来模仿真实的传感器数据。要运行该脚本,必须先安装所需的Python软件包。在此过程中,您将安装所需的Python软件包,然后运行设备客户端脚本。

配置和运行设备客户端脚本
  1. 导航到 AWS IoT 控制台

  2. 在左侧导航窗格底部,选择 设置

  3. 保存您的自定义终端节点以便与设备客户端脚本一起使用。您可以使用此终端节点与事物影子进行交互。此终端节点对您在当前区域中的账户是唯一的。

    您的自定义终端节点应与以下示例类似。

    identifier.iot.region.amazonaws.com
  4. 打开命令行并运行以下命令以导航到之前创建的教程目录。

    cd iot-sitewise-rule-tutorial
  5. 运行以下命令来安装 AWS IoT Device SDK for Python。

    pip3 install AWSIoTPythonSDK

    有关更多信息,请参阅 AWS IoT 开发人员指南中的 AWS IoT Device SDK for Python

  6. 运行以下命令来安装 psutil,这是一个跨平台的进程和系统实用程序库。

    pip3 install psutil

    有关更多信息,请参阅 Python Package 索引中的 psutil

  7. iot-sitewise-rule-tutorial 目录中创建一个名为 thing_performance.py 的文件,然后将以下 Python 代码复制到该文件中。

    import AWSIoTPythonSDK.MQTTLib as AWSIoTPyMQTT import json import psutil import argparse import logging import time # Configures the argument parser for this program. def configureParser(): parser = argparse.ArgumentParser() parser.add_argument( "-e", "--endpoint", action="store", required=True, dest="host", help="Your AWS IoT custom endpoint", ) parser.add_argument( "-r", "--rootCA", action="store", required=True, dest="rootCAPath", help="Root CA file path", ) parser.add_argument( "-c", "--cert", action="store", required=True, dest="certificatePath", help="Certificate file path", ) parser.add_argument( "-k", "--key", action="store", required=True, dest="privateKeyPath", help="Private key file path", ) parser.add_argument( "-p", "--port", action="store", dest="port", type=int, default=8883, help="Port number override", ) parser.add_argument( "-n", "--thingName", action="store", required=True, dest="thingName", help="Targeted thing name", ) parser.add_argument( "-d", "--requestDelay", action="store", dest="requestDelay", type=float, default=1, help="Time between requests (in seconds)", ) parser.add_argument( "-v", "--enableLogging", action="store_true", dest="enableLogging", help="Enable logging for the AWS IoT Device SDK for Python", ) return parser # An MQTT shadow client that uploads device performance data to AWS IoT at a regular interval. class PerformanceShadowClient: def __init__( self, thingName, host, port, rootCAPath, privateKeyPath, certificatePath, requestDelay, ): self.thingName = thingName self.host = host self.port = port self.rootCAPath = rootCAPath self.privateKeyPath = privateKeyPath self.certificatePath = certificatePath self.requestDelay = requestDelay # Updates this thing's shadow with system performance data at a regular interval. def run(self): print("Connecting MQTT client for {}...".format(self.thingName)) mqttClient = self.configureMQTTClient() mqttClient.connect() print("MQTT client for {} connected".format(self.thingName)) deviceShadowHandler = mqttClient.createShadowHandlerWithName( self.thingName, True ) print("Running performance shadow client for {}...\n".format(self.thingName)) while True: performance = self.readPerformance() print("[{}]".format(self.thingName)) print("CPU:\t{}%".format(performance["cpu"])) print("Memory:\t{}%\n".format(performance["memory"])) payload = {"state": {"reported": performance}} deviceShadowHandler.shadowUpdate( json.dumps(payload), self.shadowUpdateCallback, 5 ) time.sleep(args.requestDelay) # Configures the MQTT shadow client for this thing. def configureMQTTClient(self): mqttClient = AWSIoTPyMQTT.AWSIoTMQTTShadowClient(self.thingName) mqttClient.configureEndpoint(self.host, self.port) mqttClient.configureCredentials( self.rootCAPath, self.privateKeyPath, self.certificatePath ) mqttClient.configureAutoReconnectBackoffTime(1, 32, 20) mqttClient.configureConnectDisconnectTimeout(10) mqttClient.configureMQTTOperationTimeout(5) return mqttClient # Returns the local device's CPU usage, memory usage, and timestamp. def readPerformance(self): cpu = psutil.cpu_percent() memory = psutil.virtual_memory().percent timestamp = time.time() return {"cpu": cpu, "memory": memory, "timestamp": timestamp} # Prints the result of a shadow update call. def shadowUpdateCallback(self, payload, responseStatus, token): print("[{}]".format(self.thingName)) print("Update request {} {}\n".format(token, responseStatus)) # Configures debug logging for the AWS IoT Device SDK for Python. def configureLogging(): logger = logging.getLogger("AWSIoTPythonSDK.core") logger.setLevel(logging.DEBUG) streamHandler = logging.StreamHandler() formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) streamHandler.setFormatter(formatter) logger.addHandler(streamHandler) # Runs the performance shadow client with user arguments. if __name__ == "__main__": parser = configureParser() args = parser.parse_args() if args.enableLogging: configureLogging() thingClient = PerformanceShadowClient( args.thingName, args.host, args.port, args.rootCAPath, args.privateKeyPath, args.certificatePath, args.requestDelay, ) thingClient.run()
  8. 在命令行中运行 thing_performance.py及以下参数:

    • -n, --thingName - 您的事物名称,例如 SiteWiseTutorialDevice1

    • -e--endpoint— 您在本过程前面保存的自定义 AWS IoT 终端节点。

    • -r--rootCA— AWS IoT 根 CA 证书的路径。

    • -c--cert— 你的 AWS IoT 事物证书的路径。

    • -k--key— 你的 AWS IoT 东西证书私钥的路径。

    • -d, --requestDelay -(可选)每个设备影子更新之间等待的时间(以秒为单位)。默认值为 1 秒。

    • -v, --enableLogging -(可选)如果存在此参数,则脚本将从 AWS IoT Device SDK for Python打印调试消息。

    您的命令应类似于以下示例。

    python3 thing_performance.py \ --thingName SiteWiseTutorialDevice1 \ --endpoint identifier.iot.region.amazonaws.com \ --rootCA AmazonRootCA1.pem \ --cert device1/thing-id-certificate.pem.crt \ --key device1/thing-id-private.pem.key

    如果您正在为其他 AWS IoT 内容运行脚本,请相应地更新事物名称和证书目录。

  9. 尝试打开和关闭设备上的程序,看看CPU和内存使用情况如何变化。该脚本会打印每个读数CPU和内存使用情况读数。如果脚本成功将数据上传到 Device Shadow 服务,则脚本的输出应与以下示例类似。

    [SiteWiseTutorialDevice1] CPU: 24.6% Memory: 85.2% [SiteWiseTutorialDevice1] Update request e6686e44-fca0-44db-aa48-3ca81726f3e3 accepted
  10. 请按照以下步骤操作,验证脚本是否正在更新设备影子:

    1. 导航到 AWS IoT 控制台

    2. 在左侧导航窗格中选择所有设备,然后选择事物

    3. 选择你的东西,SiteWiseTutorialDevice

    4. 选择设备影子选项卡,选择经典影子,然后核实影子状态是否与以下示例类似。

      { "reported": { "cpu": 24.6, "memory": 85.2, "timestamp": 1579567542.2835066 } }

      如果你的东西的影子状态为空或者看起来不像前面的示例,请检查脚本是否正在运行并成功连接 AWS IoT。如果脚本在连接时继续超时 AWS IoT,请检查您的事物策略是否已根据本教程进行配置。

  11. 请按照以下步骤操作,验证规则操作是否正在将数据发送到 AWS IoT SiteWise:

    1. 导航到 AWS IoT SiteWise 控制台

    2. 在左侧导航窗格中,选择 资产

    3. 选择设备队列资产 (SiteWise Tutorial Device Fleet 1 1) 旁边的箭头以展开其资产层次结构,然后选择设备资产 (SiteWise Tutorial Device 1)。

    4. 选择 测量值

    5. 验证 最新值 单元格是否具有 CPU UsageMemory Usage 属性的值。

      屏幕截图中突出显示 “测量”。
    6. 如果 CPU UsageMemory Usage 属性没有最新值,请刷新页面。如果在几分钟后没有显示值,请参阅对规则进行故障排除 (AWS IoT SiteWise)

您已完成本教程。如果要探索数据的实时可视化效果,可以在 AWS IoT SiteWise Monitor中配置门户。有关更多信息,请参阅 使用监控数据 AWS IoT SiteWise Monitor。否则,你可以在命令提示符下按 CTRL+C 来停止设备客户端脚本。该 Python 程序发送的消息应该不足以产生费用,但完成后最好将其停止。

第 9 步:完成教程后清理资源

完成有关从 AWS IoT 事物中提取数据的教程后,请清理资源以免产生额外费用。

要删除中的分层资产 AWS IoT SiteWise
  1. 导航到 AWS IoT SiteWise 控制台

  2. 在左侧导航窗格中,选择 资产

  3. 在中删除资源时 AWS IoT SiteWise,必须先取消与它们的关联。

    请完成以下步骤以取消设备资产与设备队列资产之间的关联:

    1. 选择您的设备实例集资产 (SiteWise Tutorial Device Fleet 1)。

    2. 选择编辑

    3. 与此资产关联的资产 下,针对与此设备队列资产关联的每个设备资产,选择 取消关联

    4. 选择保存

      现在,您应该可以看到设备资产不再按层次结构进行组织。

  4. 选择您的设备资产 (SiteWise Tutorial Device 1)。

  5. 选择 删除

  6. 在确认对话框中,输入 Delete,然后选择 删除

  7. 对每个设备资产和设备实例集资产 (SiteWise Tutorial Device Fleet 1) 重复步骤 4 到 6。

要在中删除分层资产模型 AWS IoT SiteWise
  1. 导航到 AWS IoT SiteWise 控制台

  2. 如果还没有删除,请删除设备和设备队列资产。有关更多信息,请参阅前一过程。如果您拥有从某个模型创建的资产,则无法删除该模型。

  3. 在左侧导航窗格中,选择 模型

  4. 选择您的设备队列资产模型 (SiteWise Tutorial Device Fleet Model)。

    删除分层资产模型时,首先要删除父资产模型。

  5. 选择删除

  6. 在确认对话框中,输入 Delete,然后选择 删除

  7. 对设备资产模型 (SiteWise Tutorial Device Model) 重复步骤 4 到 6。

禁用或删除中的规则 AWS IoT Core
  1. 导航到 AWS IoT 控制台

  2. 在左侧导航窗格中,选择消息路由,然后选择规则

  3. 选择您的规则,然后选择删除

  4. 在确认对话框中,键入规则名称,然后选择删除