Help us understand the problem. What is going on with this article?

Raspberry PiでAWS IoT Coreと接続し、GPIO制御をしてみた

More than 1 year has passed since last update.

はじめに

外出時に家電をリモコン制御してみたいと思い、Raspberry Piを買ってみました。
まずはお試しとして、AWSのIoT Coreと連動させ、GPIOの制御ができるか試してみました。

環境

Raspberry Pi

  • Raspberry Pi 3 Mobile B+
  • Raspbian 9.4
  • Python 3.6

AWS

  • IoT Core

Python PiでGPIOを制御する(動作確認)

PythonでRaspberry PiのGPIOを制御します。参考記事は下記となります。

実際のサンプルコードは下記となります。

sample_gpio.py
import RPi.GPIO as GPIO
import time

def main():
    GPIO.setmode(GPIO.BOARD)
    #Use PIN 7 (GPIO 4)
    GPIO.setup(7, GPIO.OUT)

    GPIO.output(7, True)
    time.sleep(1)
    GPIO.output(7, False)
    time.sleep(1)

    GPIO.cleanup()


if __name__ == "__main__":
    main()

実行はroot権限で行います。

$ sudo python sample_gpio.py

RaspberryでAWS IoT Coreと接続する(動作確認)

AWSの準備

IoT Core(ポリシーの作成)

メニューにある「安全性」の「ポリシー」を選択し、「ポリシーの作成」を選択します。

画像

下記を入力します。

  • 名前: RaspberryPiPoricy
  • アクション: iot:*
  • リソースARN: *
  • 効果: 許可

画像

本来であれば、アクションやリソースで各種権限を設定しますが、ひとまず「全部許可」にしています。

IoT Core(モノの作成)

メニューにある「管理」の「モノ」を選択し、「モノの登録」を選択します。

画像

「単一のモノを作成する」を選択します。

画像

下記を入力し、「次へ」を選択します。

  • 名前: RaspberryPi

画像

「1-Click 証明書作成 (推奨)」の「証明書の作成」を選択します。

画像

下記をすべてダウンロードし、「有効化」を選択し、「ポリシーのアタッチ」を選択します。

  • このモノの証明書
  • パブリックキー
  • プライベートキー
  • AWS IoTのルートCA

画像

さきほど作成したポリシー(RaspberryPiPoricy)を選択し、「モノの登録」を選択します。

画像

Raspberry Piの準備

SDKのインストール

pip install AWSIoTPythonSDK

サンプルコードの作成

Raspberry Piでは、AWSのIoT Coreと接続し、トピックをSubscribeします。下記が動作確認用のコードです。

sample_iot.py
import time
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

CLIENT_ID = "test_client_id"
ENDPOINT = "xxxxxxx.iot.ap-northeast-1.amazonaws.com"
PORT = 8883

ROOT_CA = "./cert/root_ca.pem"
PRIVATE_KEY = "./cert/private.pem.key"
CERTIFICATE = "./cert/certificate.pem.crt.txt"

TOPIC = "raspberry_pi/test"

def main():
    # https://s3.amazonaws.com/aws-iot-device-sdk-python-docs/sphinx/html/index.html
    client = AWSIoTMQTTClient(CLIENT_ID)
    client.configureEndpoint(ENDPOINT, PORT)
    client.configureCredentials(ROOT_CA, PRIVATE_KEY, CERTIFICATE)

    client.configureAutoReconnectBackoffTime(1, 32, 20)
    client.configureOfflinePublishQueueing(-1)
    client.configureDrainingFrequency(2)
    client.configureConnectDisconnectTimeout(10)
    client.configureMQTTOperationTimeout(5)

    client.connect()
    client.subscribe(TOPIC, 1, subscribe_callback)

    while True:
        time.sleep(5)

def subscribe_callback(client, userdata, message):
    print("Received a new message: ")
    print(message.payload)
    print("from topic: ")
    print(message.topic)
    print("--------------\n\n")


if __name__ == "__main__":
    main()

なお、各自で下記の対応を行ってください。

  • ENDPOINTの設定
  • モノ作成時に作成した証明書を実行環境に配置

エンドポイントの確認

AWS IoT Coreの画面から、エンドポイントの確認ができます。
「設定」を選択すると表示されます。

画像
画像

実際に動かしてみよう!!!

コード実行

Raspberry Piで上記のコードを実行します。エンドポイントの設定、および、証明書の配置を忘れずに行ってください。

$ python sample_iot.py

Publish

AWS IoT Coreの画面から、テストができます。
「テスト」を選択し、トピックを入力し、「トピックに発行」を選択します。

画像
画像

動作結果

pi@raspberrypi:~/app/sample$ python sample_iot.py
Received a new message:
b'{\n  "message": "Hello from AWS IoT console"\n}'
from topic:
raspberry_pi/test
--------------
pi@raspberrypi:~/app/sample$

Raspberry PiでメッセージをSubscribeできました!!!

これで、AWS IoT CoreとRaspberry Piを接続し、GPIO制御ができるようになりました!!!(←これのサンプルコードはありませんが、組み合わせればOK!)

サンプルコード

Githubに置いてます。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away