AWS IoT Greengrass
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

测试长时间生存的 Lambda 函数

长时间生存的 Lambda 函数在 AWS IoT Greengrass Core 启动时自动启动(并在单个容器/沙盒中运行)。为函数处理程序的每次调用保留在函数处理程序外部定义的任何变量或预处理。函数处理程序的多次调用将排队,直到执行完前面的调用。

以下代码来自 greengrassHelloWorldCounter.py。(为简洁起见,删除了代码注释。) 此 Lambda 函数类似于此模块第 1 部分中的 greengrassHelloWorld.py 函数,但它在函数处理程序之外定义 my_counter 变量。

import greengrasssdk import platform import time import json client = greengrasssdk.client('iot-data') my_platform = platform.platform() my_counter = 0 def function_handler(event, context): global my_counter my_counter = my_counter + 1 if not my_platform: client.publish( topic='hello/world/counter', payload=json.dumps({'message': 'Hello world! Sent from Greengrass Core. Invocation Count: {}'.format(my_counter)}) ) else: client.publish( topic='hello/world/counter', payload=json.dumps({'message': 'Hello world! Sent from Greengrass Core running on platform: {}. Invocation Count: {}' .format(my_platform, my_counter)}) ) time.sleep(20) return

在该步骤中,您将创建允许 Lambda 函数和 AWS IoT 交换 MQTT 消息的订阅。然后,部署组并测试函数。

  1. 在组配置页面中,选择 Subscriptions (订阅),然后选择 Add Subscription (添加订阅)

  2. 选择源下,选择 Lambda 选项卡,然后选择 Greengrass_HelloWorld_Counter

  3. 选择目标下,依次选择服务选项卡、IoT 云下一步

    
                            突出显示了“Greengrass_HelloWorld_Counter”、“IoT Cloud (IoT 云)”和“Next (下一步)”按钮的“Select your source and target (选择您的源和目标)”屏幕截图。
  4. 对于 Topic filter (主题筛选条件),输入 hello/world/counter。选择下一步,然后选择完成

    
                            突出显示了“hello/world/counter”和“Next (下一步)”按钮的屏幕截图。

    此单个订阅仅在一个方向:从 Greengrass_HelloWorld_Counter Lambda 函数到 AWS IoT。要从云中调用(或触发)此 Lambda 函数,您必须创建反方向的订阅。

  5. 按照步骤 1 至 4 添加另一个订阅,它使用以下值。此订阅允许 Lambda 函数从 AWS IoT 接收消息。此订阅在您从控制台向此函数发送一条测试消息后实施。

    • 对于源,选择服务,然后选择 IoT Cloud (IoT 云)

    • 对于目标,选择 Lambda,然后选择 Greengrass_HelloWorld_Counter

    • 对于主题筛选条件,输入 hello/world/counter/trigger

     

    
                            突出显示了“IoT Cloud (IoT 云)”、“hello/world/counter/trigger”、“Greengrass_HelloWorld_Counter”和“Finish (完成)”的“Confirm and save your Subscription (确认并保存您的订阅)”页面的屏幕截图。

    本主题筛选条件中使用了 /trigger 扩展,因为我们创建了两个订阅,我们不希望它们互相干扰。

  6. 确保 AWS IoT Greengrass 守护程序正在运行,如 将云配置部署到核心设备 中所述。

  7. 在组配置页面上,从 Actions (操作) 中选择 Deploy (部署)

    
                突出显示了“Deploy action”(部署操作) 的“Group”(组) 页面的屏幕截图。

    这会将组配置部署到您的 AWS IoT Greengrass Core 设备。有关问题排查帮助,请参阅AWS IoT Greengrass 问题排查

  8. 在您的部署完成后,返回到 AWS IoT Core 控制台主页并选择 Test (测试)

  9. 配置以下字段:

    • 对于订阅主题中,输入 hello/world/counter

    • 对于服务质量,选择 0

    • 对于 MQTT 负载显示,选择以字符串形式显示负载

     

    
                            突出显示了“hello/world/counter”、“0”、“以字符串形式显示负载”和“订阅主题”按钮的“订阅”屏幕截图。
  10. 选择订阅主题

    与此模块的第 1 部分不同,在您订阅 hello/world/counter 之后,您不应看到任何消息。这是因为发布到 hello/world/counter 主题的 greengrassHelloWorldCounter.py 代码位于函数处理程序中,该函数处理程序仅在调用函数时才运行。

    在此模块中,您将 Greengrass_HelloWorld_Counter Lambda 函数配置当它在 hello/world/counter/trigger 主题上收到 MQTT 消息时被调用。您可以通过检查相关订阅来查看它:

    
                            显示 greengrass_HelloWorld_Counter 相关订阅的“Subscriptions (订阅)”网页。

    Greengrass_HelloWorld_CounterIoT Cloud 订阅允许该函数在 hello/world/counter 主题上向 AWS IoT 发送消息。IoT CloudGreengrass_HelloWorld_Counter 订阅允许 AWS IoT 在 hello/world/counter/trigger 主题上向该函数发送消息。

    注意

    Greengrass_HelloWorld_Counter 忽略收到的消息的内容。它只运行 function_handler 中的代码,该代码向 hello/world/counter 主题发送消息。要查看此代码,请参阅 greengrassHelloWorldCounter.py 代码列表。

  11. 要测试较长的生命周期,请通过向 hello/world/counter/trigger 主题发布消息来调用 Lambda 函数。您可以使用默认消息。

    
                            默认“Hello from AWS IoT Core 控制台”(来自 AWS IoT 控制台的问候) 消息发送到 hello/world/counter/trigger,并突出显示“Publish to topic”(发布到主题) 按钮。

每次将消息发布到 hello/world/counter/trigger 主题时,my_counter 变量都会递增。此调用计数显示在从 Lambda 函数发送的消息中。由于函数处理程序包含 20 秒休眠周期 (time.sleep(20)),反复触发处理程序队列将需要排队等候来自 AWS IoT Greengrass Core 的响应。


                            显示“Invocation Count (调用计数)”从 1、2 和最后的 3 递增的屏幕截图。