チュートリアルをやって雰囲気がわかったので、dynamoDBにデータを書き込むところまでできたメモをまとめした。
全体の流れ
- AWS IoT Coreでモノ・証明書・ポリシーを作成
- ルールを作成
- dynamoDBでテーブルを作成
- RasPiプログラム側にAWS IoT Coreへデータ送信する行を実装
- 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形式にして送るようにして、いろいろ試しながらテストしてみました。
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に移動して、データが入ってきていればこちらも成功です(・∀・)!
色々はまったところがありましたが、先人の皆さんのおかげでうまいことできました。
上記のテストコードがうまくいったら、後はほぼこれを使いまわして色んなものに埋めていけばいいので、ここで少々時間がかかっても確認ができてよかったです。