教程:开发一个延迟组件更新的 Greengrass 组件 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

教程:开发一个延迟组件更新的 Greengrass 组件

您可以完成本教程开发一个可延迟的组件 over-the-air 部署更新。将更新部署到设备时,您可能希望根据以下情况延迟更新:

  • 该设备的电池电量不足。

  • 设备正在运行一个不能中断的进程或作业。

  • 该设备的互联网连接有限或昂贵。

注意

一个组件是一个软件模块,在Amazon IoT Greengrass核心设备。组件使您能够创建和管理复杂的应用程序,将其作为独立的构造块,您可以从一个 Greengrass 核心设备重复使用到另一个 Greengrass 核心设备。

在本教程中,您将执行以下操作:

  1. 在开发计算机上安装 Greengrass 开发工具包 CLI (GDK CLI)。GDK CLI 提供的功能可帮助您开发自定义 Greengrass 组件。

  2. 开发一个 Hello World 组件,该组件可在核心设备的电池电量低于阈值时推迟组件更新。此组件使用订阅更新通知SubscribeToComponentUpdatesIPC operation. 当它收到通知时,它会检查电池电量是否低于可自定义的阈值。如果电池电量低于阈值,则会使用DeferComponentUpdateIPC operation. 您可以使用 GDK CLI 在开发计算机上开发此组件。

    注意

    该组件从您在核心设备上创建的文件中读取电池电量,以模拟真实电池,因此您可以在没有电池的核心设备上完成本教程。

  3. 将该组件发布到Amazon IoT Greengrass服务。

  4. 从部署该组件Amazon Web Services 云到 Greengrass 核心设备进行测试。然后,修改核心设备上的虚拟电池电量,并创建其他部署,以了解当电池电量不足时核心设备如何推迟更新。

您预计需要花费 20-30 分钟来完成本教程。

先决条件

要完成本教程,您需要:

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

  • 网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的Amazon Identity and Access Management(IAM) 具有管理员权限的用户。

  • 具有互联网连接的 Greengrass 核心设备。有关如何设置核心设备的更多信息,请参阅设置Amazon IoT Greengrass核心设备.

    • Python3.6 或更高版本已在核心设备上为所有用户安装,并已添加到PATH环境变量。在 Windows 上,你还必须为所有用户安装适用于 Windows 的 Python 启动器。

      重要

      在 Windows 中,默认情况下不会为所有用户安装 Python。安装 Python 时,必须自定义安装以将其配置为Amazon IoT Greengrass用于运行 Python 脚本的核心软件。例如,如果您使用图形化的 Python 安装程序,请执行以下操作:

      1. Select为所有用户安装启动器(推荐).

      2. 选择 Customize installation

      3. 选择 Next

      4. Select Install for all users.

      5. Select Add Python to environment variables.

      6. 选择安装

      有关更多信息,请参阅 。在窗口上使用 Python中的Python 3 文档.

  • 具有互联网连接的 Windows、macOS 或类似 Unix 的开发计算机。

    • Python在开发计算机上安装 3.6 或更高版本。

    • 饭桶在开发计算机上安装。

    • Amazon Command Line Interface(Amazon CLI) 已安装,并配置了开发计算机上的凭据。有关更多信息,请参阅 。安装、更新和卸载Amazon CLI配置Amazon CLI中的Amazon Command Line Interface用户指南.

      注意

      如果你使用 Raspberry Pi 或其他 32 位 ARM 设备,请安装Amazon CLIV1.Amazon CLI V2 不适用于 32 位 ARM 设备。有关更多信息,请参阅 。安装、更新和卸载Amazon CLI版本 1.

第 1 步:安装 Greengrass 开发工具包 CLI

这些区域有:Greengrass 开发工具包 CLI (GDK CLI)提供的功能可帮助您开发自定义 Greengrass 组件。您可以使用 GDK CLI 创建、构建和发布自定义组件。

如果您尚未安装 GDK CLI,请按照以下步骤进行安装。

安装 GDK CLI 的最新版本

  1. 在您的开发计算机上,运行以下命令,从以下命令安装最新版本的 GDK CLIGitHub知识库.

    python3 -m pip install -U git+https://github.com/aws-greengrass/aws-greengrass-gdk-cli.git@v1.1.0
  2. 运行以下命令,验证是否已成功安装 GDK CLI。

    gdk --help

    如果gdk命令未找到,请将其文件夹添加到 PATH。

    • 在 Linux 设备上,添加/home/MyUser/.local/bin转到 PATH,然后替换MyUser使用用户的名称。

    • 在 Windows 设备上,添加PythonPath\Scripts转到 PATH,然后替换PythonPath使用指向设备上 Python 文件夹的路径。

第 2 步:开发延迟更新的组件

在本节中,您将使用 Python 开发一个 Hello World 组件,该组件在核心设备的电池电量低于您在部署组件时配置的阈值时推迟组件更新。在此组件中,使用进程间通信 (IPC) 接口中的Amazon IoT Device SDKpython 的 v2。您可以改为使用SubscribeToComponentUpdatesIPC 操作,用于在核心设备收到部署时接收通知。然后,您可以将DeferComponentUpdateIPC 操作,根据设备的电池电量推迟或确认更新。

开发延迟更新的 Hello World 组件

  1. 在您的开发计算机上,创建一个组件源代码的文件夹。

    mkdir com.example.BatteryAwareHelloWorld cd com.example.BatteryAwareHelloWorld
  2. 使用文本编辑器创建一个名为的文件gdk-config.json. GDK CLI 从GDK CLI 配置文件,命名为gdk-config.json,以生成和发布组件。该配置文件存在于组件文件夹的根目录中。

    例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

    nano gdk-config.json

    将以下 JSON 复制到文件中。

    • Replace亚马逊用您的姓名。

    • Replaceus-west-2用Amazon Web Services 区域核心设备在哪里运行。GDK CLI 将组件发布在此Amazon Web Services 区域.

    • Replacegreengrass-component-artifacts使用要使用的 S3 存储桶前缀。当您使用 GDK CLI 发布组件时,GDK CLI 会将组件的项目上传到 S3 存储桶,该存储桶的名称由此值构成Amazon Web Services 区域,还有您的Amazon Web Services 账户使用以下格式的 ID:bucketPrefix-region-accountId.

      例如,如果您指定greengrass-component-artifactsus-west-2,还有您的Amazon Web Services 账户ID 是123456789012,GDK CLI 使用名为的 S3 存储桶greengrass-component-artifacts-us-west-2-123456789012.

    { "component": { "com.example.BatteryAwareHelloWorld": { "author": "Amazon", "version": "NEXT_PATCH", "build": { "build_system" : "zip" }, "publish": { "region": "us-west-2", "bucket": "greengrass-component-artifacts" } } }, "gdk_version": "1.0.0" }

    配置文件指定以下内容:

    • GDK CLI 将 Greengrass 组件发布到Amazon IoT Greengrass云服务。NEXT_PATCH指定选择下一个修补程序版本之后的下一个修补程序版本Amazon IoT Greengrass云服务。如果组件中没有版本Amazon IoT Greengrass云服务尚未,GDK CLI 使用1.0.0.

    • 组件的构建系统。当您将zip生成系统时,GDK CLI 会将组件的源代码打包到一个 ZIP 文件中,该文件将成为组件的单个构件。

    • 这些区域有:Amazon Web Services 区域GDK CLI 在其中发布Greengrass 组件。

    • GDK CLI 将组件构件上传的 S3 存储桶的前缀。

  3. 使用文本编辑器在名为的文件中创建组件源代码main.py.

    例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

    nano main.py

    将以下 Python 代码复制到文件中。

    import json import os import sys import time import traceback from pathlib import Path from awsiot.greengrasscoreipc.clientv2 import GreengrassCoreIPCClientV2 HELLO_WORLD_PRINT_INTERVAL = 15 # Seconds DEFER_COMPONENT_UPDATE_INTERVAL = 30 * 1000 # Milliseconds class BatteryAwareHelloWorldPrinter(): def __init__(self, ipc_client: GreengrassCoreIPCClientV2, battery_file_path: Path, battery_threshold: float): self.battery_file_path = battery_file_path self.battery_threshold = battery_threshold self.ipc_client = ipc_client self.subscription_operation = None def on_component_update_event(self, event): try: if event.pre_update_event is not None: if self.is_battery_below_threshold(): self.defer_update(event.pre_update_event.deployment_id) print('Deferred update for deployment %s' % event.pre_update_event.deployment_id) else: self.acknowledge_update( event.pre_update_event.deployment_id) print('Acknowledged update for deployment %s' % event.pre_update_event.deployment_id) elif event.post_update_event is not None: print('Applied update for deployment') except: traceback.print_exc() def subscribe_to_component_updates(self): if self.subscription_operation == None: # SubscribeToComponentUpdates returns a tuple with the response and the operation. _, self.subscription_operation = self.ipc_client.subscribe_to_component_updates( on_stream_event=self.on_component_update_event) def close_subscription(self): if self.subscription_operation is not None: self.subscription_operation.close() self.subscription_operation = None def defer_update(self, deployment_id): self.ipc_client.defer_component_update( deployment_id=deployment_id, recheck_after_ms=DEFER_COMPONENT_UPDATE_INTERVAL) def acknowledge_update(self, deployment_id): # Specify recheck_after_ms=0 to acknowledge a component update. self.ipc_client.defer_component_update( deployment_id=deployment_id, recheck_after_ms=0) def is_battery_below_threshold(self): return self.get_battery_level() < self.battery_threshold def get_battery_level(self): # Read the battery level from the virtual battery level file. with self.battery_file_path.open('r') as f: data = json.load(f) return float(data['battery_level']) def print_message(self): message = 'Hello, World!' if self.is_battery_below_threshold(): message += ' Battery level (%d) is below threshold (%d), so the component will defer updates' % ( self.get_battery_level(), self.battery_threshold) else: message += ' Battery level (%d) is above threshold (%d), so the component will acknowledge updates' % ( self.get_battery_level(), self.battery_threshold) print(message) def main(): # Read the battery threshold and virtual battery file path from command-line args. args = sys.argv[1:] battery_threshold = float(args[0]) battery_file_path = Path(args[1]) print('Reading battery level from %s and deferring updates when below %d' % ( str(battery_file_path), battery_threshold)) try: # Create an IPC client and a Hello World printer that defers component updates. ipc_client = GreengrassCoreIPCClientV2() hello_world_printer = BatteryAwareHelloWorldPrinter( ipc_client, battery_file_path, battery_threshold) hello_world_printer.subscribe_to_component_updates() try: # Keep the main thread alive, or the process will exit. while True: hello_world_printer.print_message() time.sleep(HELLO_WORLD_PRINT_INTERVAL) except InterruptedError: print('Subscription interrupted') hello_world_printer.close_subscription() except Exception: print('Exception occurred', file=sys.stderr) traceback.print_exc() exit(1) if __name__ == '__main__': main()

    此 Python 应用程序执行以下操作:

    • 从稍后将在核心设备上创建的虚拟电池电量文件中读取核心设备的电池电量。这个虚拟电池电量文件模仿真实的电池,因此您可以在没有电池的核心设备上完成本教程。

    • 读取电池阈值的命令行参数和虚拟电池电量文件路径。组件配方基于配置参数设置这些命令行参数,因此您可以在部署组件时自定义这些值。

    • 在中使用 IPC 客户端 V2Amazon IoT Device SDKPython 的 v2与Amazon IoT GreengrassCore 软件。与原始 IPC 客户端相比,IPC 客户端 V2 减少了在自定义组件中使用 IPC 所需编写的代码量。

    • 使用订阅更新通知SubscribeToComponentUpdatesIPC operation. 这些区域有:Amazon IoT Greengrass核心软件会在每次部署之前和之后发送通知。组件每次收到通知时都会调用以下函数。如果通知是针对即将到来的部署,则组件会检查电池电量是否低于阈值。如果电池电量低于阈值,则组件会使用DeferComponentUpdateIPC operation. 否则,如果电池电量不低于阈值,则组件确认更新,因此更新可以继续。

      def on_component_update_event(self, event): try: if event.pre_update_event is not None: if self.is_battery_below_threshold(): self.defer_update(event.pre_update_event.deployment_id) print('Deferred update for deployment %s' % event.pre_update_event.deployment_id) else: self.acknowledge_update( event.pre_update_event.deployment_id) print('Acknowledged update for deployment %s' % event.pre_update_event.deployment_id) elif event.post_update_event is not None: print('Applied update for deployment') except: traceback.print_exc()
      注意

      这些区域有:Amazon IoT Greengrass核心软件不发送本地部署的更新通知,因此您可以使用Amazon IoT Greengrass云服务来测试它。

  4. 使用文本编辑器在名为的文件中创建组件配方recipe.json要么recipe.yaml. 组件食谱定义了组件的元数据、默认配置参数和平台特定的生命周期脚本。

    JSON

    例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

    nano recipe.json

    将以下 JSON 复制到文件中。

    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "COMPONENT_NAME", "ComponentVersion": "COMPONENT_VERSION", "ComponentDescription": "This Hello World component defers updates when the battery level is below a threshold.", "ComponentPublisher": "COMPONENT_AUTHOR", "ComponentConfiguration": { "DefaultConfiguration": { "BatteryThreshold": 50, "LinuxBatteryFilePath": "/home/ggc_user/virtual_battery.json", "WindowsBatteryFilePath": "C:\\Users\\ggc_user\\virtual_battery.json" } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "Install": "python3 -m pip install --user awsiotsdk --upgrade", "Run": "python3 -u {artifacts:decompressedPath}/com.example.BatteryAwareHelloWorld/main.py \"{configuration:/BatteryThreshold}\" \"{configuration:/LinuxBatteryFilePath}\"" }, "Artifacts": [ { "URI": "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/com.example.BatteryAwareHelloWorld.zip", "Unarchive": "ZIP" } ] }, { "Platform": { "os": "windows" }, "Lifecycle": { "Install": "py -3 -m pip install --user awsiotsdk --upgrade", "Run": "py -3 -u {artifacts:decompressedPath}/com.example.BatteryAwareHelloWorld/main.py \"{configuration:/BatteryThreshold}\" \"{configuration:/WindowsBatteryFilePath}\"" }, "Artifacts": [ { "URI": "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/com.example.BatteryAwareHelloWorld.zip", "Unarchive": "ZIP" } ] } ] }
    YAML

    例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

    nano recipe.yaml

    将以下 YAML 复制到文件中。

    --- RecipeFormatVersion: "2020-01-25" ComponentName: "COMPONENT_NAME" ComponentVersion: "COMPONENT_VERSION" ComponentDescription: "This Hello World component defers updates when the battery level is below a threshold." ComponentPublisher: "COMPONENT_AUTHOR" ComponentConfiguration: DefaultConfiguration: BatteryThreshold: 50 LinuxBatteryFilePath: "/home/ggc_user/virtual_battery.json" WindowsBatteryFilePath: "C:\\Users\\ggc_user\\virtual_battery.json" Manifests: - Platform: os: linux Lifecycle: Install: python3 -m pip install --user awsiotsdk --upgrade Run: python3 -u {artifacts:decompressedPath}/com.example.BatteryAwareHelloWorld/main.py "{configuration:/BatteryThreshold}" "{configuration:/LinuxBatteryFilePath}" Artifacts: - URI: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/com.example.BatteryAwareHelloWorld.zip" Unarchive: ZIP - Platform: os: windows Lifecycle: Install: py -3 -m pip install --user awsiotsdk --upgrade Run: py -3 -u {artifacts:decompressedPath}/com.example.BatteryAwareHelloWorld/main.py "{configuration:/BatteryThreshold}" "{configuration:/WindowsBatteryFilePath}" Artifacts: - URI: "s3://BUCKET_NAME/COMPONENT_NAME/COMPONENT_VERSION/com.example.BatteryAwareHelloWorld.zip" Unarchive: ZIP

    此配方会指定以下内容:

    • 电池阈值的默认配置参数、Linux 核心设备上的虚拟电池文件路径以及 Windows 核心设备上的虚拟电池文件路径。

    • 网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的Install生命周期,安装最新版本的Amazon IoT Device SDKpython 的 v2。

    • 一个Run在中运行 Python 应用程序的生命周期main.py.

    • 占位符,例如COMPONENT_NAMECOMPONENT_VERSION,GDK CLI 在构建组件配方时替换信息。

    有关组件配方的更多信息,请参阅Amazon IoT Greengrass组件配方参考.

第 3 步:将组件发布到Amazon IoT Greengrass服务

在本节中,您将 Hello World 组件发布到Amazon IoT Greengrass云服务。在组件可用后Amazon IoT Greengrass云服务,则可以将其部署到核心设备。您可以使用 GDK CLI 将组件从开发计算机发布到Amazon IoT Greengrass云服务。GDK CLI 会为您上传组件的配方和工件。

将 Hello World 组件发布到Amazon IoT Greengrass服务

  1. 运行以下命令,使用 GDK CLI 构建组件。这些区域有:组件生成命令基于 GDK CLI 配置文件创建配方和工件。在该过程中,GDK CLI 将创建一个包含该组件源代码的 ZIP 文件。

    gdk component build

    您应看到类似于以下示例的消息。

    [2022-04-28 11:20:16] INFO - Getting project configuration from gdk-config.json [2022-04-28 11:20:16] INFO - Found component recipe file 'recipe.yaml' in the project directory. [2022-04-28 11:20:16] INFO - Building the component 'com.example.BatteryAwareHelloWorld' with the given project configuration. [2022-04-28 11:20:16] INFO - Using 'zip' build system to build the component. [2022-04-28 11:20:16] WARNING - This component is identified as using 'zip' build system. If this is incorrect, please exit and specify custom build command in the 'gdk-config.json'. [2022-04-28 11:20:16] INFO - Zipping source code files of the component. [2022-04-28 11:20:16] INFO - Copying over the build artifacts to the greengrass component artifacts build folder. [2022-04-28 11:20:16] INFO - Updating artifact URIs in the recipe. [2022-04-28 11:20:16] INFO - Creating component recipe in 'C:\Users\finthomp\greengrassv2\com.example.BatteryAwareHelloWorld\greengrass-build\recipes'.
  2. 运行以下命令,将组件发布到Amazon IoT Greengrass云服务。这些区域有:组件发布命令将组件的 ZIP 文件构件上传到 S3 存储桶。然后,它会在组件配方中更新 ZIP 文件的 S3 URI,并将配方上传到Amazon IoT Greengrass服务。在此过程中,GDK CLI 会检查 Hello World 组件的版本在Amazon IoT Greengrass云服务,因此它可以选择该版本之后的下一个补丁版本。如果该组件尚不存在,GDK CLI 将使用版本1.0.0.

    gdk component publish

    您应看到类似于以下示例的消息。输出会告诉你 GDK CLI 创建的组件的版本。

    [2022-04-28 11:20:29] INFO - Getting project configuration from gdk-config.json [2022-04-28 11:20:29] INFO - Found component recipe file 'recipe.yaml' in the project directory. [2022-04-28 11:20:29] INFO - Found credentials in shared credentials file: ~/.aws/credentials [2022-04-28 11:20:30] INFO - No private version of the component 'com.example.BatteryAwareHelloWorld' exist in the account. Using '1.0.0' as the next version to create. [2022-04-28 11:20:30] INFO - Publishing the component 'com.example.BatteryAwareHelloWorld' with the given project configuration. [2022-04-28 11:20:30] INFO - Uploading the component built artifacts to s3 bucket. [2022-04-28 11:20:30] INFO - Uploading component artifacts to S3 bucket: greengrass-component-artifacts-us-west-2-123456789012. If this is your first time using this bucket, add the 's3:GetObject' permission to each core device's token exchange role to allow it to download the component artifacts. For more information, see https://docs.aws.amazon.com/greengrass/v2/developerguide/device-service-role.html. [2022-04-28 11:20:30] INFO - Not creating an artifacts bucket as it already exists. [2022-04-28 11:20:30] INFO - Updating the component recipe com.example.BatteryAwareHelloWorld-1.0.0. [2022-04-28 11:20:31] INFO - Creating a new greengrass component com.example.BatteryAwareHelloWorld-1.0.0 [2022-04-28 11:20:31] INFO - Created private version '1.0.0' of the component in the account.'com.example.BatteryAwareHelloWorld'.
  3. 从输出中复制 S3 存储桶名称。您可以稍后使用存储桶名称来允许核心设备从此存储桶下载组件工件。

  4. (可选)在Amazon IoT Greengrass控制台来验证它是否成功上传。执行以下操作:

    1. Amazon IoT Greengrass控制台导航菜单,选择组件.

    2. 在存储库的组件页面上,选择My 组件选项卡,然后选择com.example.BatteryAwareHelloWorld.

      在该页面上,您可以查看该组件的配方以及有关该组件的其他信息。

  5. 允许核心设备访问 S3 存储桶中的组件项目。

    每个核心设备都有一个核心设备 IAM 角色这允许它与之互动Amazon IoT并将日志发送到Amazon云服务。默认情况下,此设备角色不允许访问 S3 存储桶,因此您必须创建并附加允许核心设备从 S3 存储桶检索组件工件的策略。

    如果设备的角色已允许访问 S3 存储桶,则可跳过此步骤。否则,创建一个允许访问的 IAM 策略,并将其附加到该角色,如下所示:

    1. IAM 控制台导航菜单,选择策略,然后选择创建策略.

    2. JSON 选项卡中,将占位符内容替换为以下策略。Replacegreengrass-component-artifacts-us-west-2使用 GDK CLI 上传了组件构件的 S3 存储桶的名称。

      例如,如果您指定了greengrass-component-artifactsus-west-2在 GDK CLI 配置文件中,以及你的Amazon Web Services 账户ID 是123456789012,GDK CLI 使用名为的 S3 存储桶greengrass-component-artifacts-us-west-2-123456789012.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::greengrass-component-artifacts-us-west-2-123456789012/*" } ] }
    3. 选择 Next:。标签,然后选择后续:审核

    4. 对于 Name (名称),请输入 MyGreengrassV2ComponentArtifactPolicy

    5. 选择 Create policy(创建策略)

    6. IAM 控制台导航菜单,选择角色,然后选择该核心设备的该角色的名称。您在安装时指定了此角色名称Amazon IoT GreengrassCore 软件。如果未指定名称,则默认为GreengrassV2TokenExchangeRole.

    7. UNDERPermissions (权限),选择添加权限,然后选择附加策略.

    8. 在存储库的添加权限页上,选中MyGreengrassV2ComponentArtifactPolicy您创建的策略,然后选择附加策略.

第 4 步:在核心设备上部署和测试组件

在本节中,您将组件部署到核心设备以测试其功能。在核心设备上,您可以创建虚拟电池电量文件来模仿真实的电池。然后,创建其他部署并观察核心设备上的组件日志文件,以查看组件延迟和确认更新。

部署和测试延迟更新的 Hello World 组件

  1. 使用文本编辑器创建虚拟电池电量文件。这个文件模仿真实的电池。

    • 在 Linux 核心设备上,创建一个名为/home/ggc_user/virtual_battery.json. 使用运行文本编辑器sudo权限。

    • 在 Windows 核心设备上,创建一个名为C:\Users\ggc_user\virtual_battery.json. 以管理员身份运行文本编辑器。

    例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

    sudo nano /home/ggc_user/virtual_battery.json

    将以下 JSON 复制到文件中。

    { "battery_level": 50 }
  2. 将 Hello World 组件部署到核心设备。执行以下操作:

    1. Amazon IoT Greengrass控制台导航菜单,选择组件.

    2. 在存储库的组件页面上,选择My 组件选项卡,然后选择com.example.BatteryAwareHelloWorld.

    3. 在存储库的com.example.BatteryAwareHelloWorld页面上,选择部署.

    4. 添加到部署,选择要修改的现有部署,或者选择创建新部署,然后选择下一步.

    5. 如果您选择创建新部署,请选择部署的目标核心设备或事物组。在存储库的指定目标页面,在部署目标,选择核心设备或事物组,然后选择下一步.

    6. 在存储库的选择组件页面上,请验证com.example.BatteryAwareHelloWorld组件已选中,选择下一步.

    7. 在存储库的配置组件页面,选择com.example.BatteryAwareHelloWorld中,然后执行以下操作:

      1. 选择配置组件.

      2. 配置com.example.BatteryAwareHelloWorldmodal, UNDER配置更新,在要合并的配置中,输入以下配置更新。

        { "BatteryThreshold": 70 }
      3. 选择确认关闭模态,然后选择下一步.

    8. 在存储库的确认高级设置页面,在部署策略部分,位置在下组件更新策略,confirm通知组件已选择。通知组件在创建新部署时默认选择。

    9. Review(检查)页上,选择 Deploy(部署)。

      部署最多需要一分钟才能完成。

  3. 这些区域有:Amazon IoT Greengrass核心软件将组件进程中的标准输出保存到日志文件中logsfolder。运行以下命令,验证 Hello World 组件是否运行并打印状态消息。

    Linux or Unix
    sudo tail -f /greengrass/v2/logs/com.example.BatteryAwareHelloWorld.log
    Windows Command Prompt (CMD)
    type C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log
    PowerShell
    gc C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log -Tail 10 -Wait

    您应看到类似于以下示例的消息。

    Hello, World! Battery level (50) is below threshold (70), so the component will defer updates.
    注意

    如果该文件不存在,则部署可能尚未完成。如果该文件在 30 秒内不存在,则部署可能失败。例如,如果核心设备无权从 S3 存储桶下载组件的项目,则可能会发生这种情况。运行以下命令以查看Amazon IoT Greengrass核心软件日志文件。此文件包含来自 Greengrass 核心设备的部署服务的日志。

    Linux or Unix
    sudo tail -f /greengrass/v2/logs/greengrass.log
    Windows Command Prompt (CMD)
    type C:\greengrass\v2\logs\greengrass.log

    这些区域有:type命令将文件内容写入终端。多次运行此命令以观察文件中的更改。

    这些区域有:type命令将文件内容写入终端。多次运行此命令以观察文件中的更改。

    PowerShell
    gc C:\greengrass\v2\logs\greengrass.log -Tail 10 -Wait
  4. 创建到核心设备的新部署,以验证组件是否延迟更新。执行以下操作:

    1. Amazon IoT Greengrass控制台导航菜单,选择部署.

    2. 选择您之前创建或修订的部署。

    3. 在部署页上,选择修订.

    4. 修改部署modal, 选择修改部署.

    5. 选择下一步在每步,然后选择部署.

  5. 运行以下命令,再次查看该组件的日志,并验证该组件是否延迟更新。

    Linux or Unix
    sudo tail -f /greengrass/v2/logs/com.example.BatteryAwareHelloWorld.log
    Windows Command Prompt (CMD)
    type C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log
    PowerShell
    gc C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log -Tail 10 -Wait

    您应看到类似于以下示例的消息。组件将更新延迟 30 秒,因此组件会重复打印此消息。

    Deferred update for deployment 50722a95-a05f-4e2a-9414-da80103269aa.
  6. 使用文本编辑器编辑虚拟电池电量文件,并将电池电量更改为高于阈值的值,以便继续部署。

    • 在 Linux 核心设备上,编辑名为的文件/home/ggc_user/virtual_battery.json. 使用运行文本编辑器sudo权限。

    • 在 Windows 核心设备上,编辑名为的文件C:\Users\ggc_user\virtual_battery.json. 以管理员身份运行文本编辑器。

    例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

    sudo nano /home/ggc_user/virtual_battery.json

    将电池电量更改为80.

    { "battery_level": 80 }
  7. 运行以下命令,再次查看该组件的日志,并验证该组件是否确认了更新。

    Linux or Unix
    sudo tail -f /greengrass/v2/logs/com.example.BatteryAwareHelloWorld.log
    Windows Command Prompt (CMD)
    type C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log
    PowerShell
    gc C:\greengrass\v2\logs\com.example.BatteryAwareHelloWorld.log -Tail 10 -Wait

    您应看到类似于以下示例的消息。

    Hello, World! Battery level (80) is above threshold (70), so the component will acknowledge updates. Acknowledged update for deployment f9499eb2-4a40-40a7-86c1-c89887d859f1.

您已完成本教程。Hello World 组件会根据核心设备的电池电量推迟或确认更新。有关本教程所探讨的主题的更多信息,请参阅以下内容: