亚马逊AWS官方博客

使用 AWS IoT TwinMaker 构建 IoT 设备的数字孪生并监控实时传感器数据(第 1 部分,共 2 部分)

数字孪生是物理系统的动态数字表示形式,它会动态更新以模仿物理系统的结构、状态和行为,从而推动业务成果。构建项目通常不是一件简单的任务 – 为了应对这一挑战,我们推出了一项新的服务,即  AWS IoT TwinMaker。AWS IoT TwinMaker 将来自设备传感器、视频源和业务应用程序等各种来源的数据联系起来,并创建知识图表以对实际系统进行建模,并从数字孪生中生成实时见解。一些 客户通过使用 AWS IoT TwinMaker,快速查明并处理设备和流程异常来优化维护计划,或为现场工作人员提供所有资源和运营数据的整合视图。 另一个常见使用案例是,通过监控有关房间内的温度、占用人数或空气质量的实时和历史数据,增强用户体验并提高建筑物内的占用者舒适度。本博客文章系列讨论了最后一种场景:实时监控房间的温度和湿度,并能够控制传感器的位置和状态。

为了模拟此场景,您将了解如何使用 AWS IoT TwinMaker 创建与收集温度和湿度数据的传感器互联的 Raspberry Pi 设备的数字孪生。您将 AWS IoT TwinMaker 与Amazon Managed Grafana 控制面板集成,可视化数字孪生与收集到的数据所在的 3D 环境,从而实时影响设备状态和 3D 模型表示。

第 1 部分(本博客文章)概述了解决方案、用于托管数据的时间序列数据库的设置以及 IoT 事物的配置,并介绍了传感器与 Raspberry Pi 设备的接线。

第 2 部分中,您将继续设置用于可视化数据的 Amazon Managed Grafana 控制面板。您将创建 AWS Lambda 函数来读取时间序列数据库中的数据,最重要的是,您将设置 AWS IoT TwinMaker 并将它与 Amazon Managed Grafana 控制面板集成,以显示数字孪生与将收集的实时数据。

解决方案概览

下图显示了高级架构概览。由连接到 Raspberry Pi 设备的传感器生成的数据通过 Python 脚本发送到 AWS IoT Core,后者通过 MQTT 和 HTTPS 协议轻松安全地连接设备。从这里开始,使用 AWS IoT Core 规则将数据流式传输到 Amazon Timestream 数据库。在 AWS IoT TwinMaker 方面,您将创建工作区环境,在其中定义虚拟实体及其 3D 模型表示。您还将创建一个组件,该组件使用 Lambda 函数从 Amazon Timestream 读取数据,以便数字孪生与来自传感器的数据同步。对于可视化部分,您将利用 AWS IoT TwinMaker Grafana 控制面板集成来创建一个控制面板,从而同时呈现数据与 3D 模型。可通过 AWS IAM Identity Center(AWS SSO 的后继产品)在 SSO 中访问此控制面板。 最后,您将创建 AWS IoT TwinMaker 规则,以便在温度或湿度低于或超过定义的阈值时,轻松地在控制面板中查看更改。

我们的解决方案的架构
图 1:解决方案的高级架构

先决条件

  • 一个 AWS 账户
  • Raspberry Pi 4 Model B,带预安装的操作系统 SD 卡和电源线
  • DHT 传感器(或类似传感器,用于检索温度/湿度数据)
  • 电路试验板,带公对公(M2M)跳线和电阻。如果您不打算像我一样使用扩展板,则还需要母对母(F2F)跳线(参见第 3 节“Raspberry Pi 设置“”中的注释)

实施

以下是您将在本博客文章系列中执行的大致步骤:

(第 1 部分)

  1. 设置时间序列数据库 Amazon Timestream,它将存储您的温度和湿度数据
  2. 使用证书和规则设置 AWS IoT 事物,确保收集到的数据将发送到数据库
  3. Raspberry Pi 设备配置:传感器接线和创建用于向 AWS 发送数据的 Python 文件

第 2 部分

  1. 设置将用于可视化数据的 Amazon Managed Grafana 控制面板
  2. 创建 AWS Lambda 函数以从 Timestream 中读取数据
  3. 设置 AWS IoT TwinMaker 角色、策略、存储桶目标和工作区。定义要从数据库读取的遥测组件。导入 3D 模型和定义场景
  4. 使用 AWS IoT TwinMaker 插件在 Amazon Managed Grafana 中创建控制面板。

重要说明:使用的某些服务尚未在所有 AWS 区域提供。确保在 us-east-1 或 eu-west-1 中创建所有资源(取决于您喜欢美国区域还是欧洲区域)。

1.  设置 Amazon Timestream 数据库

首先,我们针对温度和湿度数据配置数据库。很显然,该使用案例与收集时间序列数据相关,因此,此情况下的正确“工具”是 Amazon Timestream

创建数据库,请执行以下操作:

  1. 在 AWS 管理控制台中,选择 Timestream
  2. 选择 Create database(创建数据库)。
  3. 输入以下信息:
    • 配置:标准数据库
    • 名称:TempHumidityDatabase
  4. 选择 Create database(创建数据库)进行确认。


图 2:创建 Timestream 数据库

然后,创建一个表

  1. 选择 Tables(表)选项卡,然后选择 Create table(创建表)。
  2. 设置以下值:
    • 数据库名称:TempHumidityDatabase
    • 表名:TempHumidity
    • 数据留存:
      • 内存存储:1 天
      • 磁性存储:1 个月
  3. 创建表

数据库已准备好接收数据。

2.将 Raspberry Pi 连接到 AWS IoT Core

在本节中,您将通过创建策略和证书,然后将设备注册为“事物”来准备 Raspberry Pi 设备与 AWS IoT Core 之间的“连接”。接下来,您将定义规则以将数据发送到 Amazon Timestream 数据库并将潜在错误路由到 Amazon CloudWatch 中的日志。

创建策略

AWS IoT Core 策略是 JSON 文档,并遵循与 AWS Identity and Access Management(IAM)策略相同的约定。AWS IoT Core 策略允许您控制对 AWS IoT Core 数据面板的访问。AWS IoT Core 数据面板包含的操作可让您连接到 AWS IoT Core 消息代理、发送和接收 MQTT 消息以及接收或更新 AWS IoT 事物的设备影子。

现在,您将创建一个策略,允许发布和订阅特定的 IoT 主题(/raspberry/temphumid)。此策略将附加到 AWS IoT 事物所使用的证书。

  1. 打开 AWS 账户的 AWS 管理控制台。
  2. 导航到 AWS IoT Core 服务,然后从左侧菜单中选择 Manage > Security > Policies(管理 > 安全 > 策略)部分。
  3. 选择 Create Policy(创建策略)。
  4. 输入以下值:
    • 策略属性 → 策略名称:TempHumidityPolicy
    • 策略声明 → 策略文档 → 选择 JSON
  5. 粘贴以下 Json 并替换您的 AWS 区域和 AWS 账户
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": "arn:aws:iot:[AWS_REGION]:[AWS_ACCOUNT]:topic/raspberry/temphumid"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Subscribe",
      "Resource": "arn:aws:iot:[AWS_REGION]:[AWS_ACCOUNT]:topicfilter/raspberry/temphumid"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "*"
    }
  ]
}
  1. 选择 Create(创建)

创建 AWS IoT 事物并生成证书

  1. 在控制台中,选择 AWS IoT Core
  2. 在左侧的 Manage > All devices > Things(管理 > 所有设备 > 事物)部分中,选择 Create Things(创建事物)。
  3. 选择 Create a single thing(创建单个事物)。
  4. 输入事物的名称(例如 RaspberryPi),并将 Device Shadow(设备影子)部分保留为 No Shadow(无影子)。选择 Next(下一步)。
  5. 在 Configure Device Certificate(配置设备证书)中,选择 Auto-generate a new certificate (recommended)(自动生成新证书(推荐)),然后选择 Next(下一步)。
  6. 在 Policies(策略)中,选择之前创建的策略(TempHumidityPolicy),然后选择 Create Thing(创建事物)。
  7. 将 Device certificate(设备证书)(crt)、公有私有密钥 (pem.key) 与 Root CA 1 certificate(根 CA 1 证书)下载到本地计算机上的文件夹中。稍后,您将在 Raspberry Pi 设备上使用证书和私有密钥。您不需要公有密钥或 Amazon Root CA 3。
  8. 下载完成后,选择 Done(完成)。

图 3:已创建 IoT 事物来代表您的 Raspberry Pi
图 3:已创建 IoT 事物来代表您的 Raspberry Pi

创建规则以将数据发送到 Amazon Timestream,并将错误发送到 Amazon CloudWatch

  1. 在控制台中,选择 AWS IoT Core
  2. 在 Manage > Message Routing > Rules(管理 > 消息路由 > 规则)部分中,选择 Create rule(创建规则),然后输入:
    • 名称:TempHumidityRule
    • 描述:用于处理温度和湿度消息的规则。选择 Next(下一步)。
    • 规则查询语句:
      SELECT * FROM 'raspberry/temphumid'
    • 选择 Next(下一步)。
  3. 在 Rule actions(规则操作)面板中,选择 Timestream table – Write a message into the Timestream table(Timestream 表 – 将消息写入 Timestream 表)。接下来,选择之前创建的 Timestream 数据库 TempHumidDatabase 和表 TempHumidity

图 4:在 Timestream 上写入数据的 IoT Core 规则
图 4:在 Amazon Timestream 中写入数据的 IoT Core 规则

  1. 您需要输入维度名称(至少输入 1 个)。使用维度名称 DeviceName 和维度值 Rpi4 定义维度。
  2. 接下来,您需要创建一个 IAM 角色以允许 AWS IoT Core 服务访问数据库。选择 Create new role(创建新角色),然后输入以下名称:TempHumidityDBRole
  3. 在 Error action(错误操作)面板中,选择 Add error action(添加错误操作)。选择 CloudWatch logs – Send message data to CloudWatch logs(CloudWatch Logs – 将消息数据发送到 CloudWatch Logs)。
  4. 选择 Create CloudWatch Log group(创建 CloudWatch 日志组)– 您将在新选项卡中重定向到 CloudWatch。创建一个名为 TempHumidityRuleErrors 的日志组。您可以从左侧菜单 Logs > Logs group(日志 > 日志组)访问日志组。您可以将 Expiration(过期)保留为 never(从不)作为默认值。
  5. 返回 AWS IoT Core 并刷新 Log group name(日志组名称)列表,然后选择新创建的日志组。
  6. 创建一个 IAM 角色以允许该服务访问 CloudWatch:选择 Create new role(创建新角色),然后输入以下名称 TempHumidityCloudwatchRole

图 5:IoT Core 错误规则操作将错误发送到 Amazon CloudWatch
图 5:IoT Core 错误规则操作将错误发送到 Amazon CloudWatch

  1. 选择 Next(下一步)。
  2. 查看输入,并选择 Create(创建)来确认规则创建

您现已创建一个有效的 IoT 规则,可将传感器发送的温度和湿度数据路由到 Timestream 数据库。错误将发送到 Amazon CloudWatch Logs。

3.Raspberry Pi 设置

现在,您已定义数据库并准备好代表您的 Raspberry Pi 的 AWS IoT 事物,接下来可以将传感器连接到 Raspberry Pi,然后将一些数据发送到 AWS IoT Core。

连接传感器

在这篇博文中,我们使用 DHT11 传感器从环境中收集温度和湿度数据。DHT11 是一款基本的低成本数字温度和湿度传感器。它使用电容式湿度传感器和热敏电阻来测量周围的空气,并在数据引脚上生成数字信号

注意:本博客介绍了盒装式 Raspberry Pi 4 Model B。其中整齐地包装了 Pi 以防止受损,但不是必需的。扩展板也是如此,这使得使用电路试验板比直接使用 Raspberry Pi 引脚更轻松。如果您想将电线直接连接到设备,则不需要它。

DHT11 传感器将连接到电路试验板,如下图所示。

图 6:DHT11 传感器的 Raspberry Pi 接线图 6:DHT11 传感器的 Raspberry Pi 接线

图 7:带已接线的扩展板和 DHT11 传感器的 Raspberry Pi图 7:带已接线的扩展板和 DHT11 传感器的 Raspberry Pi

将数据从 Raspberry Pi 发送到 AWS IoT Core

现在,您已将传感器正确连接到 Raspberry Pi 设备,您将尝试向 AWS 发送一些温度和湿度数据。首先,您需要复制您在配置 AWS IoT 事物时下载的 Raspberry Pi 证书,以便 Raspberry Pi 知道在何处连接和发送生成的数据。可以通过几种方式连接 Raspberry Pi 和复制文件。您可以使用 SFTP 并将证书保存在 Raspberry Pi 安全文件夹中,稍后可以在代码中引用它们。

在将证书保存到位后,您可以进入下一步。您将在 Raspberry Pi 中创建一个 Python 文件,其中将包含以下 Python 代码以便从 DHT11 传感器收集数据。该脚本将收集数据并将它发送到 AWS。

在您的 Raspberry Pi 设备上,创建一个名为 temphumid.py 的文件并粘贴以下 Python 代码

from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json
import time
import board
import adafruit_dht

# MQTT config (clientID must be unique within the AWS account)
clientID = "XXXX-XXXX-XXXXX-XXXXX"
endpoint = "XXXXXXXX.[AWS_REGION].amazonaws.com" #Use the endpoint from the settings page in the IoT console
port = 8883
topic = "raspberry/temphumid"

# Init MQTT client
mqttc = AWSIoTMQTTClient(clientID)
mqttc.configureEndpoint(endpoint,port)
mqttc.configureCredentials("certs/AmazonRootCA1.pem","certs/raspberry-private.pem.key","certs/raspberry-certificate.pem.crt")

# Send message to the iot topic
def send_data(message):
    mqttc.publish(topic, json.dumps(message), 0)
    print("Message Published")

# Loop until terminated
def loop():
     #Init the dht device with data pin connected
     dhtDevice = adafruit_dht.DHT11(board.D17)

     while(True):
          try:
               temperature = dhtDevice.temperature
               humidity = dhtDevice.humidity
               print("Temp: {:.1f} C    Humidity: {}% ".format(temperature, humidity)) 
               
               message = {
                         'temperature': temperature,
                         'humidity': humidity
                         }
                    
               # Send data to topic
               send_data(message)

               time.sleep(3)
          except RuntimeError as error:     # Errors happen fairly often, DHT's are hard to read, just keep going
               print(error.args[0])

# Main
if __name__ == '__main__':
    print("Starting program...")
    try:
        # Connect
        mqttc.connect()
        print("Connect OK!")

        # Main loop called
        loop()
    except KeyboardInterrupt:
        mqttc.disconnect()
        exit()

我们来看看上面的代码:

  1. 导入了一些库(time、json)以及特定于 DHT 传感器的库 – 在此示例中为 Adafruit_DHT。您将需要安装依赖项(例如,sudo pip3 install Adafruit_DHT
  2. 通过为 MQTT 客户端设置一个名称(该名称在 AWS 账户中必须是唯一的),将 Raspberry Pi 连接到 AWS IoT Core。
  3. 定义了证书的来源,确保您的 Raspberry 设备包含证书。
  4. 创建了一个循环以:
    • 读取温度和湿度数据。
    • 创建由温度和湿度数据组成的消息。
    • 向 MQTT 主题发送数据。

正如您可能已注意到的,需要调整代码以包含您的唯一 clientID(您可以选择一个唯一的字符串),最重要的是您的 IoT endpoint。要找到它,请在控制台中选择 AWS IoT Core,然后导航到 Settings > Device data endpoint(设置 > 设备数据端点)。复制页面中显示的端点 URL 并将它粘贴到 Python 脚本中。

在 temphumid.py 文件中执行上述步骤后,请不要忘记依次保存运行该文件。如果一切设置正确,您将看到如下消息:


图 8:temphumid.py python 脚本的输出示例

要确保发送到 AWS IoT Core 的数据正确路由到 Amazon Timestream 数据库,请在控制台中打开 Amazon Timestream 并检查表 TempHumidity 是否包含数据。您可以导航到 Amazon Timestream 中的查询编辑器,通过选择表名称旁边的三个点来预览数据,然后选择 Preview Data(预览数据)– 默认情况下,它将检索最近 15 分钟的数据。

图 9:在 Amazon Timestream 中预览数据
图 9:在 Amazon Timestream 中预览数据

图 10:通过 AWS IoT Core 发送到 Amazon Timestream 的湿度和温度
图 10:通过 AWS IoT Core 发送到 Amazon Timestream 的湿度和温度

如果没有数据,请参阅您之前创建的 CloudWatch 日志组中的错误日志。

现在,您可以停止 Python 脚本。您稍后将再次运行它。

结论

在本系列的第 1 部分中,您为创建设备的数字孪生奠定了基础。您已设置完 Amazon Timestream 数据库,并已使用证书和规则创建 AWS IoT 事物,确保您的设备收集到的温度和湿度数据将发送到该数据库。此外,您已通过为传感器接线并使用 Python 脚本将数据发送到 AWS 来配置 Raspberry 设备。

第 2 部分中,您将继续设置用于可视化数据的 Amazon Managed Grafana 控制面板。您将创建 AWS Lambda 函数来读取 Timestream 数据库中的数据,最重要的是,您将设置 AWS IoT TwinMaker 并将它与 Amazon Managed Grafana 控制面板集成,以显示数字孪生 3D 模型与将收集的实时数据。


关于作者

Angelo Postiglione 是 AWS 的解决方案架构师。他与意大利的医疗保健客户和合作伙伴合作,帮助他们采用云技术,使用 AWS 构建可扩展且安全的解决方案。闲暇时,他喜欢探索世界上的新地方,在大自然中远足,弹吉他和打鼓。