将数据从 Amazon IoT 事物提取到 Amazon IoT SiteWise - Amazon IoT SiteWise
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将数据从 Amazon IoT 事物提取到 Amazon IoT SiteWise

你可以使用设备影子Amazon IoT SiteWise从一群Amazon IoT事物中提取数据。设备影子是存储Amazon IoT设备当前状态信息的 JSON 对象。有关更多信息,请参阅《Amazon IoT开发者指南》中的设备影子服务

完成本教程后,您可以基于 Amazon IoT 事物在 Amazon IoT SiteWise 中设置操作。通过使用 Amazon IoT 事物,您也可以将您的操作与其他有用的 Amazon IoT 功能轻松地集成。例如,您可以配置 Amazon IoT 功能来执行以下任务:

在本教程中,您将了解如何将数据从 Amazon IoT 事物的设备影子提取到 Amazon IoT SiteWise 中的资产。为此,您可以创建一个或多个 Amazon IoT 事物,并运行一个脚本,以使用 CPU 利用率和内存使用量数据更新每个事物的设备影子。在本教程中,您可以使用 CPU 利用率和内存使用量数据来模拟真实传感器数据。然后,您可以使用 Amazon IoT SiteWise 操作创建规则,该操作在每次更新事物的设备影子时将此数据发送到 Amazon IoT SiteWise 中的资产。有关更多信息,请参阅使用 Amazon IoT Core 规则提取数据

先决条件

要完成本教程,您需要:

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

  • 运行 Windows、macOS、Linux 或 Unix 的开发计算机(用于访问 Amazon Web Services Management Console)。有关更多信息,请参阅 Amazon Web Services Management Console 入门

  • 具有管理员权限的 IAM 用户。

  • Python 3 安装在您的开发计算机上,或安装在您想要注册为 Amazon IoT 事物的设备上。

步骤 1:创建Amazon IoT策略

在此步骤中,您将创建一个 Amazon IoT 策略以允许您的 Amazon IoT 事物访问本教程中使用的资源。

创建 Amazon IoT策略
  1. 登录到 Amazon Web Services Management Console

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

  3. 导航到 Amazon IoT 控制台。如果显示 Get started (开始) 按钮,请选择该按钮。

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

  5. 选择创建

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

  7. 政策文档下,选择 JSON 以 JSON 形式输入以下政策。将 regionaccount-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*" } ] }

    此策略允许您的 Amazon IoT 事物通过 MQTT 消息连接设备影子并与之交互。要与设备影子进行交互,您的 Amazon IoT 事物可以发布并接收以 $aws/things/thing-name/shadow/ 开头的主题的相关 MQTT 消息。此策略使用事物策略变量 ${iot:Connection.Thing.ThingName},用于替换每个主题中连接事物的名称。iot:Connect 语句限制了可以连接的事物,因此事物策略变量只能替换以 SiteWiseTutorialDevice 开头的名称。

    有关更多信息,请参阅《Amazon IoT开发人员指南》中的 “事物策略变量”。

    注意

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

  8. 选择创建

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

在此过程中,您可以创建和配置 Amazon IoT 事物。你可以将你的开发计算机注册为Amazon IoT一台设备来完成本教程。当你将本教程的概念应用到现实世界的应用程序时,你可以在任何可以运行 Amazon IoT SDK 的设备上创建和配置Amazon IoT东西,包括Amazon IoT Greengrass和 FreeRTOS。有关更多信息,请参阅《Amazon IoT开发者指南》中的 Amazon IoTSDK

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

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

    mkdir device1

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

  3. 导航到 Amazon IoT 控制台

  4. 在左侧导航窗格中,选择,然后选择 T hings(事物)。

  5. 如果显示 You don't have any things yet (您还没有任何事物) 对话框,请选择 Create a thing (创建事物)。否则,请选择 “创建事物”。

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

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

    重要

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

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

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

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

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

      重要

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

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

  11. 选择完成

您现在已经在您的计算机上注册了一个 Amazon IoT 事物。您现在可以执行以下后续步骤之一:

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

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

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

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

在此过程中,您将在 Amazon IoT SiteWise 中创建资产模型以表示流式传输 CPU 利用率和内存使用量数据的设备。资产模型在同一类型的多个资产之间强制提供一致信息,以便您可以处理表示设备组的资产中的数据。有关更多信息,请参阅工业资产建模

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

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

  3. 选择 Create model (创建模型)

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

  5. Measurement definitions (测量定义) 下,执行以下操作:

    1. Name (名称) 中,输入 CPU Usage

    2. Unit (单位) 中,输入 %

    3. Data type (数据类型) 保留为 Double (双精度)

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

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

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

    1. Name (名称) 中,输入 Memory Usage

    2. Unit (单位) 中,输入 %

    3. Data type (数据类型) 保留为 Double (双精度)

  8. Metric definitions (指标定义) 下,执行以下操作:

    1. Name (名称) 中,输入 Average CPU Usage

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

    3. Time interval (时间间隔) 中,输入 5 minutes

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

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

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

    1. Name (名称) 中,输入 Average Memory Usage

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

    3. Time interval (时间间隔) 中,输入 5 minutes

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

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

  12. 选择 Create model (创建模型)

步骤 4:创建设备机群资产模型

在此过程中,您将在 Amazon IoT SiteWise 中创建一个资产模型来表示您的设备队列。在此资产模型中,您可以定义一个层次结构,您可以使用该层次结构将许多设备资产关联到单个队列资产。然后,您可以在队列资产模型中定义指标,用于聚合来自所有关联设备资产的数据,从而获得有关队列整体的见解。

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

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

  3. 选择 Create model (创建模型)

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

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

    1. Hierarchy name (层次结构名称) 中,输入 Device

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

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

  6. Metric definitions (指标定义) 下,执行以下操作:

    1. Name (名称) 中,输入 Average CPU Usage

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

    3. Time interval (时间间隔) 中,输入 5 minutes

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

  7. 选择 Add metric (添加指标) 以添加第二个指标属性。

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

    1. Name (名称) 中,输入 Average Memory Usage

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

    3. Time interval (时间间隔) 中,输入 5 minutes

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

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

  10. 选择 Create model (创建模型)

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

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

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

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

  3. 选择 Create asset (创建资产)

  4. 在 “型号信息” 下,选择您的设备资产型号SiteWise Tutorial Device Model

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

  6. 选择 Create asset (创建资产)

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

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

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

  10. 选择保存

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

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

在此过程中,您可以从设备队列资产模型创建设备队列资产。然后,您可以将设备资产与队列资产关联,以便队列资产的指标属性可以聚合来自许多设备的数据。

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

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

  3. 选择 Create asset (创建资产)

  4. 在 “型号信息” 下,选择您的设备队列资产模型SiteWise Tutorial Device Fleet Model

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

  6. 选择 Create asset (创建资产)

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

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

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

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

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

  10. 选择保存

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

步骤 7:在 Amazon IoT Core 中创建规则以将数据发送到设备资产

在此过程中,您会在 Amazon IoT Core 中创建一个规则,用于解析设备影子通知消息并将数据发送到 Amazon IoT SiteWise 中的设备资产。每次设备影子更新时,Amazon IoT 都会发送 MQTT 消息。您可以创建一个规则,以便在设备影子基于 MQTT 消息发生变化时执行操作。在这种情况下,您希望处理更新消息以提取属性值并将其发送到 Amazon IoT SiteWise 中的设备资产。

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

  2. 在左侧导航窗格中,选择,然后选择 R ulice(规则

  3. 选择 Create rule(创建规则)。

  4. 为您的规则输入名称和描述,然后选择 Next(下一步)。

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

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

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

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

  6. 在 “规则操作” 下,选择 “将消息数据发送到中的资产属性”,Amazon IoT SiteWise然后执行以下操作:

    1. 选择 By property alias (按属性别名)

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

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

      注意

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

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

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

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

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

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

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

      注意

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

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

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

    6. Data type (数据类型) 中,选择 Double (双精度)

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

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

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

      1. 选择 By property alias (按属性别名)

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

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

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

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

      6. Data type (数据类型) 中,选择 Double (双精度)

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

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

    10. 输入角色名称并选择创建

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

  8. 选择下一步

  9. 查看设置,然后选择 “创建” 以创建规则。

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

由于您没有使用实际设备来报告数据,因此您可以运行脚本来使用 CPU 利用率和内存使用量更新 Amazon IoT 事物的设备影子,以模拟真实传感器数据。要运行脚本,必须首先安装所需的 Python 软件包。在此过程中,您将安装所需的 Python 软件包,然后运行设备客户端脚本。

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

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

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

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

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

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

    pip3 install AWSIoTPythonSDK

    有关更多信息,请参阅Amazon IoT Device SDK for PythonAmazon IoT开发者指南》

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

    pip3 install psutil

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

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

    from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient 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 = 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-您之前在此过程中保存的自定义Amazon IoT终端节点。

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

    • -c--cert-您的Amazon IoT事物证书的路径。

    • -k--key— 您的Amazon IoT事物证书私钥的路径。

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

    • -v--enableLogging—(可选)如果存在此参数,则脚本会打印来自的调试消息Amazon 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

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

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

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

    1. 导航到 Amazon IoT 控制台

    2. 在左侧导航窗格中,选择,然后选择 T h ings(事物)。

    3. 选择你的东西,SiteWiseTutorialDevice

    4. 选择 “设备阴影” 选项卡,选择 “经典阴影”,然后验证阴影状态是否与以下示例类似。

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

      如果事物的影子状态为空或与前一示例不同,请检查脚本是否正在运行并已成功连接到 Amazon IoT。如果脚本在连接到 Amazon IoT 时继续超时,请检查是否已根据本教程配置您的事物策略

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

    1. 导航到 Amazon IoT SiteWise 控制台

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

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

    4. 选择 Measurements (测量值)

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

      
                Amazon IoT SiteWise“SiteWise Tutorial Device1 个资产” 页面屏幕截图,高亮显示 “测量”。
    6. 如果 CPU UsageMemory Usage 属性没有最新值,请刷新页面。如果在几分钟后没有显示值,请参阅排查规则问题

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

第 9 步:教程结束后清理资源

完成本教程后,清理资源以避免产生额外费用。

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

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

  3. 删除 Amazon IoT SiteWise 中的资产时,必须先取消它们的关联。

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

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

    2. 选择编辑

    3. Assets associated to this asset (与此资产关联的资产) 下,针对与此设备队列资产关联的每个设备资产,选择 Disassociate (取消关联)

    4. 选择保存

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

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

  5. 选择删除

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

  7. 对每项设备资产和设备队列资产 (SiteWise Tutorial Device Fleet 1) 重复步骤 4 到 6。

删除 Amazon IoT SiteWise 中的分层资产模型
  1. 导航到 Amazon IoT SiteWise 控制台

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

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

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

    删除分层资产模型时,必须先删除父资产模型。

  5. 选择删除

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

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

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

  2. 在左侧导航窗格中,选择,然后选择 R ulice(规则

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

  4. 在确认对话框中,输入规则的名称,然后选择 Delete(删除)。

排查规则问题

如果 CPU 利用率和内存使用量数据未按预期方式显示在 Amazon IoT SiteWise 中,请按照该过程中的步骤排除规则故障。在该过程中,您将重新发布规则操作配置为错误操作,以在 MQTT 测试客户端中查看错误消息。您也可以将日志记录配置为 L CloudWatch ogs 以进行故障排除。有关更多信息,请参阅Amazon IoT SiteWise 规则操作故障排除

在规则中添加重新发布错误操作
  1. 导航到 Amazon IoT 控制台

  2. 在左侧导航窗格中,选择,然后选择 R ulice(规则

  3. 选择您之前创建的规则,然后选择 “编辑”

  4. 在 “错误操作-可选” 下,选择 “添加错误操作”。

  5. 选择,将消息重新发布到Amazon IoT。

  6. Topic (主题) 中,输入 sitewise/rule/tutorial/error。Amazon IoT Core 将错误消息重新发布到该主题。

  7. 选择之前创建的角色(例如,SiteWiseTutorialDeviceRuleRole

  8. 选择更新

在设置重新发布错误操作后,您可以在 Amazon IoT Core 上的 MQTT 测试客户端中查看错误消息。

在以下过程中,您在 MQTT 测试客户端中订阅错误主题。

订阅错误操作主题
  1. 导航到 Amazon IoT 控制台

  2. 在左侧导航页面中,选择 MQTT 测试客户端打开 MQTT 测试客户端。

  3. 在 “主题筛选器” 字段中,输入sitewise/rule/tutorial/error并选择 “订阅”。

出现错误消息时,查看任何错误消息中的 failures 阵列以诊断问题。有关可能的问题以及如何解决这些问题的更多信息,请参阅Amazon IoT SiteWise 规则操作故障排除

如果未显示错误,请检查是否启用了您的规则,以及您是否订阅了在重新发布错误操作中配置的相同主题。如果在执行此操作后仍未出现错误,请检查设备脚本是否正在运行并成功更新设备的影子。

注意

您还可以订阅设备的影子更新主题以查看 Amazon IoT SiteWise 操作解析的有效负载。为此,请订阅以下主题。

$aws/things/+/shadow/update/accepted