AWS IoTにPythonでMQTTイベントの送信、受信するまで
AWS IoTにPythonでメッセージのやり取りを行ってみます。こちらがとても参考になりました。
AWS IoTをPythonで簡単に始めるまで
必要最低限の設定
AWSコンソールで「IoT Core」の設定画面を表示します。
[管理] - [モノ]を選択し、「モノの登録」をクリックします。

「モノ」を登録するウィザードが始まります。
「単一のモノを作成する」をクリック。

適当に「モノ」の名前を入力します。
「タイプ」や「グループ」の指定は未設定でもOKです。

名前を入力したら、画面下の「次へ」をクリックしてウィザードを進めます。

続いて証明書の追加です。
推奨となっている1-Click証明書を作成します。

証明書が作成されるのでダウンロードしておきます。

「AWS IoTのルートCA」のダウンロードをクリックすると、別ウインドウでテキストが表示されます。

表示された内容を「rootCA.pem」という名前で保存しておきます。(重要)
プログラムで使用するのは、前の画面でダウンロードした
「このモノの証明書」「プライベートキー」
そして、先程保存した「rootCA.pem」になります。
・XXXXXXXXXX-certificate.pem.crt
・XXXXXXXXXX-private.pem.key
・rootCA.pem
ここまでの操作で、
[管理] - [モノ]

[安全性] - [証明書]

にそれぞれ項目が追加されているはずです。
ポリシーのアタッチ
作成した証明書で何ができるか、ポリシーを作成して指定してやります。
[安全性] - [ポリシー]を選択し、「ポリシーの作成」をクリック。

ポリシーの名前は適当に「python-policy」としました。
とりあえずのテストなので、すべての権限を与えます。
アクションは「iot:*」
リソースARNは「*」
とし、効果は「許可」
この状態で作成します。

作成したポリシーを証明書にアタッチします。
証明書右上の「...」をクリックしてメニューを表示し、「ポリシーのアタッチ」を選択。

先程作成したポリシーを選択して「アタッチ」実行。

これで証明書が「アクティブ」になりました。

AWS IoT Device SDK for Python
ここからPythonのプログラムを作成していきます。
AWS IoT Device SDK for Python
こちらのライブラリをインストール。
$ pip3 install AWSIoTPythonSDK
バージョン1.4.0がインストールできました。
basicPubSub.py
こちらのサンプルを参考に、AWSコンソールから送信されたメッセージを受信する
プログラムを作成してみます。
configureEndpointで指定している接続ポイントは、
管理コンソールの「設定」で確認できます。

configureCredentialsは、ダウンロードしておいた
・rootCA.pem
・xxxxxxxxxxxx-private.pem.key
・xxxxxxxxxxxx-certificate.pem.crt
へのファイルパスを指定します。
- # -*- coding:utf8 -*-
- from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
- import time
- import json
- def customCallback(client, userdata, message):
- print('Received a new message: ')
- print(message.payload)
- print('from topic: ')
- print(message.topic)
- print('--------------\n\n')
- # For certificate based connection
- myMQTTClient = AWSIoTMQTTClient('myClientID') # 適当な値でOK
- myMQTTClient.configureEndpoint('xxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com', 8883) # 管理画面で確認
- myMQTTClient.configureCredentials('rootCA.pem', 'xxxxxxxxxxxx-private.pem.key', 'xxxxxxxxxxxx-certificate.pem.crt')
- 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:
- myMQTTClient.subscribe("myTopic", 1, customCallback)
- time.sleep(1)
作成したプログラムを動かしておきます。
$ python3 sample.py
AWSコンソールのテストから、待ち受けている「myTopic」に対してメッセージを送信してみます。

受信できました。

メッセージの送信
送信も試してみます。
subscribeをpublishに変更し、メッセージを送信。
- # -*- coding:utf8 -*-
- from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
- import time
- import json
- def customCallback(client, userdata, message):
- print('Received a new message: ')
- print(message.payload)
- print('from topic: ')
- print(message.topic)
- print('--------------\n\n')
- # For certificate based connection
- myMQTTClient = AWSIoTMQTTClient('myClientID') # 適当な値でOK
- myMQTTClient.configureEndpoint('xxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com', 8883) # 管理画面で確認
- myMQTTClient.configureCredentials('rootCA.pem', 'xxxxxxxxxxxx-private.pem.key', 'xxxxxxxxxxxx-certificate.pem.crt')
- 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:
- #myMQTTClient.subscribe("myTopic", 1, customCallback)
- myMQTTClient.publish("myTopic", json.dumps({'message' : 'from python!'}), 1)
- time.sleep(1)
AWSコンソールで、「myTopic」をサブスクライブ。

待受状態となります。

プログラムを実行すると、もりもりメッセージが届きます。

コメント
大学の研究で似たようなものを使用したいと思い、色々と調べる中でこちらのブログを拝見させて頂いております。
恐縮ですが、一点、質問させて頂きたくコメントさせて頂きました。
こちらの手順にのっとって操作を行っているのですが、証明書を作成した後、ルートCAをダウンロードをクリックすると、
開発者ガイドに飛ばされてしまい、ダウンロードすることが出来ません。
これは事前に何かほかの操作が必要なのでしょうか?
当方の知識不足で申し訳ありませんが、ご教示頂けますと幸甚に存じます。
よろしくお願い致します。
2019/02/04 17:49 by - URL 編集
この記事で試したときの環境が残っていないので追試ができないのですが、
リンク先の「開発者ガイド」にある
Amazon Trust Services エンドポイント (推奨)
RSA 2048 ビットキー: Amazon ルート CA 1
こちらの証明書を使用すれば動作する気がします。
2019/02/04 20:39 by symfo URL 編集
そちらを使用して再度試してみようと思います。
ありがとうございました。
2019/02/05 15:17 by - URL 編集