

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

# 从事物中摄 AWS IoT SiteWise 取 AWS IoT 数据
<a name="ingest-data-from-iot-things"></a>

在本教程中，学习如何使用设备影子 AWS IoT SiteWise 从一组设备中提取数据。 AWS IoT *设备影子*是存储 AWS IoT 设备当前状态信息的 JSON 对象。有关更多信息，请参阅 *AWS IoT 开发人员指南*中的[设备影子服务](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html)。

完成本教程后，可以在中 AWS IoT SiteWise 根据 AWS IoT 内容设置操作。通过使用 AWS IoT 东西，您可以将您的操作与的其他有用功能集成 AWS IoT。例如，您可以配置 AWS IoT 功能以执行以下任务：
+ 配置其他规则以将数据流式传输到 [AWS IoT Events](https://docs.aws.amazon.com/iotevents/latest/developerguide/)、[Amazon DynamoDB](https://docs.aws.amazon.com/dynamodb/) 和其他 AWS 服务。有关更多信息，请参阅 *AWS IoT 开发人员指南* 中的[规则](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html)。
+ 使用 AWS IoT 队列索引服务对您的设备数据进行索引、搜索和汇总。有关更多信息，请参阅 *AWS IoT 开发人员指南*中的[实例集索引服务](https://docs.aws.amazon.com/iot/latest/developerguide/iot-indexing.html)。
+ 使用来审核和保护您的设备 AWS IoT Device Defender。有关更多信息，请参阅《AWS IoT 开发人员指南》**中的 [AWS IoT Device Defender](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/what-is-device-defender.html)。

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

**Topics**
+ [先决条件](#rule-ingestion-tutorial-prerequisites)
+ [步骤 1：创建 AWS IoT 策略](#ingestion-tutorial-create-iot-policy)
+ [步骤 2：创建和配置 AWS IoT 事物](#rule-tutorial-create-iot-thing)
+ [步骤 3：创建设备资产模型](#rule-tutorial-create-device-model)
+ [步骤 4：创建设备队列资产模型](#rule-tutorial-create-fleet-model)
+ [步骤 5：创建和配置设备资产](#rule-tutorial-create-device-assets)
+ [步骤 6：创建和配置设备队列资产](#rule-tutorial-create-fleet-asset)
+ [步骤 7：在 AWS IoT Core 中创建向设备资产发送数据的规则](#rule-tutorial-create-iot-rule)
+ [步骤 8：运行设备客户端脚本](#rule-tutorial-run-script)
+ [步骤 9：在完成教程后清理资源](#rule-tutorial-clean-up-resources)

## 先决条件
<a name="rule-ingestion-tutorial-prerequisites"></a>

要完成本教程，您需要：
+ 一个 AWS 账户。如果没有，请参阅[设置一个 AWS 账户](getting-started.md#set-up-aws-account)。
+ 一台运行Windows、macOSLinux、或Unix访问的开发计算机 AWS 管理控制台。有关更多信息，请参阅 [AWS 管理控制台入门](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/getting-started.html)。
+ 具有管理员权限的 AWS Identity and Access Management (IAM) 用户。
+ Python3 安装在您的开发计算机上或安装在要注册为 AWS IoT 事物的设备上。

## 步骤 1：创建 AWS IoT 策略
<a name="ingestion-tutorial-create-iot-policy"></a>

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

------
#### [ Console ]

使用以下步骤使用 AWS IoT Core 控制台创建 AWS IoT 策略：

**创建 AWS IoT 策略**

1. 登录到 [AWS 管理控制台](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/what-is.html)。

1. 查看支持[AWSAWS IoT SiteWise 的地区](https://docs.aws.amazon.com/general/latest/gr/iot-sitewise.html)。如有必要，切换到其中一个受支持的区域。

1. 导航至 [AWS IoT 控制台](https://console.aws.amazon.com/iot/)。如果出现**连接设备**按钮，请选择该按钮。

1. 在左侧导航窗格中，选择**安全**，然后选择**策略**。

1. 选择**创建**。

1. 输入 AWS IoT 策略的名称（例如**SiteWiseTutorialDevicePolicy**）。

1. 在**政策文档**下，选择 **JSON**，以 JSON 形式输入以下政策。*account-id*用您的地区*region*和账户 ID 替换和，例如**us-east-1**和**123456789012**。

------
#### [ JSON ]

****  

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

------

1. 选择**创建**。

------
#### [ AWS CLI ]

**重要**  
此策略使用通配符来保持在 AWS IoT SiteWise CLI 大小限制之内。要使用明确的主题路径获得更严格的权限，请改为通过 AWS IoT SiteWise 控制台创建策略。有关更多信息，请参阅选项卡上提供的物联网策略示例。

使用以下 AWS CLI 命令创建 IoT 策略：

```
aws iot create-policy \
  --policy-name "SiteWiseTutorialDevicePolicy" \
  --policy-document '{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": "iot:Connect",
        "Resource": "arn:aws:iot:region:account-id:client/SiteWiseTutorialDevice*"
      },
      {
        "Effect": "Allow",
        "Action": ["iot:Publish", "iot:Receive"],
        "Resource": [
          "arn:aws:iot:region:account-id:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*"
        ]
      },
      {
        "Effect": "Allow",
        "Action": "iot:Subscribe",
        "Resource": [
          "arn:aws:iot:region:account-id:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*"
        ]
      },
      {
        "Effect": "Allow",
        "Action": [
          "iot:GetThingShadow",
          "iot:UpdateThingShadow",
          "iot:DeleteThingShadow"
        ],
        "Resource": "arn:aws:iot:region:account-id:thing/SiteWiseTutorialDevice*"
      }
    ]
  }'
```

要验证您的策略是否已成功创建，请使用以下命令：

```
aws iot get-policy --policy-name "SiteWiseTutorialDevicePolicy"
```

------

此策略使您的 AWS IoT 设备能够使用 MQTT 消息建立连接并与设备影子通信。有关 MQTT 消息的更多信息，请参阅[什么是 MQTT？](https://aws.amazon.com/what-is/mqtt/)。为了与设备影子进行交互，你的 AWS IoT 东西会发布和接收有关以开头的主题的 MQTT 消息。`$aws/things/thing-name/shadow/`此策略包含一个称为 `${iot:Connection.Thing.ThingName}` 的事物策略变量。此变量用于替换每个主题中连接事物的名称。`iot:Connect` 语句限制了可以建立连接的设备，确保此事物策略变量只能替换以 `SiteWiseTutorialDevice` 开头的名称。

有关更多信息，请参阅*AWS IoT 开发人员指南*中的[事物策略变量](https://docs.aws.amazon.com/iot/latest/developerguide/iot-policy-variables.html)。

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

## 步骤 2：创建和配置 AWS IoT 事物
<a name="rule-tutorial-create-iot-thing"></a>

在此过程中，您将创建和配置 AWS IoT 事物。你可以将你的开发计算机指定为一个 AWS IoT 东西。随着学习的深入，请记住，您在本教程中掌握的原则可以应用到实际项目中。你可以灵活地在任何能够运行 AWS IoT SDK 的设备上制作和设置 AWS IoT 东西，包括 AWS IoT Greengrass 和 FreeRTOS。有关更多信息，请参阅《AWS IoT 开发人员指南》**中的 [AWS IoT SDKs](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html)。

------
#### [ Console ]

**创建和配置 AWS IoT 事物**

1. 打开命令行并运行以下命令，以便为本教程创建目录。

   ```
   mkdir iot-sitewise-rule-tutorial
   cd iot-sitewise-rule-tutorial
   ```

1. 运行以下命令为您的事物证书创建一个目录。

   ```
   mkdir device1
   ```

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

1. 导航至 [AWS IoT 控制台](https://console.aws.amazon.com/iot/)。

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

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

1. 在**创建事物**页面上，选择**创建单个事物**，然后选择**下一步**。

1. 在**指定事物属性**页面上，为 AWS IoT 事物输入名称（例如 **SiteWiseTutorialDevice1**），然后选择**下一步**。如果您正在创建其他事物，请相应地增加事物名称中的数字。
**重要**  
事物名称必须与您在*步骤 1：创建策略中创建的 AWS IoT 策略*中使用的名称相匹配。否则，您的设备将无法连接到 AWS IoT。

1. 在**配置设备证书-*可选***页面上，选择**自动生成新证书（推荐）**，然后选择**下一步**。证书可以安全 AWS IoT 地识别您的设备。

1. 在**将策略附加到证书-*可选***页面上，选择您在*步骤 1：创建策略中创建的 AWS IoT 策略*，然后选择**创建事物**。

1. 在**下载证书与密钥**对话框中，执行以下操作：

   1. 选择 **下载** 链接以下载事物的证书、公钥和私钥。将所有三个文件保存到您为事物证书创建的目录（例如，**iot-sitewise-rule-tutorial/device1**）。
**重要**  
这是您唯一一次可以下载在设备成功连接 AWS IoT时所需的事物证书和密钥。

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

1. 选择**完成**。

------
#### [ AWS CLI ]

按照以下步骤使用以下步骤创建和配置 AWS IoT 事物 AWS CLI：

1. 打开命令行并运行以下命令为本教程创建目录：

   ```
   mkdir iot-sitewise-rule-tutorial
   ```

1. 导航到教程目录：

   ```
   cd iot-sitewise-rule-tutorial
   ```

1. 运行以下命令为您的事物的证书创建目录：

   ```
   mkdir device1
   ```

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

1. 创建一 AWS IoT 件事：

   ```
   aws iot create-thing --thing-name "SiteWiseTutorialDevice1"
   ```
**重要**  
事物名称必须与您在步骤 1 中创建的策略中使用的名称模式相匹配。否则，您的设备将无法连接到 AWS IoT。

1. 创建证书并保存文件。记下输出中的证书 ARN-在接下来的步骤中你将需要它：

   ```
   aws iot create-keys-and-certificate \
       --set-as-active \
       --certificate-pem-outfile "device1/device.pem.crt" \
       --public-key-outfile "device1/public.pem.key" \
       --private-key-outfile "device1/private.pem.key"
   ```

1. 将您在步骤 1 中创建的策略附加到证书：

   ```
   aws iot attach-policy \
       --policy-name "SiteWiseTutorialDevicePolicy" \
       --target "certificate-arn"
   ```

1. 将证书附加到事物上：

   ```
   aws iot attach-thing-principal \
       --thing-name "SiteWiseTutorialDevice1" \
       --principal "certificate-arn"
   ```

1. 下载 Amazon 根 CA 证书：

   ```
   curl https://www.amazontrust.com/repository/AmazonRootCA1.pem > AmazonRootCA1.pem
   ```

   您的设备需要此证书才能成功连接 AWS IoT。

**重要**  
安全地存储您的证书和密钥。创建这些凭证后，您无法再次下载它们。

------

现在，你已经在电脑上注册了一个 AWS IoT 东西。现在，执行以下后续步骤之一：
+ 继续*步骤 3：在不创建其他 AWS IoT 内容的情况下创建设备资产模型*。您可以只使用一个事物完成本教程。
+ 在另一台计算机或设备上重复本部分中的步骤以创建更多 AWS IoT 事物。在本教程中，我们建议您按照此选项操作，以便从多个设备提取唯一的 CPU 利用率和内存使用量数据。
+ 在同一台设备（您的计算机）上重复此部分中的步骤以创建更多 AWS IoT 事物。每个 AWS IoT 设备都会从您的计算机接收相似的 CPU 和内存使用数据，因此请使用这种方法来演示从多个设备摄取非唯一数据。

## 步骤 3：创建设备资产模型
<a name="rule-tutorial-create-device-model"></a>

在此过程中，您将在中创建一个资产模型 AWS IoT SiteWise 来表示流式传输 CPU 和内存使用情况数据的设备。为处理表示设备组的资产中的数据，资产模型会在同一类型的多个资产之间强制提供一致信息。有关更多信息，请参阅 [为工业资产建模](industrial-asset-models.md)。

**创建表示设备的资产模型**

1. 导航至 [AWS IoT SiteWise 控制台](https://console.aws.amazon.com/iotsitewise/)。

1. 在左侧导航窗格中，选择 **模型**。

1. 选择 “**创建资产模型**”。

1. 在**模型详细信息**下，输入您的模型的名称。例如 **SiteWise Tutorial Device Model**。

1. 在 **测量定义** 下，执行以下操作：

   1. 在**名称** 中，输入 **CPU Usage**。

   1. 在 **单位** 中，输入 **%**。

   1. 将 **数据类型** 保留为 **双精度**。

   测量属性表示设备的原始数据流。有关更多信息，请参阅 [定义来自设备的数据流（测量值）](measurements.md)。

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

1. 在 **测量定义** 下的第二行中，执行以下操作：

   1. 在**名称** 中，输入 **Memory Usage**。

   1. 在 **单位** 中，输入 **%**。

   1. 将 **数据类型** 保留为 **双精度**。

1. 在 **指标定义** 下，执行以下操作：

   1. 在**名称**中，输入 **Average CPU Usage**。

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

   1. 在 **时间间隔** 中，输入 **5 minutes**。

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

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

1. 在 **指标定义** 下的第二行中，执行以下操作：

   1. 在**名称**中，输入 **Average Memory Usage**。

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

   1. 在 **时间间隔** 中，输入 **5 minutes**。

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

1. （可选）添加您对每个设备进行计算时感兴趣的其他指标。一些有趣的函数包括 `min` 和 `max`。有关更多信息，请参阅 [使用公式表达式](formula-expressions.md)。在*步骤 4：创建一个设备实例集资产模型*，您将创建一个父资产，该资产可以使用来自整个设备队列的数据来计算指标。

1. 选择**创建模型**。

## 步骤 4：创建设备队列资产模型
<a name="rule-tutorial-create-fleet-model"></a>

在此过程中，您将制作一个资产模型 AWS IoT SiteWise 来符号化您的设备集合。在此资产模型中，您构建一个结构，来支持将大量设备资产关联到一个总体队列资产。接下来，您在队列资产模型中设定指标，以整合来自所有已连接设备资产的数据。通过这种方法，您可以全面了解整个队列的整体表现。

**创建表示设备队列的资产模型**

1. 导航至 [AWS IoT SiteWise 控制台](https://console.aws.amazon.com/iotsitewise/)。

1. 在左侧导航窗格中，选择 **模型**。

1. 选择 “**创建资产模型**”。

1. 在**模型详细信息**下，输入您的模型的名称。例如 **SiteWise Tutorial Device Fleet Model**。

1. 在 **层次结构定义** 下，执行以下操作：

   1. 在 **层次结构名称** 中，输入 **Device**。

   1. 在 **层次结构模型** 中，选择您的设备资产模型 (**SiteWise Tutorial Device Model**)。

   层次结构定义父（队列）资产模型和子（设备）资产模型之间的关系。父资产可以访问子资产的属性数据。以后创建资产时，需要根据父资产模型中的层次结构定义将子资产与父资产关联。有关更多信息，请参阅 [资产层次结构表示设备关系](industrial-asset-models.md#asset-hierarchies)。

1. 在 **指标定义** 下，执行以下操作：

   1. 在**名称**中，输入 **Average CPU Usage**。

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

   1. 在 **时间间隔** 中，输入 **5 minutes**。

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

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

1. 在 **指标定义** 下的第二行中，执行以下操作：

   1. 在**名称**中，输入 **Average Memory Usage**。

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

   1. 在 **时间间隔** 中，输入 **5 minutes**。

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

1. （可选）添加您有兴趣跨设备队列计算的其他指标。

1. 选择**创建模型**。

## 步骤 5：创建和配置设备资产
<a name="rule-tutorial-create-device-assets"></a>

在此过程中，您将根据您的设备资产模型生成设备资产。然后，为每个测量属性定义属性别名。*属性别名*是唯一标识资产属性的字符串。之后，您可以使用别名而不是资产 ID 和属性 ID 来识别要上传数据的属性。有关更多信息，请参阅 [管理数据流 AWS IoT SiteWise](manage-data-streams.md)。

**创建设备资产并定义属性别名**

1. 导航至 [AWS IoT SiteWise 控制台](https://console.aws.amazon.com/iotsitewise/)。

1. 在左侧导航窗格中，选择 **资产**。

1. 选择 **创建资产**。

1. 在**模型信息**下，选择您的设备资产模型，**SiteWise Tutorial Device Model**。

1. 在**资产信息**下，输入资产的名称。例如 **SiteWise Tutorial Device 1**。

1. 选择**创建资产**。

1. 对于新设备资产，请选择 **编辑**。

1. **测量值不足**：

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

   1. 在 **Memory Usage** 下，输入 **/tutorial/device/SiteWiseTutorialDevice1/memory** 作为属性别名。

1. 选择**保存**。

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

## 步骤 6：创建和配置设备队列资产
<a name="rule-tutorial-create-fleet-asset"></a>

在此过程中，您基于设备队列资产模型构建设备队列资产。然后，您将单个设备资产关联到队列资产。通过这种关联，队列资产的指标属性能够编译和分析来自多个设备的数据。这些数据为您提供了整个队列整体表现的综合视图。

**创建设备队列资产并关联设备资产**

1. 导航至 [AWS IoT SiteWise 控制台](https://console.aws.amazon.com/iotsitewise/)。

1. 在左侧导航窗格中，选择 **资产**。

1. 选择 **创建资产**。

1. 在**模型信息**中，选择您的设备实例集资产模型 **SiteWise Tutorial Device Fleet Model**。

1. 在**资产信息**下，输入资产的名称。例如 **SiteWise Tutorial Device Fleet 1**。

1. 选择**创建资产**。

1. 对于新设备队列资产，请选择 **编辑**。

1. 在**关联到此资产的资产**下，选择**添加关联资产**，然后进行以下操作：

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

   1. 在 **资产** 下，选择您的设备资产 **SiteWise Tutorial Device 1**。

1. （可选）如果您之前创建了多个设备资产，请对您创建的每个设备资产重复步骤 8 到 10。

1. 选择**保存**。

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

## 步骤 7：在 AWS IoT Core 中创建向设备资产发送数据的规则
<a name="rule-tutorial-create-iot-rule"></a>

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

**使用 AWS IoT SiteWise 操作创建规则**

1. 导航至 [AWS IoT 控制台](https://console.aws.amazon.com/iot/)。

1. 在左侧导航窗格中，选择**消息路由**，然后选择**规则**。

1. 选择 **创建规则**。

1. 输入规则的名称和说明，然后选择**下一步**。

1. 输入以下 SQL 语句并选择**下一步**。

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

   此规则查询语句起作用，因为 Device Shadow 服务将影子更新发布到 `$aws/things/thingName/shadow/update/accepted`。有关设备影子的更多信息，请参阅 *AWS IoT 开发人员指南*中的[设备影子服务](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html)。

   在 `WHERE` 子句中，此规则查询语句使用 `topic(3)` 函数从主题的第三段获取事物名称。然后，该语句筛选掉名称与教程设备名称不匹配的设备。有关 AWS IoT SQL 的更多信息，请参阅《*AWS IoT 开发人员指南》*中的 [AWS IoT SQL 参考](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-reference.html)。

1. 在**规则操作**下，选择**向 AWS IoT SiteWise中的资产属性发送消息数据**，然后执行以下操作：

   1. 选择 **按属性别名**。

   1. 在 **属性别名** 中，输入 **/tutorial/device/\$1\$1topic(3)\$1/cpu**。

      `${...}`语法是一个替换模板。 AWS IoT 评估大括号内的内容。此替换模板从主题中提取事物名称，以创建对每个事物唯一的别名。有关更多信息，请参阅 *AWS IoT 开发人员指南*中的[替换模板](https://docs.aws.amazon.com/iot/latest/developerguide/iot-substitution-templates.html)。
**注意**  <a name="substitution-template-limitations"></a>
由于替换模板中的表达式与 `SELECT` 语句分开评估，因此您不能使用替换模板来引用使用 `AS` 子句创建的别名。除了支持的函数和运算符之外，您只能引用原始负载中存在的信息。

   1. 在**条目 ID -*可选***中，输入 **\$1\$1concat(topic(3), "-cpu-", floor(state.reported.timestamp))\$1**。

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

   1. 在**时间（以秒为单位）**中，输入 **\$1\$1floor(state.reported.timestamp)\$1**。

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

   1. 在**偏移量（以纳秒为单位）- *可选***中，输入 **\$1\$1floor((state.reported.timestamp % 1) \$1 1E9)\$1**。

      此替换模板通过转换设备报告时间戳的小数部分来计算时间（以秒为单位）的纳秒偏移量。
**注意**  
AWS IoT SiteWise 要求您的数据具有以 Unix 纪元时间为单位的当前时间戳。如果您的设备没有准确报告时间，您可以使用 [timestamp()](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-function-timestamp) 从 AWS IoT 规则引擎获取当前时间。此函数以毫秒为单位报告时间，因此您必须将规则操作的时间参数更新为以下值：  
在**时间（以秒为单位）**中，输入 **\$1\$1floor(timestamp() / 1E3)\$1**。
在 **偏移量 (以纳秒为单位)** 中，输入 **\$1\$1(timestamp() % 1E3) \$1 1E6\$1**。

   1. 在 **数据类型** 中，选择 **双精度**。

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

   1. 在**值**中，输入 **\$1\$1state.reported.cpu\$1**。在替换模板中，您可以使用 `.` 运算符从 JSON 结构中检索值。

   1. 选择 **添加条目** 为内存使用量属性添加新条目，然后再次为该属性完成以下步骤：

      1. 选择 **按属性别名**。

      1. 在 **属性别名** 中，输入 **/tutorial/device/\$1\$1topic(3)\$1/memory**。

      1. 在**条目 ID -*可选***中，输入 **\$1\$1concat(topic(3), "-memory-", floor(state.reported.timestamp))\$1**。

      1. 在**时间（以秒为单位）**中，输入 **\$1\$1floor(state.reported.timestamp)\$1**。

      1. 在**偏移量（以纳秒为单位）- *可选***中，输入 **\$1\$1floor((state.reported.timestamp % 1) \$1 1E9)\$1**。

      1. 在 **数据类型** 中，选择 **双精度**。

      1. 在**值**中，输入 **\$1\$1state.reported.memory\$1**。

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

   1. 输入角色名称，然后选择**创建**。

1. （可选）配置可用于对规则进行故障排除的错误操作。有关更多信息，请参阅 [排查规则问题（AWS IoT SiteWise）](troubleshoot-rule.md#rule-tutorial-troubleshoot-rule)。

1. 选择 **下一步**。

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

## 步骤 8：运行设备客户端脚本
<a name="rule-tutorial-run-script"></a>

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

**配置和运行设备客户端脚本**

1. 导航至 [AWS IoT 控制台](https://console.aws.amazon.com/iot/)。

1. 在左侧导航窗格底部，选择 **设置**。

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

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

   ```
   identifier.iot.region.amazonaws.com
   ```

1. 打开命令行并运行以下命令以导航到之前创建的教程目录。

   ```
   cd iot-sitewise-rule-tutorial
   ```

1. 运行以下命令来安装 AWS IoT Device SDK for Python。

   ```
   pip3 install AWSIoTPythonSDK
   ```

   有关更多信息，请参阅 *AWS IoT 开发人员指南*中的 [AWS IoT Device SDK for Python](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html#iot-python-sdk)。

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

   ```
   pip3 install psutil
   ```

   有关更多信息，请参阅 *Python Package 索引*中的 [psutil](https://pypi.org/project/psutil/)。

1. 在 `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()
   ```

1. 在命令行中运行 **thing\$1performance.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 内容运行脚本，请相应地更新事物名称和证书目录。

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

   ```
   [SiteWiseTutorialDevice1]
   CPU:    24.6%
   Memory: 85.2%
   
   [SiteWiseTutorialDevice1]
   Update request e6686e44-fca0-44db-aa48-3ca81726f3e3 accepted
   ```

1. 请按照以下步骤操作，验证脚本是否正在更新设备影子：

   1. 导航至 [AWS IoT 控制台](https://console.aws.amazon.com/iot/)。

   1. 在左侧导航窗格中选择**所有设备**，然后选择**事物**。

   1. 选择你的东西，**SiteWiseTutorialDevice**。

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

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

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

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

   1. 导航至 [AWS IoT SiteWise 控制台](https://console.aws.amazon.com/iotsitewise/)。

   1. 在左侧导航窗格中，选择 **资产**。

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

   1. 选择 **测量值**。

   1. 验证 **最新值** 单元格是否具有 **CPU Usage** 和 **Memory Usage** 属性的值。  
![\[屏幕截图中突出显示“测量值”。\]](http://docs.aws.amazon.com/zh_cn/iot-sitewise/latest/userguide/images/rule-ingestion/sitewise-view-measurement-values-console.png)

   1. 如果 **CPU Usage** 和 **Memory Usage** 属性没有最新值，请刷新页面。如果在几分钟后没有显示值，请参阅[排查规则问题（AWS IoT SiteWise）](troubleshoot-rule.md#rule-tutorial-troubleshoot-rule)。

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

## 步骤 9：在完成教程后清理资源
<a name="rule-tutorial-clean-up-resources"></a>

**注意**  
本教程中创建的资源是[将数据集成到 SiteWise Edge](integrate_sitewise_edge_mqtt.md) 教程所必需的。如果您计划完成此步骤，请不要清理此步骤中的资源。

完成有关从 AWS IoT 事物中提取数据的教程后，请清理资源以免产生额外费用。<a name="rule-tutorial-delete-assets"></a>

**要删除中的分层资产 AWS IoT SiteWise**

1. 导航到 [AWS IoT SiteWise 控制台](https://console.aws.amazon.com/iotsitewise/)

1. 在左侧导航窗格中，选择 **资产**。

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

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

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

   1. 选择**编辑**。

   1. 在 **与此资产关联的资产** 下，针对与此设备队列资产关联的每个设备资产，选择 **取消关联**。

   1. 选择**保存**。

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

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

1. 选择 **删除**。

1. 在确认对话框中，输入 **Delete**，然后选择 **删除**。

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

**要删除中的分层资产模型 AWS IoT SiteWise**

1. 导航至 [AWS IoT SiteWise 控制台](https://console.aws.amazon.com/iotsitewise/)。

1. 如果还没有删除，请删除设备和设备队列资产。有关更多信息，请参阅[前一过程](#rule-tutorial-delete-assets)。如果您拥有从某个模型创建的资产，则无法删除该模型。

1. 在左侧导航窗格中，选择 **模型**。

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

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

1. 选择**删除**。

1. 在确认对话框中，输入 **Delete**，然后选择 **删除**。

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

**禁用或删除中的规则 AWS IoT Core**

1. 导航至 [AWS IoT 控制台](https://console.aws.amazon.com/iot/)。

1. 在左侧导航窗格中，选择**消息路由**，然后选择**规则**。

1. 选择您的规则，然后选择**删除**。

1. 在确认对话框中，键入规则名称，然后选择**删除**。