AWSIoTCore検証メモ②:IoT rule 編
公式ドキュメント
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-rules.html
IoT ruleとは
AWS IoT Core->ACT->RuleにIoT ruleを追加することでTopicへ送られてくるメッセージに対してアクションを行う事ができます。
IoT ruleを使うことで、デバイスから送られてくるメッセージをもとに他のAWSサービスと連携することができます。
例)
- デバイスから受け取ったデータの加工またはフィルタ処理を行う。
- デバイスから受け取ったデータを Amazon DynamoDB データベースに書き込む。
- Lambda 関数を呼び出してデータを抽出する。
- MQTT メッセージから Amazon Machine Learning にデータを送信して、Amazon ML モデルに基づいて予測を行う。
- ウェブアプリケーションまたはサービスにメッセージデータを送信する。
IoT ruleの設定
IoT ruleの作成は[AWS IoT Core]->[ルール]->[作成]で新規ルールを作成できます。
クエリステートメントにルールクエリを記載することで送られてきたメッセージに対して加工を行うことができます。
#topicに送られてくる全てのメッセージをトリガー
SELECT * FROM "<topic>"
ルールクエリには以下の組み込み関数が利用可能
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sql-functions.html#iot-func-abs
使用頻度の高そうな組み込み関数
- clientid() : メッセージを送信している MQTT クライアントのID
- clientid() AS client_id
- timestamp():ミリ秒単位で現在のタイムスタンプ
- timestamp() AS timestam
- traceid() : MQTT メッセージのトレース ID (UUID)
- traceid() AS trace_id
例)Topic:test/testingに送られてくるすべてのメッセージ内にデバイスのclientIDとtimestanpを追加するルールクエリ
SELECT clientid() AS client_id, timestamp() AS timestamp, * FROM "test/testing"
デバイスから以下のデータをTopic:test/testingに送信すると
"data": {
//元のデバイスからのメッセージ
"message": "SendSensorData",
"SensorData": 2
}
ルールクエリ内でclient_idとtimestampが送られてきたメッセージに追加される
"data": {
//元のデバイスからのメッセージ
"message": "SendSensorData",
"SensorData": 2,
//ルールクエリで追加されたclientIDとtimestamp
"clientID": "10PC202010012",
"timestamp": 1617598518923
}
DynamoDBに保存された静的データとの連携
ルール内でDynamoDBからのテーブルの抽出も可能
DynamoDBからルールクエリ内でデータを抽出する際の書式
get_dynamoDB (tableName、partitionKeyName、partitionKeyValue、sortKeyName、sortKeyValue, roleArn)
get_dynamoDB() の使用方法の例として、AWS IoT に接続されているすべてのデバイスのデバイス ID と位置情報を含む DynamoDB テーブルがあるとします。次の SELECT 文は、 get_dynamoDB() 関数を使用して、指定したデバイス ID の場所を取得することができます。
以下のような内容でDynamoDBにテーブルを用意し、
ルールクエリに以下のクエリを指定します。
クエリの内容は、timestampの追加と、DynamoDBのIoTCoreTestテーブルからclientIDが一致するデータをDBdataとして追加するといった内容になっています。
SELECT *, timestamp() AS timestamp,get_dynamoDB("IoTCoreTest", "clientID" , clientID ,"arn:aws:iam::941279141676:role/DynamoDBTest").* AS DBdata FROM 'Test/IoTDevice01'
ルールクエリを動かしてみると以下のようなデータが取得できます。
"data": {
//元のデバイスからのメッセージ
"message": "SendSensorData",
"SensorData": 2,
//ルールクエリで追加されたclientIDとtimestamp
"clientID": "10PC202010012",
"timestamp": 1617598518923,
//ルールクエリ内でDynamoDBから抽出したデータ
"DBdata": {
"address": "東京都墨田区押上1丁目1−2",
"clientID": "10PC202010012",
"Tell": "yyy-yyyy-yyyy",
"GeoJSON": {
"coordinates": [
139.764658,
35.688752
],
"type": "POINT"
},
"InstallationDate": "2021/04/05",
"Admin": "Tom_zono",
"LastCommunication": "",
"DeviceName": "LIFEBOOK_U939"
}
}
ルールクエリを設定することにより、デバイスから送られてきたメッセージに対して、DBに保存してある静的データの追加等の処理が行えるようになりました。
初回のユースケースの構成では今回の内容は赤枠内のトピックからルールまでの設定部分になります。
IoT ruleの使いどころ
AWSのサービスとデバイスからのメッセージを連携させて処理させるときにはIoT ruleのRuleActionを使えば簡単に連携させることができる。
デバイスからのデータにclientIDを追加することによって、AWS以外のサービスを使うときにもどのデバイスからデータが送信されてきてるのかの判別が容易になる。
このデータに、DynamoDBに保存されているデバイスの静的データ(設置場所の情報、設置時期、デバイスの管理者etc...)が加わってくれば付加価値の高いデータとしてリアルタイム処理を行うことができそう。
センサー等の動きのあるデータはデバイス上のプログラムから送信して、変更される頻度が少ないデータはDynamoDBに保存して、その都度呼び出してあげたほうがよさそうですね。
後はWHERE句を使うことでセンサー値n以上の場合処理を行うなど取った設定もできるので、閾値の設定などlambda等を使う必要がない簡単な処理はルールクエリを活用するといいと思います。
次回は届いたメッセージの内容に応じて何らかのアクションを起こす[ IoT action ]について検証を行っていきます。
AWS IoT CoreCore検証メモ③:IoT action について
Author And Source
この問題について(AWSIoTCore検証メモ②:IoT rule 編), 我々は、より多くの情報をここで見つけました https://qiita.com/tomzono/items/12f6253c864f8f8c4070著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .