RaspberryPiとAWS IoT CoreでMQTT通信をしてみた


とにかくAWS IoTとRaspberryPiをMQTT通信させたい。という方に作業内容だけをまとめました。

まず、全体の作業内容を説明します。大きく作業は3つです。
1. AWS IoTにRaspberryPiを登録
- 証明書の取得
- ポリシーの追加
2. RaspberryPiプログラムの作成
3. 通信テスト

以上です。今回はAWS IoT側がデータの送信側です。RaspberryPiは受信側。

AWS IoTへRaspberryPiを登録

AWSのWebページ⇨コンソールへログイン⇨サービス⇨IoTCore

管理→モノ→作成行きます。

単一のモノを登録する

モノの名前を登録(他の項目は自由に。未記入でも大丈夫です)

証明書を取得します


ダウンロード(モノの証明書、パブリックキー、プライベートキー、ルートCA)

ポリシーを設定します

セキュリティ機能の一つ、ポリシーを設定します。ポリシーとは操作やAWS上のデータベースなどの他のリソースアクセスを決めるモノです。
下の写真のようにアクションとリソースを設定します。

証明書のページから-ポリシーの
アタッチを行って、上で作成したポリシーをアタッチします。

RaspberryPiのプログラムを作成します。

MQTTのクライアントにはpaho mqttを利用します。
RaspberryPiに入って、pipを利用してpaho mqttを入れます。

sudo apt-get install python-pip

pip install paho-mqtt

ラズパイのプログラムです

下記コードを作成ください。XXXX.〜は各々のパラメータを入れてください。
作成後はscpモジュールなどでPC→MQTTに転送できます。証明書とプライベートキー、パブリックキーも転送します。同じ階層に入れてください。

paho_mqtt_test.py
import paho.mqtt.client
import ssl
import subprocess
import json

endpoint = "XXXX.amazonaws.com"#AWSのエンドポイント
port = 8883#AWSのポート
topic_to_aws ="Raspi3_to"
topic_from_aws = "Raspi3_from"
rootCA = "VeriSign.pem"#ルート証明書
cert = "XXXX-certificate.pem.crt"#デバイス証明書
key = "XXXX-private.pem.key"#keyを設定

def on_connect(client, userdata, flags, respons_code):
    print("Connected")
    client.subscribe(topic_to_aws)#サブスクライブする

def on_message(client, userdata, msg):
    print(msg.topic)

if __name__ == '__main__':
    #ここら辺はpahoのリファレンスを参照。
    #https://www.eclipse.org/paho/clients/python/docs/#connect-reconnect-disconnect 
    client = paho.mqtt.client.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    client.tls_set(ca_certs=rootCA, certfile=cert, keyfile=key, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
    client.connect(endpoint, port=port, keepalive=60)
print("StartScript")
client.loop_forever()

通信テスト

テスト→発行のトピック名を記入して、"トピックスに発行"をクリック

成功していたら、RaspberryPiのコンソールへ(ソースコード)のon_message文字列出力される。

以上