LoginSignup
8
10

More than 5 years have passed since last update.

Raspberry Pi→AWS IoT→dynamoDB にデータ送信

Posted at

チュートリアルをやって雰囲気がわかったので、dynamoDBにデータを書き込むところまでできたメモをまとめした。

全体の流れ

  1. AWS IoT Coreでモノ・証明書・ポリシーを作成
  2. ルールを作成
  3. dynamoDBでテーブルを作成
  4. RasPiプログラム側にAWS IoT Coreへデータ送信する行を実装
  5. AWSIoTの「テスト」機能を使って確認

です。

作業を進める中で参考にさせて頂いた記事:
DynamoDBに書き込む AWS IoT のルールの作り方
ラズパイ3上のPythonでMQTTの通信をやってみる
AWS IoTにPythonでMQTTイベントの送信、受信するまで
import error!パスを通す??pythonあるある。

1. AWS IoT Coreでモノ・証明書・ポリシーを作成

今回はチュートリアルと違って、モノを新規作成→1-Click 証明書作成 (推奨) で証明書を作ってRasPi側にダウンロードしておきます。証明書をポリシーとモノにアタッチします。

2. ルールを作成

の途中で

3. dynamoDBでテーブルを作成

DynamoDBに書き込む AWS IoT のルールの作り方
基本的には↑の通り進めますが、なぜかうまくいかなかったメモとして、事前にdynamoDBを作ってからこのルールで選択して進めると成功しませんでした。なので、ルールを作っている途中でテーブルを選ぶときに「新しいリソースを作成する」を押してdynamoDBの作成画面に飛び、DBを作成する。が良いと思います。
上記の記事ではjsonを送ってテストすることになってるんですが、私はテストプログラムの中にてjson形式でメッセージ送信することにしました。
なのでDBができたらいちどこのステップは終わりにします。

4. RasPiプログラム側にAWS IoT Coreへデータ送信する行を実装

from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
からエラーを吐いたので心が折れそうになりましたが、下記の記事を読んでパスを通してみたところ無事できました。
import error!パスを通す??pythonあるある。

import sys
sys.path.append('usr/local/lib/.......')
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

jsonファイルを送る、じゃなくてプログラムの中でjson形式にして送るようにして、いろいろ試しながらテストしてみました。

test_basicPubSub.py
import logging
import getopt
import time
import json
import datetime
import sys
sys.path.append('usr/local/lib/.......')
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

def customCallback(client, userdata, message):
  print('Received new message')
  print(message.payload)
  print('from Topic')
  print(message.topic)
  print('--------\n\n')

Ymd = datetime.datetime.now().strftime("%Y/%m/%d")
sending_msg = json.dumps({"deviceid":"Raspi-1","time_in",Ymd,"sentmessage":"this is a test from RasPi1"})

myMQTTClient = AWSIoTMQTTClient('mycliId') #適当で良い
myMQTTClient.configureEndpoint('エンドポイント',8883) #8883はポート
myMQTTClient.configureCredentials('rootCA.pem','privatekey','nnn-certificate.pem.crt') #証明書3つ、同じフォルダ内に置いてます
myMQTTClient.configureOfflinePublishQueueing(-1)
myMQTTClient.configureDrainingFrequency(2)
myMQTTClient.configureConnectDisconnectTimeout(10)
myMQTTClient.configureMQTTOperationTimeout(5)
myMQTTClient.connect()

myMQTTClient.subscribe("AWSIoTのテストに入れるトピック名", 1, CustomCallback)
myMQTTClient.publish("AWSIoTのテストに入れるトピック名", sending_msg, 1)

5. AWSIoTの「テスト」機能を使って確認

トピックのサブスクリプション 欄に上記テストコードの中で"AWSIoTのテストに入れるトピック名"に入れたトピック名を入れて、しばらく(2-3分)経ってから4のテストコードを実行。
RasPi側から送ったsending_msgの内容が表示されたら成功です!
続いてAWSIoTのコンソールからdynamoDBに移動して、データが入ってきていればこちらも成功です(・∀・)!


色々はまったところがありましたが、先人の皆さんのおかげでうまいことできました。
上記のテストコードがうまくいったら、後はほぼこれを使いまわして色んなものに埋めていけばいいので、ここで少々時間がかかっても確認ができてよかったです。

8
10
0

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
8
10