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

Raspberry Pi GPIO 连接器

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

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

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

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

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

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

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

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

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

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

注意

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

此连接器具有以下版本。

版本

ARN

3

arn:aws-cn:greengrass:区域::/connectors/RaspberryPiGPIO/versions/3

2

arn:aws-cn:greengrass:区域::/connectors/RaspberryPiGPIO/versions/2

1

arn:aws:greengrass:区域::/connectors/RaspberryPiGPIO/versions/1

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

要求

此连接器具有以下要求:

Version 3
  • AWS 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 组的 OS 组许可选项。在 API 中,将 GroupOwnerSetting.AutoAddGroupOwner 属性设置为 true

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

    sudo pip install RPi.GPIO
Versions 1 - 2
  • AWS IoT Greengrass Core 软件 v1.7 or later。

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

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

  • Greengrass 组中的一个 本地设备资源,指向 Raspberry Pi 上的 /dev/gpiomem。如果在控制台内创建该资源,则必须选择自动添加拥有该资源的 Linux 组的 OS 组许可选项。在 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".

在 AWS IoT 控制台中显示名称: 输入 GPIO 引脚

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

类型:string

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

InputPollPeriod

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

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

在 AWS IoT 控制台中显示名称:输入 GPIO 轮询期

必需:false

类型:integer

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

OutputGpios

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

在 AWS IoT 控制台中显示名称:输出 GPIO 引脚

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

类型:string

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

GpioMem-ResourceId

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

注意

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

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

必需:true

类型:string

有效模式:.+

创建连接器示例 (AWS CLI)

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

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

该连接器中的 Lambda 函数具有很长的生命周期。

在 AWS IoT Greengrass 控制台 中,您可以从该组的 Connectors (连接器)页面添加一个连接器。有关更多信息,请参阅 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 函数。

注意

连接器入门(控制台)连接器入门 (CLI) 主题包含详细步骤,说明如何配置和部署示例 Twilio 通知连接器。

 

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

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

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

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

  3. 配置 Greengrass 组。

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

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

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

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

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

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

  4. 部署组。

  5. 在 AWS IoT 控制台 中,在 Test (测试) 页面上,订阅输出数据主题以查看连接器中的状态消息。示例 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 核心软件许可协议发布。

Changelog

下表描述了连接器每个版本中所做的更改。

版本

更改

3

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

2

用于 AWS 区域支持的已更新连接器 ARN。

1

首次发布。

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

另请参阅