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

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

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

您可以通过使用设备影子轻松地将数据从一系列 Amazon IoT 事物提取到 Amazon IoT SiteWise。设备影子是存储 Amazon IoT 设备当前状态信息的 JSON 对象。有关更多信息,请参阅 。Device Shadow 服务中的Amazon IoT开发人员指南.

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

  • 配置其他规则以将数据传输到Amazon IoT EventsAmazon DynamoDB, 和其他Amazon服务。有关更多信息,请参阅 。Rule中的Amazon IoT开发人员指南.

  • 使用 Amazon IoT 队列索引服务对设备数据进行索引、搜索和聚合。有关更多信息,请参阅 。队列索引服务中的Amazon IoT开发人员指南.

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

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

先决条件

要完成本教程,您需要:

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

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

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

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

创建 Amazon IoT 策略

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

创建 Amazon IoT策略

  1. 登录到 Amazon Web Services Management Console

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

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

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

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

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

  7. Add statements (添加声明) 下,选择 Advanced mode (高级模式) 以在 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. 请选择创建

创建和配置 Amazon IoT 事物

在此过程中,您可以创建和配置 Amazon IoT 事物。您可以将您的开发计算机注册为 Amazon IoT 事物以轻松完成本教程。将本教程的概念应用于实际应用程序时,您可以创建和配置实际应用程序。Amazon IoT任何可以运行Amazon IoTSDK,包括Amazon IoT Greengrass和 FreeRTOS。有关更多信息,请参阅 。Amazon IoT软件开发工具包中的Amazon IoT开发人员指南.

创建和配置 Amazon IoT 事物

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

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

    mkdir device1

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

  3. 导航到 Amazon IoT 控制台

  4. 在左侧导航窗格中选择 Manage (管理),然后选择 Things (事物)

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

  6. 创建 Amazon IoT事物页面上,选择创建单个事物

  7. Add your device to the device registry (将您的设备添加到设备注册表) 页面上,输入您的 Amazon IoT 事物的名称(例如 SiteWiseTutorialDevice1),然后选择 Next (下一步)。如果您正在创建其他事物,请相应地增加事物名称中的数字。

    重要

    事物名称必须与您在本教程前面部分创建的策略中使用的名称相匹配。否则,您的设备无法连接到 Amazon IoT。

    
            Amazon IoT “Add your device to the thing registry (将您的设备添加到事物注册表)”页面屏幕截图,其中突出显示了事物名称。
  8. 添加事物的证书页面上,选择创建证书。证书使 Amazon IoT 可以安全地识别您的设备。

    
            Amazon IoT “Add a certificate for your thing (添加事物的证书)”页面屏幕截图,其中突出显示了“Create certificate (创建证书)”。
  9. 选择 Download (下载) 链接以下载事物的证书、公钥和私钥。将所有三个文件保存到您为事物证书创建的目录(例如,iot-sitewise-rule-tutorial/device1)。

    重要

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

    
            Amazon IoT “Certificate created (证书已创建)”页面屏幕截图,其中突出显示了证书下载链接。
  10. 选择根 CA Download (下载) 链接以打开选择和下载根 CA 证书的文档页面。将根 CA 证书保存到 iot-sitewise-rule-tutorial。我们建议下载 Amazon 根 CA 1。

  11. 选择 Activate

  12. 选择附加策略

  13. Add a policy for your thing (为您的事物添加策略) 页面上,选择您之前在本教程中创建的策略 (SiteWiseTutorialDevicePolicy),然后选择 Register Thing (注册事物)

    
            Amazon IoT “添加事物的策略” 页面屏幕截图SiteWiseTutorialDevicePolicy“突出显示。
  14. 您现在已经在您的计算机上注册了一个 Amazon IoT 事物。您现在可以执行以下后续步骤之一:

    • 继续进入下一部分,而无需创建其他 Amazon IoT 事物。您可以只使用一个事物完成本教程。

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

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

创建设备资产模型

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

创建表示设备的资产模型

  1. 导航到 Amazon IoT SiteWise 控制台

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

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

  4. Asset model information (资产模型信息) 下输入名称(例如,SiteWise Tutorial Device Model)。

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

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

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

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

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

  6. 选择 Add measurement (添加测量) 以添加第二个测量属性。

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

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

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

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

    
            Amazon IoT SiteWise设备资产“Measurement definitions (测量定义)”屏幕截图。
  8. Metric definitions (指标定义) 下,执行以下操作:

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

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

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

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

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

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

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

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

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

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

    
            Amazon IoT SiteWise设备资产“Metric definitions (指标定义)”屏幕截图。
  11. (可选)添加您对每个设备进行计算时感兴趣的其他指标。一些有趣的函数包括 minmax。有关更多信息,请参阅 使用公式表达式。在下一部分中,您将创建一个父资产,该资产可以使用来自整个设备队列的数据来计算指标。

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

创建设备队列资产模型

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

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

  1. 导航到 Amazon IoT SiteWise 控制台

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

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

  4. Asset model information (资产模型信息) 下输入名称(例如,SiteWise Tutorial Device Fleet Model)。

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

    1. 选择 Add hierarchy (添加层次结构)

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

    3. 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 层次结构计算与队列资产关联的所有设备资产的平均内存使用量。

    
            Amazon IoT SiteWise设备队列资产“Metric definitions (指标定义)”屏幕截图。
  9. (可选)添加您有兴趣跨设备队列计算的其他指标。

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

创建和配置设备资产

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

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

  1. 导航到 Amazon IoT SiteWise 控制台

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

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

  4. Asset model (资产模型) 中,选择您的设备资产模型 SiteWise Tutorial Device Model

  5. Name (名称) 中,输入 SiteWise Tutorial Device 1

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

    
            Amazon IoT SiteWise “Create asset (创建资产)” 屏幕截图SiteWise Tutorial Device资产。
  7. 对于新设备资产,请选择 Edit (编辑)

    
            Amazon IoT SiteWise设备资产“Edit (编辑)”屏幕截图。
  8. CPU Usage 下,输入 /tutorial/device/SiteWiseTutorialDevice1/cpu 作为属性别名。在属性别名中包含 Amazon IoT 事物的名称,以便您可以使用单个 Amazon IoT 规则从您的所有设备中提取数据。

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

    
            Amazon IoT SiteWise设备队列资产属性别名屏幕截图。
  10. 选择 Save asset (保存资产)

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

创建和配置设备队列资产

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

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

  1. 导航到 Amazon IoT SiteWise 控制台

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

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

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

  5. Name (名称) 中,输入 SiteWise Tutorial Device Fleet 1

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

    
            Amazon IoT SiteWise “Create asset (创建资产)” 屏幕截图SiteWise Tutorial Device Fleet资产。
  7. 对于新设备队列资产,请选择 Edit (编辑)

    
            Amazon IoT SiteWise设备队列资产“Edit (编辑)”屏幕截图。
  8. Assets associated to this asset (与此资产关联的资产) 下,选择 Add associated asset (添加关联的资产)

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

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

    
            Amazon IoT SiteWise “与此资产关联的资产” 屏幕截图SiteWise Tutorial Device Fleet资产。
  11. 如果您之前创建了多个设备资产,请对您创建的每个设备资产重复步骤 8 到 10。

  12. 选择 Save asset (保存资产)

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

    
            Amazon IoT SiteWise设备资产层次结构屏幕截图。

在 中创建规则Amazon IoTCore 将数据发送到设备资产

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

使用 Amazon IoT SiteWise 操作创建规则

  1. 导航到 Amazon IoT 控制台

  2. 在左侧导航窗格中,选择行动,然后选择规则

  3. 如果显示您还没有任何规则对话框,请选择创建规则。否则,选择 Create

  4. 为您的规则输入名称和描述。

    
            Amazon IoT Core Create a rule (创建规则) 页面屏幕截图,并突出显示了 Name (名称) 和 Description (描述)。
  5. 输入以下规则查询语句。

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

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

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

  6. Set one or more actions (设置一个或多个操作) 下,选择 Add action (添加操作)

    
            Amazon IoT Core Create a rule (创建规则) 页面屏幕截图,并突出显示了 Add action (添加操作)。
  7. 在存储库的选择一个动作页面,选择将消息数据发送到中的资源属性Amazon IoT SiteWise来创建Amazon IoT SiteWise规则操作。

    
            Amazon IoT Core “Select an action (选择操作)” 页面屏幕截图Amazon IoT SiteWise突出显示了 Action
  8. 选择页面底部的 Configure action (配置操作)

  9. Configure action (配置操作) 页面上,完成以下步骤以设置 Amazon IoT SiteWise 规则操作:

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

      
                Amazon IoT Core “配置Amazon IoT SiteWiseAction (操作) 页面屏幕截
    2. Property alias (属性别名) 中,输入 /tutorial/device/${topic(3)}/cpu

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

      注意

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

    3. Entry ID (条目 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. Offset in nanos (偏移量 (以纳秒为单位)) 中,输入 ${floor((state.reported.timestamp % 1) * 1E9)}

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

      注意

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

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

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

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

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

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

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

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

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

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

      4. Offset in nanos (偏移量 (以纳秒为单位)) 中,输入 ${floor((state.reported.timestamp % 1) * 1E9)}

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

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

    9. Root asset name (根资产名称) 下,选择 Select (选择) 以展开列表,然后选择您的设备队列资产 (SiteWise Tutorial Device Fleet 1)。

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

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

      
                Amazon IoT Core “配置Amazon IoT SiteWise突出显示了 “Create role (创建角色)”。
    12. 选择添加操作

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

  11. 选择页面底部的 Create rule (创建规则) 以完成创建规则的过程。

运行设备客户端脚本

由于您没有使用实际设备来报告数据,因此您可以运行脚本来使用 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 Python中的Amazon IoT开发人员指南

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

    pip3 install psutil

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

  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. 在左侧导航窗格中选择 Manage (管理),然后选择 Things (事物)

    3. 选择您的事物 SiteWiseTutorialDevice1

    4. 在事物页面的左侧导航窗格中,选择 Shadow (影子)

    5. 验证 Shadow state (影子状态) 是否与以下示例类似。

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

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

    1. 导航到 Amazon IoT SiteWise 控制台

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

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

    4. 选择 Measurements (测量值)

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

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

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

在完成教程后清理资源

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

删除 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. 选择 Save asset (保存资产)

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

      
                Amazon IoT SiteWise展平的设备资产层次结构屏幕截图。
  4. 选择您的设备资产 (SiteWise Tutorial Device 1)。

  5. 请选择 Delete(删除)。

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

    
            Amazon IoT SiteWise “Delete asset (删除资产)”对话框屏幕截图。

    删除资产时,Amazon IoT SiteWise 会丢弃该资产的属性中的所有数据。

  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. 请选择 Delete(删除)。

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

    
            Amazon IoT SiteWise “Delete model (删除模型)”对话框屏幕截图。
  7. 对设备资产模型 (SiteWise Tutorial Device Model) 重复步骤 4 到 6。

在 Amazon IoT Core 中禁用或删除规则

  1. 导航到 Amazon IoT 控制台

  2. 在左侧导航窗格中,选择行动,然后选择规则

  3. 选择您的规则上的菜单,然后选择 Disable (禁用)Delete (删除)

    
            Amazon IoT打开并突出显示规则菜单的核心 “Rules (规则)” 页面屏幕截图,

排查规则问题

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

在规则中添加重新发布错误操作

  1. 导航到 Amazon IoT 控制台

  2. 在左侧导航窗格中,选择行动,然后选择规则

  3. 选择您以前创建的规则。

    
            Amazon IoT Core “Rules (规则)”页面屏幕截图。
  4. Error action (错误操作) 下面,选择 Add action (添加操作)

  5. 选择将消息重新发布到Amazon IoT话题.

    
            Amazon IoT Core “Select an action (选择操作)”页面屏幕截图,其中突出显示了“Republish (重新发布)”操作。
  6. 选择页面底部的 Configure action (配置操作)

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

    
            Amazon IoT Core “Configure Republish action (配置重新发布操作)”页面屏幕截图,其中突出显示了“Topic (主题)”。
  8. 选择 Select (选择) 以授予 Amazon IoT Core 访问权限来执行错误操作。

  9. 选择Select在您之前创建的角色旁边(例如,SiteWiseTutorialDeviceRuleRole)。

    
            Amazon IoT Core “Configure Republish action (配置重新发布操作)”页面屏幕截图,其中突出显示了角色选择按钮。
  10. 选择 Update Role (更新角色) 以在角色中添加其他权限。

    
            Amazon IoT“Configure Republish action (配置重新发布操作)” 页面屏幕截图,其中突出显示了
  11. 选择添加操作

  12. 选择控制台左上角的后退箭头以返回到 Amazon IoT 控制台主页。

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

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

订阅错误操作主题

  1. 导航到 Amazon IoT 控制台

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

  3. Subscription topic (订阅主题) 字段中,输入 sitewise/rule/tutorial/error 并选择 Subscribe to topic (订阅主题)

    
            Amazon IoT Core “MQTT client (MQTT 客户端)”页面屏幕截图,其中突出显示了“Subscribe to topic (订阅主题)”按钮。
  4. 出现错误消息时,查看任何错误消息中的 failures 阵列以诊断问题。有关可能的问题以及如何解决这些问题的更多信息,请参阅Amazon IoT SiteWise 规则操作故障排除

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

    注意

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

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