AWSに入門したくなり、ラズベリーパイで始めてみました。
ラズパイとAWSを接続して、PythonでGPIOの信号をクラウドに送信しています。
無料枠の範囲内で実施出来ますので、AWSを始めてみたい人におすすめします。
AWSにラズパイを接続!GPIOの信号をクラウドに送信してみた
AWS(アマゾン提供のクラウド)にラズベリーパイのGPIO信号を送信してみました。
PythonでラズパイとAWSを接続させています。
ラズパイからのメッセージをMQTTでAWSに通知させることが可能です。
サンプルプログラムを流用して、簡単にテストしてみました。
AWSの登録・設定方法から、テストプログラムまで紹介していきます。
実際にラズパイでAWSと通信させたテストの様子を動画でも紹介しています。
GPIOをONした瞬間にAWS側でメッセージを受け取っていることが良く分かります。
AWSに個人で登録する
最初は下記リンクに従ってAWSの登録を進めます。個人でも自由に登録が可能です。
無料枠も十分にあるので、少しAWSに体験してみる程度ならば無料で試せます。
登録が終了してログインすると、AWSのコンソールの画面が出てきます。
この画面から自由にAWSのサービスを選ぶことが可能です。
今回は「AWS IoT」というサービスを使って、ラズパイでAWSに接続してみます。
AWS IoTでラズパイと接続してみる
AWS IoTでラズパイと接続するためには何点か手順を踏む必要があります。
シンプルな方法の一例を紹介します。
AWS IoTでモノを登録する
最初にAWS IoTで使うデバイス、つまり「モノ」を登録していきます。
今回はラズベリーパイが「モノ」となります。
コンソール上のすべてのサービスの中から「IoT Core」を選びます。
AWS IoTの画面を開いたら、左の一覧から「管理」→「モノ」を選択します。
モノの画面の右上にある「作成」をクリックして進めていきます。
そしてAWS IOTモノを作成する画面で「単一のモノを作成する」を選択します
モノの名前を任意で入力します。(筆者は「raspberry-pi」としました。)
他にタイプ・グループなども選べますが、今回は特に選択せず「次へ」で進みました。
AWS IoTで証明書を作成する
AWSとラズパイで通信させるために必要な証明書を作成していきます。
AWSのコンソール画面で証明書を作り、後ほどラズパイに渡す流れです。
「証明書を作成」を選択します。
このモノの証明書、パブリックキー、プライベートキーを全部ダウンロードします。
またルートCAもダウンロードリンク先から入手します。
ルートCAに関して今回は「RSA 2048 bit key: Amazon Root CA 1」をダウンロードしました。
ダウンロード後に「有効化」を押して、「ポリシーをアタッチ」を選択します
AWS IoTでポリシーをアタッチする
AWS IoTでポリシーを作成していきます。
ポリシーとはざっくりいうと、AWSへのアクセス権限を管理するリストみたいなものです。
今回はテスト用にAWS IoT関連ならば、何でもできるポリシーを作成しています。
「新規ポリシーの作成」を選びます。
ポリシーに名前を付けて、アクションに「iot:*」リソースAPNに「*」を記載します。
あと効果も「許可」にチェックを入れます。
ポリシーが作られましたので証明書にアタッチ(紐づけ)します。
左一覧の「安全性」→「証明書」から先ほど作成した証明書を選択します。
証明書の項目で右上のアクション→ポリシーのアタッチを選択します。
先ほど作成したポリシーをアタッチします。
AWSのエンドポイントのURLを控えておきます
最後にAWSのエンドポイントのURLを控えておきます。
AWS IoTを使う際に必要な情報となります。
左一覧にある「設定」を選ぶと、エンドポイントのURLがあります。
これで一旦AWS側の設定が終了です。次からはラズベリーパイ側の設定をしていきます。
一括でAWSの設定する方法もありますが…
一番最初のコンソール画面に「IoT デバイスを接続する」があります。
ここをクリックするとワークフローに従った形で進めることも可能です。
(SDKのダウンロード・証明書の発行・ポリシーのアタッチなどの手順を一括で進めれます。)
ただ環境により失敗することも多いので注意が必要です。
おそらく前述した形で「モノ」「証明書」「ポリシー」を作った方が楽かと思います。
筆者も最初に実践してみましたが、結構躓きました。何点か紹介します。
ポリシーなど修正する必要が出てくる
自由にテストしたい場合などは(ポリシーなど)修正する項目が出てきたりします。
一括のフローで作られたデフォルト設定だと、ある程度アクセス権限が絞られています。
そのため、今回紹介するPythonプログラムなどではAWSに接続できませんでした。
※ポリシーを再度修正すればAWSに接続できました。
実際のログは下記形です。AWSに接続できなくタイムアウトしています。
1 2 3 4 5 6 7 8 9 |
Connect timed out Traceback (most recent call last): File "/home/pi/aws-test.py", line 16, in <module> myMQTTClient.connect() File "/home/pi/.local/lib/python3.7/site-packages/AWSIoTPythonSDK/MQTTLib.py", line 513, in connect return self._mqtt_core.connect(keepAliveIntervalSecond) File "/home/pi/.local/lib/python3.7/site-packages/AWSIoTPythonSDK/core/protocol/mqtt_core.py", line 199, in connect raise connectTimeoutException() AWSIoTPythonSDK.exception.AWSIoTExceptions.connectTimeoutException |
古いPython2.7にインストールしようとした
一括のフローで進める場合、PythonのSDKのインストールもしてくれます。
但し、失敗する場合もあります。
筆者の場合は古いPython2.7の方にインストールしようとしていました。
実際のログの一部切り取りが下記です。
実効スクリプトにsudoが無いのか、またPython2.7の方にファイルを作ろうともしていました。
1 2 3 4 5 6 |
~~ copying AWSIoTPythonSDK/exception/__init__.py -> build/lib.linux-armv7l-2.7/AWSIoTPythonSDK/exception copying AWSIoTPythonSDK/exception/operationTimeoutException.py -> build/lib.linux-armv7l-2.7/AWSIoTPythonSDK/exception running install_lib creating /usr/local/lib/python2.7/dist-packages/AWSIoTPythonSDK error: could not create '/usr/local/lib/python2.7/dist-packages/AWSIoTPythonSDK': Permission denied |
下記原因が考えますが、上手くいくかはラズパイの環境に結構依存しそうです。
- 筆者のラズパイに古いPythonの環境が残っていた影響?
- 一括で実行するシェルスクリプトが悪い?
参考にさせていただいた記事
AWSの設定に関しては下記Qiita記事を参考にさせていただきました。
運営者・著者の方にはこの場を借りて深くお礼申し上げます。
https://qiita.com/chigusaweb66/items/2058174713ca833361ff
https://qiita.com/f-daiki/items/3d7b0adba3e457ee48a5
ラズパイにaws-iot-device-sdk-pythonをインストール
AWSと通信できるようにラズパイ側をセットアップしていきます。
今回は「Python」でプログラムを書きますので、SDKもPythonをインストールします。
(他のプログラム言語のJava、Node.jsも選べるようですが、今回は省略します)
AWSIoTPythonSDKをインストール
ラズパイのコンソールの画面でインストール作業を進めていきます。
今回は下記コマンドを入力しています。
ダウンロード先のAWSのGithubのリンク先は下記となっています。
今回のPythonのプログラム含めて参考にさせていただいています。
https://github.com/aws/aws-iot-device-sdk-python
aws-iot-device-sdk-python-v2もあります
今回インストールしたSDKの次のVerの「aws-iot-device-sdk-python-v2」も出ているようです。
もし興味ある方は試してみて下さい。Githubのリンク先は下記です。
https://github.com/aws/aws-iot-device-sdk-python-v2
証明書、鍵、ルートCAもラズパイに入れます
またAWSで発行した証明書、鍵(プライベートキー)、ルートCAもラズパイに入れておきます。
今回は動かすプログラムと同じ階層(/home/pi)にフォルダ(/cert)を作り、そこに入れています。
ラズパイからAWS IoTにMQTTで通信テスト
最初にAWS IoTに正常に通信できるか通信テストを行います。
Pythonでプログラムを作成していきます。
ラズパイにはデフォルトでPythonがインストールされており、誰でも簡単に使用できます。
初心者の方でも大丈夫です。下記記事で使い方を紹介しています。(リンク先はこちら)
ラズベリーパイでプログラミング入門!Pythonの簡単な始め方
Pythonで通信テストのプログラムを作成
実際にAWSと通信テストしたプログラムは下記です。
Github先のサンプルを簡単に修正したレベルのものです。
ラズパイのデフォルトのホームディレクトリ「/home/pi」上にプログラムを置いています。
内容としてはMQTTと呼ばれるプロトコルでAWSに「myPayload」とメッセージを送っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# Import SDK packages from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient # For certificate based connection myMQTTClient = AWSIoTMQTTClient("myClientID") # For Websocket connection # myMQTTClient = AWSIoTMQTTClient("myClientID", useWebsocket=True) # Configurations # For TLS mutual authentication myMQTTClient.configureEndpoint("YOUR.ENDPOINT", 8883) # For Websocket # myMQTTClient.configureEndpoint("YOUR.ENDPOINT", 443) # For TLS mutual authentication with TLS ALPN extension # myMQTTClient.configureEndpoint("YOUR.ENDPOINT", 443) myMQTTClient.configureCredentials("YOUR/ROOT/CA/PATH", "PRIVATE/KEY/PATH", "CERTIFICATE/PATH") # For Websocket, we only need to configure the root CA # myMQTTClient.configureCredentials("YOUR/ROOT/CA/PATH") myMQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing myMQTTClient.configureDrainingFrequency(2) # Draining: 2 Hz myMQTTClient.configureConnectDisconnectTimeout(10) # 10 sec myMQTTClient.configureMQTTOperationTimeout(5) # 5 sec myMQTTClient.connect() myMQTTClient.publish("myTopic", "myPayload", 0) #myMQTTClient.subscribe("myTopic", 1, customCallback) #myMQTTClient.unsubscribe("myTopic") #myMQTTClient.disconnect() |
実際に使う場合はID、エンドポイント,証明書、鍵、ルートCAを適宜修正してください。
筆者の場合は下記のように修正しています。
(***箇所は各自のファイルの名前を確認して修正をお願いします。)
- "myClientID" → "raspberry-pi"
- "YOUR.ENDPOINT" → "***.amazonaws.com"
- "YOUR/ROOT/CA/PATH" → "cert/AmazonRootCA1.pem"
- "PRIVATE/KEY/PATH" → "cert/***-private.pem.key"
- "CERTIFICATE/PATH" → "cert/***-certificate.pem.crt"
AWSでMQTTクライアントを動かす
AWS IoTの画面で左の一覧から「テスト」を選択します。
MQTTクライアントの画面が出てきます。
今回はトピックのサブスクリプションの箇所に「myTopic」と入力します。
そして「トピックへのサブスクライブ」をクリックします。
入力内容はPythonのプログラムの最後の方にある下記箇所と合わせています。
MQTTでメッセージの通信テスト
AWSの準備が終わりましたら、ラズパイのPythonのプログラムを起動します。
プログラム起動前はAWSの下記赤枠のMQTTによるメッセージはないはずです。
プログラム起動後はAWSの画面でMQTTのメッセージが表示されています。
ラズパイからAWSに「myPayload」のメッセージが受け取れました。
通信ポートに関しては8883でなくても443でも動作は出来ました。
AWSのMQTTクライアントのデフォルト設定はJSONという表示形式です。
ただし、JSON形式でなくともAWS側でUTF-8文字列として表示してくれました。
ラズパイからAWSにGPIOの信号情報を送るテスト
折角なので少し応用して、ラズベリーパイのGPIOの信号をAWSに送信したいと思います。
具体的にはスイッチが押されたらラズパイからAWSにメッセージを送る形にします。
冒頭にも紹介しましたが、実際のテストの様子を動画でも紹介しています。
ラズパイのGPIOをONした瞬間にAWS側でメッセージを受け取れています。
ラズベリーパイのGPIOの配線
ラズパイのGPIO17に「スイッチ」と「プルダウン10kΩ抵抗」を接続します。
ブレットボードとジャンパー線で簡単に配線できます。
Pythonのプログラム
ラズパイのプログラムも修正します。
3秒間隔でGPIOの信号を読み取り、ONの場合はAWSにMQTTでメッセージを送る内容です。
実際に使ったPythonのプログラムは下記です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# Import SDK packages from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(17,GPIO.IN) # For certificate based connection myMQTTClient = AWSIoTMQTTClient("myClientID") # For Websocket connection # myMQTTClient = AWSIoTMQTTClient("myClientID", useWebsocket=True) # Configurations # For TLS mutual authentication myMQTTClient.configureEndpoint("YOUR.ENDPOINT", 8883) # For Websocket # myMQTTClient.configureEndpoint("YOUR.ENDPOINT", 443) # For TLS mutual authentication with TLS ALPN extension # myMQTTClient.configureEndpoint("YOUR.ENDPOINT", 443) myMQTTClient.configureCredentials("YOUR/ROOT/CA/PATH", "PRIVATE/KEY/PATH", "CERTIFICATE/PATH") # For Websocket, we only need to configure the root CA # myMQTTClient.configureCredentials("YOUR/ROOT/CA/PATH") myMQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing myMQTTClient.configureDrainingFrequency(2) # Draining: 2 Hz myMQTTClient.configureConnectDisconnectTimeout(10) # 10 sec myMQTTClient.configureMQTTOperationTimeout(5) # 5 sec myMQTTClient.connect() while True: if GPIO.input(17): myMQTTClient.publish("myTopic", "GPIO17_ON", 0) time.sleep(3) #myMQTTClient.subscribe("myTopic", 1, customCallback) #myMQTTClient.unsubscribe("myTopic") #myMQTTClient.disconnect() |
AWSへGPIO信号の通信テスト
ラズパイのPythonのプログラムを起動して、AWSの画面を確認します。
ラズパイのGPIO17をONし続けると、AWSが3秒間隔でメッセージを受け取ります。
無事ラズパイからAWSへの通信テストが出来ました。
AWS IoTの料金
今回の通信テストレベルではAWSの料金は無料の範囲内でした。
何回か通信テストを行いましたが、1か月の無料枠の0.02%を使う程度です。
(1か月100万APIリクエストの無料枠中の228リクエスト程度でした)
画像認識のテストも無料枠内だった
今回の記事とは別にラズパイとAWSで画像認識のテストも実施しました。
AWSのRekognitionというサービスを使いました。
下記記事で紹介しています。(リンク先はこちら)
最初の12か月の無料枠では月5000枚まで画像認識出来るということです。
よろしければ下記記事も一緒にご覧ください。
まとめ
今回はAWSとラズパイの接続に関して紹介させていただきました。
記事をまとめますと下記になります。
AWSを始めてみるにもラズベリーパイ(raspberry pi)はちょうど良いデバイスかと思います。
ハードウェアの勉強や趣味・工作にも十分に使えます。
是非皆さまも試してみて下さい。
コメント