Raspberry Pi 连接器 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon IoT Greengrass Version 12023 年 6 月 30 日进入延长寿命阶段。有关更多信息,请参阅Amazon IoT Greengrass V1维护政策。在此日期之后,Amazon IoT Greengrass V1不会发布提供功能、增强功能、错误修复或安全补丁的更新。在上运行的设备Amazon IoT Greengrass V1不会受到干扰,将继续运行并连接到云端。我们强烈建议你迁移到Amazon IoT Greengrass Version 2,它补充说重要的新功能支持其他平台

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

Raspberry Pi 连接器

警告

此连接器已移入延长使用寿命阶段, 和Amazon IoT Greengrass不会发布提供功能、现有功能增强功能、安全补丁或错误修复的更新。有关更多信息,请参阅 Amazon IoT Greengrass Version 1维护政策

Raspberry Pi连接器控制 Raspberry Pi 核心设备上的通用输入/输出 (GPIO) 引脚。

此连接器按指定间隔轮询输入引脚并将状态变化发布到 MQTT 主题。它还以 MQTT 消息形式接受来自用户定义的 Lambda 函数的读取和写入请求。写入请求用于将引脚设置为高压或低压。

连接器提供用于指定输入和输出引脚的参数。此行为在部署组之前配置。它无法在运行时更改。

  • 输入引脚可用于从外围设备接收数据。

  • 输出引脚可用于控制外围设备或将数据发送到外围设备。

您可以在许多情况下使用此连接器,例如:

  • 控制交通信号灯的绿色、黄色和红色 LED 指示灯。

  • 根据来自湿度传感器的数据控制风扇(连接到继电器)。

  • 顾客按下按钮向零售店中的员工发出警报。

  • 使用智能指示灯开关控制其他 IoT 设备。

注意

此连接器不适合具有实时要求的应用。持续时间很短的事件可能会被漏掉。

此连接器具有以下版本。

版本

ARN

3

arn:aws:greengrass:region::/connectors/RaspberryPiGPIO/versions/3

2

arn:aws:greengrass:region::/connectors/RaspberryPiGPIO/versions/2

1

arn:aws:greengrass:region::/connectors/RaspberryPiGPIO/versions/1

有关版本更改的信息,请参阅更改日志

要求

此连接器具有以下要求:

Version 3
  • Amazon IoT Greengrass Core 软件 v1.9.3 版或更高版本。

  • Python安装在核心设备上的 3.7 版并添加到 PATH 环境变量中。

  • 树莓派 4 型号 B 或 Raspberry Pi 3 型号 B/B+。您必须知道 Raspberry Pi 的引脚序列。有关更多信息,请参阅 GPIO 引脚序列

  • 一个本地设备资源在 Greengrass 组中指向/dev/gpiomem在 Raspberry Pi 上 如果您在控制台中创建资源,则必须选择自动添加拥有资源的 Linux 组的操作系统组权限选项。在 API 中,设置GroupOwnerSetting.AutoAddGroupOwner属性到true.

  • 安装在 Raspberry Pi 上的 RPi.GPIO 模块。在 Raspbian 中,默认情况下安装此模块。您可以使用以下命令重新安装它:

    sudo pip install RPi.GPIO
Versions 1 - 2
  • Amazon IoT Greengrass核心软件版本 v1.7 或更高版本。

  • Python安装在核心设备上的 2.7 版并添加到 PATH 环境变量中。

  • 树莓派 4 型号 B 或 Raspberry Pi 3 型号 B/B+。您必须知道 Raspberry Pi 的引脚序列。有关更多信息,请参阅 GPIO 引脚序列

  • 一个本地设备资源在 Greengrass 组中指向/dev/gpiomem在 Raspberry Pi 上 如果您在控制台中创建资源,则必须选择自动添加拥有资源的 Linux 组的操作系统组权限选项。在 API 中,设置GroupOwnerSetting.AutoAddGroupOwner属性到true.

  • 安装在 Raspberry Pi 上的 RPi.GPIO 模块。在 Raspbian 中,默认情况下安装此模块。您可以使用以下命令重新安装它:

    sudo pip install RPi.GPIO

GPIO 引脚序列

树莓派 GPIO 连接器根据底层片上系统 (SoC) 的编号方案引用 GPIO 引脚,而不是 GPIO 引脚的物理布局。在 Raspberry Pi 版本中,引脚的物理顺序可能会有所不同。有关更多信息,请参阅 。GPIO在 Raspberry Pi 文档中。

连接器无法验证您所配置的输入和输出引脚是否与 Raspberry Pi 的基础硬件正常匹配。如果引脚配置无效,连接器在尝试在设备上启动时,会返回一个运行时错误。要解决此问题,请重新配置连接器,然后重新部署。

注意

请确保 GPIO 引脚的外围设备布线正确,以防止组件损坏。

连接器参数

该连接器提供以下参数:

InputGpios

要配置为输入的 GPIO 引脚号的逗号分隔列表。可选择附加 U 以设置引脚的上拉电阻,或附加 D 以设置下拉电阻。示例:"5,6U,7D"

显示名称Amazon IoT控制台:输入 GPIO 引脚

必需:false. 您必须指定输入和/或输出引脚。

类型:string

有效模式:^$|^[0-9]+[UD]?(,[0-9]+[UD]?)*$

InputPollPeriod

每个轮询操作之间的间隔(以毫秒为单位),该操作检查输入 GPIO 引脚是否发生状态变化。最小值为 1。

此值取决于您所处的具体情况以及轮询的设备的类型。例如,值为 50 应该足够快速地检测到按钮按压。

显示名称Amazon IoT控制台:输入 GPIO 轮询期

必需:false

类型:string

有效模式:^$|^[1-9][0-9]*$

OutputGpios

要配置为输出的 GPIO 引脚号的逗号分隔列表。可选择附加 H 以设置高状态(值为 1),或附加 L 以设置低状态(值为 0)。示例:"8H,9,27L"

显示名称Amazon IoT控制台:输出 GPIO 引脚

必需:false. 您必须指定输入和/或输出引脚。

类型:string

有效模式:^$|^[0-9]+[HL]?(,[0-9]+[HL]?)*$

GpioMem-ResourceId

表示 /dev/gpiomem 的本地设备资源的 ID。

注意

连接器被授予对该资源的读写访问权限。

显示名称Amazon IoT控制台:/dev/gpiomem 设备的资源

必需:true

类型:string

有效模式:.+

创建连接器示例 (Amazon CLI)

以下 CLI 命令创建一个ConnectorDefinition初始版本包含Raspberry Pi GPIO 连接器。

aws greengrass create-connector-definition --name MyGreengrassConnectors --initial-version '{ "Connectors": [ { "Id": "MyRaspberryPiGPIOConnector", "ConnectorArn": "arn:aws:greengrass:region::/connectors/RaspberryPiGPIO/versions/3", "Parameters": { "GpioMem-ResourceId": "my-gpio-resource", "InputGpios": "5,6U,7D", "InputPollPeriod": 50, "OutputGpios": "8H,9,27L" } } ] }'
注意

此连接器中的 Lambda 函数具有长时间生存生命周期。

在Amazon IoT Greengrassconsole,则可以从该组的连接器页. 有关更多信息,请参阅 Greengrass 连接器入门(控制台)

输入数据

此连接器在两个 MQTT 主题上接受 GPIO 引脚的读取或写入请求。

  • 读取请求位于gpio/+/+/read 主题上。

  • 写入请求位于 gpio/+/+/write 主题上。

要发布到这些主题,请将 + 通配符分别替换为核心事物名称和目标引脚号。例如:

gpio/core-thing-name/gpio-number/read
注意

目前,在创建使用 Raspberry Pi GPIO 连接器的订阅时,您必须为主题中的至少一个 + 通配符指定值。

主题筛选条件:gpio/+/+/read

使用此主题指示连接器读取该主题中指定的 GPIO 引脚的状态。

连接器会将响应发布到相应的输出主题(例如 gpio/core-thing-name/gpio-number/state)。

消息属性

无。发送到此主题的消息将被忽略。

主题筛选条件:gpio/+/+/write

使用此主题向 GPIO 引脚发送写入请求。这会指示连接器将该主题中指定的 GPIO 引脚设置为低压或电压。

  • 0,将引脚设置为低压。

  • 1,将引脚设置为高压。

连接器会将响应发布到相应的输出 /state 主题(例如 gpio/core-thing-name/gpio-number/state)。

消息属性

值为 01,采用整数或字符串形式。

示例输入
0

输出数据

此连接器将数据发布到两个主题:

  • 高压或低压状态变化位于 gpio/+/+/state 主题上。

  • 错误位于 gpio/+/error 主题上。

主题筛选条件:gpio/+/+/state

使用此主题侦听输入引脚的状态变化,并响应读取请求。如果引脚处于低状态,连接器返回字符串 "0";如果引脚处于高状态,则返回 "1"

当发布到此主题时,连接器会将 + 通配符分别替换为核心事物名称和目标引脚。例如:

gpio/core-thing-name/gpio-number/state
注意

目前,在创建使用 Raspberry Pi GPIO 连接器的订阅时,您必须为主题中的至少一个 + 通配符指定值。

输出示例
0
主题筛选条件:gpio/+/error

使用此主题侦听错误。连接器因请求无效而发布到此主题(例如,当对输入引脚请求状态变化时)。

当发布到此主题,连接器会将 + 通配符替换为核心事物名称。

输出示例
{ "topic": "gpio/my-core-thing/22/write", "error": "Invalid GPIO operation", "long_description": "GPIO 22 is configured as an INPUT GPIO. Write operations are not permitted." }

用法示例

使用以下概括步骤设置可用于尝试连接器的示例 Python 3.7 Lambda 函数。

注意
  1. 确保满足连接器的要求

  2. 创建并发布将输入数据发送到连接器的 Lambda 函数。

    示例代码保存为 PY 文件。下载并解压缩Amazon IoT Greengrass适用于 Python 的核心. 然后,创建一个 zip 包,其中在根级别包含 PY 文件和 greengrasssdk 文件夹。此 zip 包是您上传到的部署包Amazon Lambda.

    创建 Python 3.7 Lambda 函数后,发布函数版本并创建别名。

  3. 配置 Greengrass 组。

    1. 通过函数的别名添加 Lambda 函数(推荐)。将 Lambda 生命周期配置为长时间生存(或"Pinned": true在 CLI 中)。

    2. 添加所需的本地设备资源并授予对 Lambda 函数的读/写访问权限。

    3. 添加连接器并配置其参数

    4. 添加允许连接器接收输入数据并针对支持的主题筛选条件发送输出数据的订阅。

      • 将 Lambda 函数设置为源,将连接器设置为目标,并使用支持的输入主题筛选条件。

      • 将连接器设置为源,将 Amazon IoT Core 设置为目标,并使用支持的输出主题筛选条件。您可以使用此订阅查看状态消息Amazon IoT控制台。

  4. 部署组。

  5. 在Amazon IoT控制台,在测试页面上,订阅输出数据主题以查看连接器中的状态消息。示例 Lambda 函数是长时间生存的,并且在部署组后立即开始发送消息。

    完成测试后,您可以将 Lambda 生命周期设置为按需(或"Pinned": false在 CLI 中)并部署组。这会阻止函数发送消息。

示例

以下示例 Lambda 函数将向连接器发送输入消息。此示例发送一组输入 GPIO 引脚的读取请求。它显示了如何使用核心事物名称和引脚号构建主题。

import greengrasssdk import json import os iot_client = greengrasssdk.client('iot-data') INPUT_GPIOS = [6, 17, 22] thingName = os.environ['AWS_IOT_THING_NAME'] def get_read_topic(gpio_num): return '/'.join(['gpio', thingName, str(gpio_num), 'read']) def get_write_topic(gpio_num): return '/'.join(['gpio', thingName, str(gpio_num), 'write']) def send_message_to_connector(topic, message=''): iot_client.publish(topic=topic, payload=str(message)) def set_gpio_state(gpio, state): send_message_to_connector(get_write_topic(gpio), str(state)) def read_gpio_state(gpio): send_message_to_connector(get_read_topic(gpio)) def publish_basic_message(): for i in INPUT_GPIOS: read_gpio_state(i) publish_basic_message() def lambda_handler(event, context): return

许可证

Raspberry Pi GPIO; 连接器包含以下第三方软件/许可:

此连接器在Greengrass 核心软件许可协议.

更改日志

下表介绍连接器各个版本的更改。

版本

更改

3

已将 Lambda 运行时升级到 Python 3.7,这会更改运行时要求。

2

为更新连接器 ARNAmazon Web Services 区域支持。

1

首次发布。

Greengrass 组每次只能包含连接器的一个版本。有关升级连接器版本的信息,请参阅升级连接器版本

另请参阅