LoginSignup
34
32

More than 1 year has passed since last update.

ラズパイとAWS IoT連携 (Pythonで温度情報をクラウド送信)

Last updated at Posted at 2019-05-06

はじめに

例えばラズパイを使用して、センサーの情報を取得し、クラウドにデータをアップロードし活用したいですよね!

今回はその手始めとして、ラズパイとAWS IoTを連携してみたいと思います。
今後、DBへの保存や、グラフの表示などもまとめていきたいと思います!

使用機材

安価に以下を用意して試してみました。

  • Raspberry Pi Zero WH
  • ブレッドボード(165408010E)
  • デジタル温度センサADT7310 DIP化モジュール[MDK001]
  • ジャンパーワイヤ

ラズパイで温度情報を取得

Myブログで恐縮ですが、ラズパイで温度センサーから温度を取得する記事をまとめましたので参考にしてください。

ラズパイで温度を取得(デジタル温度センサADT7310)

AWS IoTの設定

AWSアカウントを取得後、AWS IoTの設定を行います。
結構AWS IoTの設定が多く、私は最初戸惑いました:sweat:
一度設定をしてみると、流れを把握できると思います。

AWS IoT

AWS IoTについては、AWS ドキュメントに記載があります。

AWS IoT とは

AWS IoT では、インターネットに接続されたデバイス (センサー、アクチュエーター、組み込みマイクロコントローラー、スマート家電など) と AWS クラウドとのセキュアな双方向通信が可能になります。これにより、複数のデバイスからテレメトリデータを収集し、保存して、分析できます。また、これらのデバイスをユーザーが各自の電話やタブレットから制御できるようにするアプリケーションを作成することもできます。

まずはAWS IoT コンソールを開きます。

リージョンは東京にしました。

デバイスの登録

最初の画面で「モノの登録」をクリックします。

「単一のモノを作成する」をクリックします。
2019-05-06_11h37_47.png

任意で名前を入力し、次へ進みます。
screencapture-ap-northeast-1-console-aws-amazon-iot-home-2019-05-06-11_42_01.png

「証明書の作成」をクリックします。
2019-05-06_11h46_24.png

パブリックキーとプライベートキー、証明書をダウンロードします。
また、「有効化」をクリックします。
このページを閉じると、パブリックキーとプライベートキーが取得できなくなるので注意が必要です。
その後、「ポリシーをアタッチ」をクリックします。
2019-05-06_11h48_56.png

ルート認証機関 (CA) は以下のURLからダウンロードします。
RSA 2048 ビットキー: Amazon ルート CA 1を選択しました。
AmazonRootCA1.pemという名前で保存します。

AWS IoTのルートCAダウンロード

「モノの登録」をクリックします。
2019-05-06_12h24_56.png

「安全性→ポリシー」をクリックし、「ポリシーの作成」をクリックします。
2019-05-06_12h26_40.png

ポリシーの「名前」を任意で入力します。
アクションに「iot:*」と入力し、リソース ARNに「*」と入力します。
「許可」にチェックを入れ、「作成」をクリックします。
(許可範囲が広いので、本番稼働時は適宜設定をしてください)
2019-05-06-12_43_19.png

管理をクリックし、先ほど作成したモノをクリックします。
「セキュリティ」をクリックし証明書をクリックします。
2019-05-06_12h47_09.png

「アクション→ポリシーのアタッチ」をクリックします。

作成したポリシーをチェックし、「アタッチ」をクリックします。
2019-05-06_12h49_44.png

以上で、AWS IoTの設定が完了しました。

ラズパイ側のコーディング

続いてラズパイ側の実装を行います。
以降、ラズパイ上での作業になります。

ラズパイで温度情報を取得

Pythonで温度を取得する処理を作成しました。
(詳しくはブログ記事を参照)

get_temp.py
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の引数は、設定時にダウンロードしたファイルのパスを指定します。

aws-test.py
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」と入力しサブスクライブします。
2019-05-06_14h05_40.png

作成したPythonを実行します。

python3 aws-test.py

JSON形式でデータが受信できることを確認します。
2019-05-06_14h08_18.png

温度情報を定期的に送信

温度取得処理とAWS IoT送信処理とくっつけて、1分毎にデータを送信する処理を作成しました。
(ちょっとやっつけ感ありますが:sweat_smile:)

aws-send-temp.py
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)

実行してみると、1分毎くらいにデータが送信できました!
2019-05-06_14h15_35.png

今後について

まずはAWS IoTと連携できました。
次は例えばDBにデータを保存したり、グラフ化したりできますね!
またの機会にまとめたいです:grinning:

34
32
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
32