第 4 步:在设备上开发和测试组件 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

组件是在 Amazon IoT Greengrass 核心设备上运行的软件模块。组件使您能够将复杂应用程序作为离散的构建块来创建和管理这些应用程序,您可以将这些应用程序从一个 Greengrass 核心设备重复使用到另一个 Greengrass 核心设备。每个组件都由方和工件组成。

  • 食谱

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

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

  • 构件

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

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

    Amazon 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 Amazon 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 Amazon 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部分定义了一个默认为的参数worldMessageManifests部分定义了一个清单,它是一组适用于平台的生命周期指令和工件。例如,您可以定义多个清单,为不同的平台指定不同的安装说明。在清单中,该Lifecycle部分指示 Greengrass 核心设备以参数值作为参数运行 Hello World 脚本。Message

  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. 使用本地 Amazon IoT Greengrass CLI 来管理 Greengrass 核心设备上的组件。

    运行以下命令将组件部署到内 Amazon IoT Greengrass 核。将/greengrass/v2C:\greengrass\v2 替换为你的 Amazon IoT Greengrass V2 根文件夹,将 ~/greengrassv2 或 %USER PROFILE%\ 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和中的 Python 脚本的组件artifacts。该--merge选项添加或更新您指定的组件和版本。

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

    PowerShell
    gc C:\greengrass\v2\logs\greengrass.log -Tail 10 -Wait
  8. 修改本地组件以迭代和测试您的代码。hello_world.py在文本编辑器中打开,然后在第 4 行添加以下代码以编辑 Amazon 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"
    重要

    将组件上传到核心设备后,需要执行此步骤才能将其部署回核心设备 Amazon 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 组件已完成,你现在可以将其上传到 Amazon IoT Greengrass 云服务了。然后,您可以将该组件部署到 Greengrass 核心设备上。