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

步骤 12:将土壤含水量传感器读数发送到 AWS IoT

在此步骤中,您将使用 Python 编程语言,在 Raspberry Pi 上运行一些代码,从土壤含水量传感器套件中捕获数据并发送到 AWS IoT。

要执行此操作,您需要将在之前步骤中编写的一些代码集成到为步骤 5:模拟随机含水量moisture.py 中编写的一些代码中。

  1. 在 Raspberry Pi 上使用可用的代码编辑器打开您在 步骤 5:模拟随机含水量 中创建的 moisture.py 文件。

  2. 将一些代码从您编写的 gpio.py 文件添加到 moisture.py 文件,然后在 moisture.py 文件中对现有代码进行一些修改,如下所示。您应更新此语句之后的代码:

    # Create a programmatic representation of the shadow. myDeviceShadow = myShadowClient.createShadowHandlerWithName( SHADOW_HANDLER, True)

    最终代码如下所示:

    from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient import RPi.GPIO as GPIO import time # A random programmatic shadow client ID. SHADOW_CLIENT = "myShadowClient" # The unique hostname that AWS IoT generated for # this device. HOST_NAME = "yourhostname-ats.iot.us-east-1.amazonaws.com" # The relative path to the correct root CA file for AWS IoT, # that you have already saved onto this device. ROOT_CA = "AmazonRootCA1.pem" # The relative path to your private key file that # AWS IoT generated for this device, that you # have already saved onto this device. PRIVATE_KEY = "yourkeyid-private.pem.key" # The relative path to your certificate file that # AWS IoT generated for this device, that you # have already saved onto this device. CERT_FILE = "yourkeyid-certificate.pem.crt.txt" # A programmatic shadow handler name prefix. SHADOW_HANDLER = "MyRPi" # Automatically called whenever the shadow is updated. def myShadowUpdateCallback(payload, responseStatus, token): print() print('UPDATE: $aws/things/' + SHADOW_HANDLER + '/shadow/update/#') print("payload = " + payload) print("responseStatus = " + responseStatus) print("token = " + token) # Create, configure, and connect a shadow client. myShadowClient = AWSIoTMQTTShadowClient(SHADOW_CLIENT) myShadowClient.configureEndpoint(HOST_NAME, 8883) myShadowClient.configureCredentials(ROOT_CA, PRIVATE_KEY, CERT_FILE) myShadowClient.configureConnectDisconnectTimeout(10) myShadowClient.configureMQTTOperationTimeout(5) myShadowClient.connect() # Create a programmatic representation of the shadow. myDeviceShadow = myShadowClient.createShadowHandlerWithName( SHADOW_HANDLER, True) # Represents the GPIO21 pin on the Raspberry Pi. channel = 21 # Use the GPIO BCM pin numbering scheme. GPIO.setmode(GPIO.BCM) # Receive input signals through the pin. GPIO.setup(channel, GPIO.IN) while True: if GPIO.input(channel): myDeviceShadow.shadowUpdate( '{"state":{"reported":{"moisture":"low"}}}', myShadowUpdateCallback, 5) else: myDeviceShadow.shadowUpdate( '{"state":{"reported":{"moisture":"okay"}}}', myShadowUpdateCallback, 5) # Wait for this test value to be added. time.sleep(60)

    注意

    在上述代码中,请注意以下值与您的代码不匹配:

    1. yourhostname-ats.iot.us-east-1.amazonaws.com 将改为 AWS IoT 为您生成的 REST API 终端节点。

    2. AmazonRootCA1.pem 将改为 AWS IoT 的根 CA 的名称。

    3. yourkeyid-private.pem.key 将改为设备在 AWS IoT 中的私有密钥的名称。

    4. yourkeyid-certificate.pem.crt.txt 将改为设备在 AWS IoT 中根证书的名称。

    5. time.sleep(60) 中的 60 将为您希望生成各个新读数所等待的秒数。此数字越小,就可能会越频繁地收到电子邮件警报。

  3. 保存对 moisture.py 文件的更改。

  4. 在 PuTTY 或 SSH 的命令提示符中,或者从 Raspbian 中的终端,运行以下命令以使用 pip 程序,在 Raspberry Pi 上安装适用于 Python 的 AWS IoT 设备开发工具包:

    pip install AWSIoTPythonSDK
  5. 如果您尚未切换过去,请运行命令以切换到 deviceSDK 文件夹。然后,使用 Python 运行 moisture.py 文件,例如,cd /deviceSDK && python moisture.py

  6. 每 45–60 秒,将传感器模块上的探头放入一杯水中,或者从水中取出探头。每隔 60 秒,Python 根据探头是否在水中,将 "moisture": "low""moisture": "okay" 报告给 AWS IoT。只要 AWS IoT 收到低含水量读数,它就会触发规则,将警报通过 Amazon SNS 发送到您的电子邮件地址。

  7. 完成后,请按 Ctrl+C 以停止运行脚本。

  8. 现在,您可以将水杯替换为普通绿植。将传感器模块上的探头插入绿植的土壤中。调整传感器模块上的电位计以获取您所需的合适土壤含水量敏感度。

  9. moisture.py 文件中,将 time.sleep(60) 中的 60 更改为您希望检查土壤所间隔的秒数。例如,要每小时检查一次,请将 60 更改为 3600。要每天检查一次,请将 60 更改为 86400

  10. 通过运行命令 python moisture.py 来重启脚本 moisture.py

  11. 在经过了 time.sleep 中设置的秒数之后,Python 会将 "moisture": "low""moisture": "okay" 报告给 AWS IoT。这取决于传感器微控制器上的 DO 灯关闭还是打开、土壤含水量以及电位计的敏感度设置。只要 AWS IoT 收到低含水量读数,它就会触发规则,将警报通过 Amazon SNS 发送到您的电子邮件地址。

  12. 完成后,请按 Ctrl+C 以停止脚本运行。