はじめに
例えばラズパイを使用して、センサーの情報を取得し、クラウドにデータをアップロードし活用したいですよね!
今回はその手始めとして、ラズパイとAWS IoTを連携してみたいと思います。
今後、DBへの保存や、グラフの表示などもまとめていきたいと思います!
使用機材
安価に以下を用意して試してみました。
- Raspberry Pi Zero WH
- ブレッドボード(165408010E)
- デジタル温度センサADT7310 DIP化モジュール[MDK001]
- ジャンパーワイヤ
ラズパイで温度情報を取得
Myブログで恐縮ですが、ラズパイで温度センサーから温度を取得する記事をまとめましたので参考にしてください。
AWS IoTの設定
AWSアカウントを取得後、AWS IoTの設定を行います。
結構AWS IoTの設定が多く、私は最初戸惑いました
一度設定をしてみると、流れを把握できると思います。
AWS IoT
AWS IoTについては、AWS ドキュメントに記載があります。
AWS IoT では、インターネットに接続されたデバイス (センサー、アクチュエーター、組み込みマイクロコントローラー、スマート家電など) と AWS クラウドとのセキュアな双方向通信が可能になります。これにより、複数のデバイスからテレメトリデータを収集し、保存して、分析できます。また、これらのデバイスをユーザーが各自の電話やタブレットから制御できるようにするアプリケーションを作成することもできます。
デバイスの登録
パブリックキーとプライベートキー、証明書をダウンロードします。
また、「有効化」をクリックします。
このページを閉じると、パブリックキーとプライベートキーが取得できなくなるので注意が必要です。
その後、「ポリシーをアタッチ」をクリックします。
ルート認証機関 (CA) は以下のURLからダウンロードします。
RSA 2048 ビットキー: Amazon ルート CA 1を選択しました。
AmazonRootCA1.pemという名前で保存します。
「安全性→ポリシー」をクリックし、「ポリシーの作成」をクリックします。
ポリシーの「名前」を任意で入力します。
アクションに「iot:*」と入力し、リソース ARNに「*」と入力します。
「許可」にチェックを入れ、「作成」をクリックします。
(許可範囲が広いので、本番稼働時は適宜設定をしてください)
管理をクリックし、先ほど作成したモノをクリックします。
「セキュリティ」をクリックし証明書をクリックします。
作成したポリシーをチェックし、「アタッチ」をクリックします。
以上で、AWS IoTの設定が完了しました。
ラズパイ側のコーディング
続いてラズパイ側の実装を行います。
以降、ラズパイ上での作業になります。
ラズパイで温度情報を取得
Pythonで温度を取得する処理を作成しました。
(詳しくはブログ記事を参照)
import time
import spidev
import sys
spi_ch = 0
try:
spi = spidev.SpiDev()
spi.open(0,spi_ch)
spi.mode = 0x03
spi.max_speed_hz = 1000000
time.sleep(0.01)
spi.xfer2([0xff, 0xff, 0xff, 0xff])
while True:
spi.xfer2([0x54])
time.sleep(0.5)
adc = spi.xfer2([0xff,0xff])
temp = (adc[0] << 8) | adc[1]
temp = temp >> 3
if(temp >= 4096):
temp = temp - 8192
print(temp / 16.0)
time.sleep(1)
except KeyboardInterrupt:
spi.close()
sys.exit(0)
AWS IoTに送信
この処理をもとに、温度をAWS IoTに送信したいと思います。
デバイスからは443ポートで、TLSクライアント認証によるMQTT通信をします。
PythonでMQTTの通信処理を書いてもよいのですが、今回はaws-iot-device-sdk-pythonを使用しました。
https://github.com/aws/aws-iot-device-sdk-python
ラズパイにインストールします。
自分のラズパイにpipもgitも入ってなかったので、今回はzipからインストールしました。
mkdir AWSIoTPythonSDK
cd AWSIoTPythonSDK
wget https://s3.amazonaws.com/aws-iot-device-sdk-python/aws-iot-device-sdk-python-latest.zip
unzip AWSIoTPythonSDK
sudo python3 setup.py install
ファイルの構成は以下です。
AWS IoTの設定時にダウンロードしたキーなども配置します。
(xxxは各自のファイル名で読み替えてください)
/
├ aws-test.py
└ cert/
├ AmazonRootCA1.pem
├ xxx-private.pem.key
└ xxx-certificate.pem.crt
実装は以下になりました。
まずは単純にデータの送信を試します。
エンドポイントURLは、**「AWS IoT→管理→モノ→操作」**から確認できます。
configureCredentialsの引数は、設定時にダウンロードしたファイルのパスを指定します。
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json
# 初期化
myMQTTClient = AWSIoTMQTTClient("raspi-zero")
# MQTTクライアントの設定
myMQTTClient.configureEndpoint("エンドポイントURL", 443)
myMQTTClient.configureCredentials("/xxx/xxx/cert/AmazonRootCA1.pem", "/xxx/xxx/cert/xxx-private.pem.key", "/xxx/xxx/cert/xxx-certificate.pem.crt")
myMQTTClient.configureOfflinePublishQueueing(-1)
myMQTTClient.configureDrainingFrequency(2)
myMQTTClient.configureConnectDisconnectTimeout(10)
myMQTTClient.configureMQTTOperationTimeout(5)
# Connect to AWS IoT endpoint and publish a message
myMQTTClient.connect()
print ("Connected to AWS IoT")
myMQTTClient.publish("awsiot/test", json.dumps({"test": "test message!"}), 0)
myMQTTClient.disconnect()
動作確認
AWS IoTのコンソールから「テスト」をクリックし、トピックのサブスクリプションに「awsiot/test」と入力しサブスクライブします。
作成したPythonを実行します。
python3 aws-test.py
温度情報を定期的に送信
温度取得処理とAWS IoT送信処理とくっつけて、1分毎にデータを送信する処理を作成しました。
(ちょっとやっつけ感ありますが)
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json
import time
import spidev
import sys
# 初期化
myMQTTClient = AWSIoTMQTTClient("raspi-zero")
# MQTTクライアントの設定
myMQTTClient.configureEndpoint("エンドポイントURL", 443)
myMQTTClient.configureCredentials("/xxx/xxx/cert/AmazonRootCA1.pem", "/xxx/xxx/cert/xxx-private.pem.key", "/xxx/xxx/cert/xxx-certificate.pem.crt")
myMQTTClient.configureOfflinePublishQueueing(-1)
myMQTTClient.configureDrainingFrequency(2)
myMQTTClient.configureConnectDisconnectTimeout(10)
myMQTTClient.configureMQTTOperationTimeout(5)
# Connect to AWS IoT endpoint and publish a message
myMQTTClient.connect()
print ("Connected to AWS IoT")
# 温度情報取得・送信
spi_ch = 0
try:
spi = spidev.SpiDev()
spi.open(0,spi_ch)
spi.mode = 0x03
spi.max_speed_hz = 1000000
time.sleep(0.01)
spi.xfer2([0xff, 0xff, 0xff, 0xff])
while True:
spi.xfer2([0x54])
time.sleep(0.5)
adc = spi.xfer2([0xff,0xff])
temp = (adc[0] << 8) | adc[1]
temp = temp >> 3
if(temp >= 4096):
temp = temp - 8192
# 温度情報送信
print(temp / 16.0)
myMQTTClient.publish("awsiot/test", json.dumps({"temperature": (temp / 16.0)}), 0)
# 一分待機
time.sleep(60)
except KeyboardInterrupt:
spi.close()
myMQTTClient.disconnect()
sys.exit(0)
今後について
まずはAWS IoTと連携できました。
次は例えばDBにデータを保存したり、グラフ化したりできますね!
またの機会にまとめたいです