Edited at

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

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

image.png

単一のモノを登録する

image.png

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

image.png


証明書を取得します

image.png

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

image.png


ポリシーを設定します

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

下の写真のようにアクションとリソースを設定します。

image.png

証明書のページから-ポリシーの

アタッチを行って、上で作成したポリシーをアタッチします。

image.png


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()



通信テスト

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

image.png

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


以上