第 4 步:在设备上开发和测试组件 - AWS IoT Greengrass

第 4 步:在设备上开发和测试组件

组件是在 AWS IoT Greengrass 核心设备上运行的软件模块。您可以利用这些组件创建和管理复杂的应用程序,并将其作为离散构建基块在不同的 Greengrass 核心设备之间重复使用。每个组件都包含配方构件

  • 配方

    每个组件都包含一个用于定义其元数据的配方文件。此配方还指定了组件的配置参数、组件依赖关系、生命周期和平台兼容性。组件生命周期指定了安装、运行和关闭组件时要运行的命令。有关更多信息,请参阅 AWS IoT Greengrass 组件配方参考

    您可以用 JSONYAML 格式定义配方。

  • 构件

    组件可以有任意数量的构件,即组件二进制文件。构件可以包括脚本、编译的代码、静态资源以及组件使用的任何其他文件。组件还可以使用组件依赖关系中的构件。

借助 AWS IoT Greengrass,您可以使用 Greengrass CLI 在 Greengrass 核心设备本地开发和测试组件,而无需与 AWS 云交互。完成本地组件后,您可以使用组件配方和构件在 AWS 云的 AWS IoT Greengrass 服务中创建该组件,然后将其部署到您的所有 Greengrass 核心设备上。有关组件的更多信息,请参阅开发 AWS IoT Greengrass 组件

本节中,您将学习如何在核心设备本地创建和运行 Hello World 基本组件。

在设备上开发 Hello World 组件
  1. 为您的组件创建一个文件夹,其中包含用于存放配方和构件的子文件夹。在 Greengrass 核心设备上运行以下命令来创建这些文件夹并更改为组件文件夹。将 ~/greengrassv2%USERPROFILE%\greengrassv2 替换为用于本地开发的文件夹路径。

    Linux or Unix
    mkdir -p ~/greengrassv2/{recipes,artifacts} cd ~/greengrassv2
    Windows Command Prompt (CMD)
    mkdir %USERPROFILE%\greengrassv2\\recipes, %USERPROFILE%\greengrassv2\\artifacts cd %USERPROFILE%\greengrassv2
    PowerShell
    mkdir ~/greengrassv2/recipes, ~/greengrassv2/artifacts cd ~/greengrassv2
  2. 使用文本编辑器创建配方文件,在该配方文件中定义组件的元数据、参数、依赖关系、生命周期和平台功能。在配方文件名中包含组件版本,以便您可以识别哪个配方对应哪个组件版本。您可以为配方选择 YAML 或 JSON 格式。

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

    JSON
    nano recipes/com.example.HelloWorld-1.0.0.json
    YAML
    nano recipes/com.example.HelloWorld-1.0.0.yaml
    注意

    AWS IoT Greengrass 使用组件的语义版本。语义版本遵循 major.minor.patch 编号系统。例如,版本 1.0.0 表示组件的第一个主要版本。有关更多信息,请参阅语义版本规范

  3. 将以下配方粘贴到文件中。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.HelloWorld", "ComponentVersion": "1.0.0", "ComponentDescription": "My first AWS IoT Greengrass component.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "Message": "world" } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "run": "python3 -u {artifacts:path}/hello_world.py {configuration:/Message}" } }, { "Platform": { "os": "windows" }, "Lifecycle": { "run": "py -3 -u {artifacts:path}/hello_world.py {configuration:/Message}" } } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.HelloWorld ComponentVersion: '1.0.0' ComponentDescription: My first AWS IoT Greengrass component. ComponentPublisher: Amazon ComponentConfiguration: DefaultConfiguration: Message: world Manifests: - Platform: os: linux Lifecycle: run: | python3 -u {artifacts:path}/hello_world.py "{configuration:/Message}" - Platform: os: windows Lifecycle: run: | py -3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"

    此配方的 ComponentConfiguration 部分定义了一个参数 Message,默认值为 worldManifests 部分定义了一个清单,它是一组适用于平台的生命周期指令和构件。例如,您可以定义多个清单,为不同平台指定不同的安装说明。在清单中,Lifecycle 部分指示 Greengrass 核心设备以 Message 参数值为参数运行 Hello World 脚本。

  4. 运行以下命令,为组件构件创建文件夹。

    Linux or Unix
    mkdir -p artifacts/com.example.HelloWorld/1.0.0
    Windows Command Prompt (CMD)
    mkdir artifacts\com.example.HelloWorld\1.0.0
    PowerShell
    mkdir artifacts\com.example.HelloWorld\1.0.0
    重要

    必须为构件文件夹路径使用以下格式。其中包括您在配方中指定的组件名称和版本。

    artifacts/componentName/componentVersion/
  5. 使用文本编辑器为 Hello World 组件创建 Python 脚本构件文件。

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

    nano artifacts/com.example.HelloWorld/1.0.0/hello_world.py

    将以下 Python 脚本复制并粘贴到文件中。

    import sys message = "Hello, %s!" % sys.argv[1] # Print the message to stdout, which Greengrass saves in a log file. print(message)
  6. 使用本地 AWS IoT Greengrass CLI 管理 Greengrass 核心设备上的组件。

    运行以下命令,以在 AWS IoT Greengrass 核心部署组件。将 /greengrass/v2C:\greengrass\v2 替换为您的 AWS IoT Greengrass V2 根文件夹,将 ~/greengrassv2%USERPROFILE%\greengrassv2 替换为您的组件开发文件夹。

    Linux or Unix
    sudo /greengrass/v2/bin/greengrass-cli deployment create \ --recipeDir ~/greengrassv2/recipes \ --artifactDir ~/greengrassv2/artifacts \ --merge "com.example.HelloWorld=1.0.0"
    Windows Command Prompt (CMD)
    C:\greengrass\v2\bin\greengrass-cli deployment create ^ --recipeDir %USERPROFILE%\greengrassv2\recipes ^ --artifactDir %USERPROFILE%\greengrassv2\artifacts ^ --merge "com.example.HelloWorld=1.0.0"
    PowerShell
    C:\greengrass\v2\bin\greengrass-cli deployment create ` --recipeDir ~/greengrassv2/recipes ` --artifactDir ~/greengrassv2/artifacts ` --merge "com.example.HelloWorld=1.0.0"

    此命令添加了使用 recipes 中配方和 artifacts 中 Python 脚本的组件。--merge 选项添加或更新了您指定的组件和版本。

  7. AWS IoT Greengrass Core 软件将组件进程中的 stdout 保存到 logs 文件夹中的日志文件中。运行以下命令,以验证 Hello World 组件是否运行并打印消息。

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

    type 命令将文件内容写入终端。多次运行此命令,以观察文件中的更改。

    PowerShell
    gc C:\greengrass\v2\logs\com.example.HelloWorld.log -Tail 10 -Wait

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

    Hello, world!
    注意

    如果文件不存在,可能是本地部署尚未完成。如果文件在 15 秒内不存在,则部署可能失败。例如,如果您的配方无效,则可能会发生这种情况。运行以下命令查看 AWS 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 命令将文件内容写入终端。多次运行此命令,以观察文件中的更改。

    PowerShell
    gc C:\greengrass\v2\logs\greengrass.log -Tail 10 -Wait
  8. 修改本地组件,以迭代和测试您的代码。在文本编辑器中打开 hello_world.py,然后在第 4 行添加以下代码,编辑 AWS IoT Greengrass 核心记录的消息。

    message += " Greetings from your first Greengrass component."

    hello_world.py 脚本现在应包含以下内容。

    import sys message = "Hello, %s!" % sys.argv[1] message += " Greetings from your first Greengrass component." # Print the message to stdout, which Greengrass saves in a log file. print(message)
  9. 运行以下命令,根据您的更改更新组件。

    Linux or Unix
    sudo /greengrass/v2/bin/greengrass-cli deployment create \ --recipeDir ~/greengrassv2/recipes \ --artifactDir ~/greengrassv2/artifacts \ --merge "com.example.HelloWorld=1.0.0"
    Windows Command Prompt (CMD)
    C:\greengrass\v2\bin\greengrass-cli deployment create ^ --recipeDir %USERPROFILE%\greengrassv2\recipes ^ --artifactDir %USERPROFILE%\greengrassv2\artifacts ^ --merge "com.example.HelloWorld=1.0.0"
    PowerShell
    C:\greengrass\v2\bin\greengrass-cli deployment create ` --recipeDir ~/greengrassv2/recipes ` --artifactDir ~/greengrassv2/artifacts ` --merge "com.example.HelloWorld=1.0.0"

    此命令使用最新的 Hello World 构件更新 com.example.HelloWorld 组件。

  10. 要重新启动组件,请运行以下命令。重新启动组件时,核心设备将使用最新的更改。

    Linux or Unix
    sudo /greengrass/v2/bin/greengrass-cli component restart \ --names "com.example.HelloWorld"
    Windows Command Prompt (CMD)
    C:\greengrass\v2\bin\greengrass-cli component restart ^ --names "com.example.HelloWorld"
    PowerShell
    C:\greengrass\v2\bin\greengrass-cli component restart ` --names "com.example.HelloWorld"
  11. 再次检查日志,验证 Hello World 组件是否打印了新消息。

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

    type 命令将文件内容写入终端。多次运行此命令,以观察文件中的更改。

    PowerShell
    gc C:\greengrass\v2\logs\com.example.HelloWorld.log -Tail 10 -Wait

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

    Hello, world! Greetings from your first Greengrass component.
  12. 您可以更新组件的配置参数来测试不同的配置。部署组件时,可以指定配置更新,该更新定义了如何在核心设备上修改组件的配置。您可以指定要重置为默认值的配置值以及要合并到核心设备上的新配置值。有关更多信息,请参阅 更新组件配置

    执行以下操作:

    1. 使用文本编辑器创建名为 hello-world-config-update.json 的文件,其中包含配置更新。

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

      nano hello-world-config-update.json
    2. 将以下 JSON 对象复制并粘贴到文件中。此 JSON 对象定义了配置更新,该更新将值 friend 合并到 Message 参数以更新其值。此配置更新未指定任何要重置的值。您无需重置 Message 参数,因为合并更新会替换现有值。

      { "com.example.HelloWorld": { "MERGE": { "Message": "friend" } } }
    3. 运行以下命令,将配置更新部署到 Hello World 组件。

      Linux or Unix
      sudo /greengrass/v2/bin/greengrass-cli deployment create \ --merge "com.example.HelloWorld=1.0.0" \ --update-config hello-world-config-update.json
      Windows Command Prompt (CMD)
      C:\greengrass\v2\bin\greengrass-cli deployment create ^ --merge "com.example.HelloWorld=1.0.0" ^ --update-config hello-world-config-update.json
      PowerShell
      C:\greengrass\v2\bin\greengrass-cli deployment create ` --merge "com.example.HelloWorld=1.0.0" ` --update-config hello-world-config-update.json
    4. 再次检查日志,验证 Hello World 组件是否输出了新消息。

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

      type 命令将文件内容写入终端。多次运行此命令,以观察文件中的更改。

      PowerShell
      gc C:\greengrass\v2\logs\com.example.HelloWorld.log -Tail 10 -Wait

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

      Hello, friend! Greetings from your first Greengrass component.
  13. 测试完组件后,将其从核心设备中移除。运行以下命令。

    Linux or Unix
    sudo /greengrass/v2/bin/greengrass-cli deployment create --remove="com.example.HelloWorld"
    Windows Command Prompt (CMD)
    C:\greengrass\v2\bin\greengrass-cli deployment create --remove="com.example.HelloWorld"
    PowerShell
    C:\greengrass\v2\bin\greengrass-cli deployment create --remove="com.example.HelloWorld"
    重要

    将组件上传到 AWS IoT Greengrass 后,需要执行此步骤才能将其部署回核心设备。否则,部署会因版本兼容性错误而失败,因为本地部署指定了不同的组件版本。

    运行以下命令并确认 com.example.HelloWorld 组件未出现在设备上的组件列表中。

    Linux or Unix
    sudo /greengrass/v2/bin/greengrass-cli component list
    Windows Command Prompt (CMD)
    C:\greengrass\v2\bin\greengrass-cli component list
    PowerShell
    C:\greengrass\v2\bin\greengrass-cli component list

您的 Hello World 组件已完成,您现在可以将其上传到 AWS IoT Greengrass 云服务了。然后,可以将组件部署到 Greengrass 核心设备。