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

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

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

Raspberry Pi GPIO 连接器

警告

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

Raspberry Pi GPIO 连接器控制 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 环境变量中。

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

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

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

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

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

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

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

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

    sudo pip install RPi.GPIO

GPIO 引脚序列

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

连接器无法验证您所配置的输入和输出引脚是否与 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 Greengrass 控制台中,您可以从组的连接器页面添加连接器。有关更多信息,请参阅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 文件。下载并解压适用于 Python 的 Amazon IoT Greengrass Core 软件开发工具包。然后,创建一个 zip 包,其中在根级别包含 PY 文件和 greengrasssdk 文件夹。此 zip 包是您上传到 Amazon Lambda 的部署包。

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

  3. 配置 Greengrass 组。

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

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

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

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

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

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

  4. 部署组。

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

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

示例

以下示例 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 Core 软件许可协议下发布。

更改日志

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

版本

更改

3

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

2

更新了连接器 ARN 以获得 Amazon Web Services 区域 支持。

1

首次发布。

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

另请参阅