今回はAWS IoT Coreを使ってRaspberryPiを制御してみよう。
ラズパイにセンサーモジュールを取り付けて遠隔で何かしらの制御を行っていきたいと思います。
制御するセンサーはLEDでもブザーでもなんでもいいんです。
(遠隔からラズパイを制御できることに意味がある!!)
そんな僕は遠隔での自動水やり機の構築のため、AWS IoT Coreを使って水やり(ポンプ)センサーを動かしてみたいと思う。(どやっ)
AWS IoT Coreの操作
さて、AWS IoT Coreのセットアップ方法を記事に起こすぞと気合いを入れ腕をまくったところで、かなり良記事を見つけたので貼っておく。(この記事があれば僕が手順を書く必要はない。)
AWS IoT CoreをRaspberry Piで使ってみた その1
この記事を参考にしてAWS IoT Coreのセットアップを行ってください。
(この記事に飛んだ後、僕の記事に戻ってくることはなくても構いません。どうかお元気で)
基本的には、以下をを行っておきます。
①モノを作成
②ポリシーをアタッチ
③証明書とキーをダウンロード
AWS IoT Coreとラズパイの連携準備
上記セットアップが終わりましたら、連携の準備を行います。
(証明書やらポリシーやらサンプルコードやら)
AWS IoT SDKのダウンロード
AWS IoT Coreと連携するためのSDKも用意されていますので、今回はこちらを使用してみましょう。(サクッと作成できますので)
ラズパイ環境にgitからクローンしてきます
git clone https://github.com/aws/aws-iot-device-sdk-python.git
クローンが完了したら、使用するのはaws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py
になります。
証明書の準備(配置)
その前に先程取得した証明書とキーを以下の階層に用意しておきます。
(basicPubSubディレクトリ内にcertsディレクトリを作成。その中に以下を配置)AmazonRootCA1.pem
abc123..abc123-certificate.pem.crt
abc123..abc123-private.pem.key
aws-iot-device-sdk-python/
┣ basicPubSub
┃ ┣ certs
┃ ┃ ┣ AmazonRootCA1.pem
┃ ┃ ┣ abc123..abc123-certificate.pem.crt
┃ ┃ ┗ abc123..abc123-private.pem.key
┃ ┣ basicPubSub.py
エンドポイントの確認
その他必要な情報としてデバイスのエンドポイントを取得します。
AWS IoT Coreコンソール画面から設定>デバイスデータエンドポイントを控えます
ポリシーのアタッチ
ポリシーのアタッチに関しては以下の記事を参考にすると、非常に分かりやすいです。
AWS IoT CoreをRaspberry Piで使ってみた その2
AWS IoT Coreとラズパイの連携
さて、ここまで準備ができたらAWS IoT Coreとラズパイの相互通信(Pub/Sub)が可能です。
ラズパイからPublish
ラズパイからPublishしてみます。
用途としてラズパイのセンサー情報等を定期的に収取する際はラズパイからPublishを行います。
コンソールから実行する場合は以下の引数とともにpythonを実行
python basicPubSub.py --endpoint abc123-ats.iot.ap-northeast-1.amazonaws.com --rootCA ./certs/AmazonRootCA1.pem --cert ./certs/abc123..abc123-certificate.pem.crt --key ./certs/abc123..abc123-private.pem.key
すると、1秒間隔でMQTTのPublishが行われます。
このPublishはJson形式で以下から確認できます。
SDKデフォルトのtopicは sdk/test/Python
です
Publishメッセージをセンサーから読み取った値等にすれば
センサーデータの収集が可能になりますね。
ラズパイでSubscribe
次は、ラズパイでSubscribeしてみます。
用途として遠隔(AWS IoT Core)からPublishを行うことでラズパイのセンサー等を制御することが可能になります。
コンソールから実行する場合は以下の引数とともにpythonを実行
(-m subscribe
オプションを付与する)
python basicPubSub.py --endpoint abc123-ats.iot.ap-northeast-1.amazonaws.com --rootCA ./certs/AmazonRootCA1.pem --cert ./certs/abc123..abc123-certificate.pem.crt --key ./certs/abc123..abc123-private.pem.key -m subscribe
JSON形式でメッセージを作成しPublishしてみます
SDKデフォルトのtopicは sdk/test/Python
です
サブスクライブしているラズパイにメッセージが届きました。
Received a new message:
b'{\n "message": "Hello World!!"\n}'
from topic:
sdk/test/Python
特定のメッセージをサブスクライブしたらセンサーモジュールを制御する仕組みを組み込めば遠隔でセンサーの制御ができますね
もちろん、PublishとSubscribeの両方同時に行うことも可能です。-m both
のオプションを付与することで可能です。
python basicPubSub.py --endpoint abc123-ats.iot.ap-northeast-1.amazonaws.com --rootCA ./certs/AmazonRootCA1.pem --cert ./certs/abc123..abc123-certificate.pem.crt --key ./certs/abc123..abc123-private.pem.key -m both
コンソールの引数指定が面倒だ
pythonを実行する際に長ったらしい引数で証明書やキーを指定するのが面倒なので、ソースコードに直に証明書やキーのパスを書いてあげればスッキリとしたpythonコマンドで実行が可能になる
host = "abc123-ats.iot.ap-northeast-1.amazonaws.com"
rootCAPath = "./certs/AmazonRootCA1.pem"
certificatePath = "./certs/abc123..abc123-certificate.pem.crt"
privateKeyPath = "./certs/abc123..abc123-private.pem.key"
pythonの実行
python basicPubSub.py -m publish(またはsubscribeまたはboth)
これでAWS IoT Coreとラズパイの連携ができました。
特定のtopicまたはメッセージ受信時にセンサーデバイス制御を組み込むことでAWS IoT Coreを使ってラズパイを制御することが可能ですね。
コメント