目次
Toggle記事の目的:
・AWSでIoTサービスを設定し、基本的レベルで使用するための手順
・典型的なMQTTプロトコルを使用して、モノとIoTプラットフォーム間で通信
・Mosquittoクライアントを使用して、デバイスをエミュレートし、IoTプラットフォームと対話
概要 – 仕組み

モノ (Device)
IoTプラットフォームに接続されたモノのことである。ただし、どのモノをどのような方法(ユーザーパスワード、またはssl証明書ペア)で接続・認証させるかを設定する必要がある。この設定は、あらかじめIoTプラットフォーム側で行うこともできるし、モノ自身がIoTプラットフォームに登録するセルフインタラクションの場合もある。
メッセージブローカー (Message broker)
モノとIoTプラットフォーム間のすべての通信のハブとして。通信経路はトピックと呼ばれ、経路のツリー状に構成される。例:
1control/item1
2control/item2
3alarm/factor1
4alarm/factor2
ここで扱うトピックの概念はわかりづらくて、AWSのSNSサービスにおけるトピックと間違いしやすい。しかし、これらのトピックはSNSサービスでは管理下ではない。IoT Coreではどのように利用できるのでしょうか。データを送りたい人、受け取りたい人は、トピックのパスを定義しなくても、一致するトピックのパスを発行したり、購読したりするだけでよい。
つまり、メッセージブローカー全体が、作られた大きなトピックであることが考えられる。関係者はこのトピックを介して通信を行い、通信を分類またはストリーミングため、異なるトピック・パスでパブリッシュとサブスクライブを行うことだけである。
ルールエンジン (Rule Engine)
通信経路(トピック)を基にして、特定の処理を起動させる。例えば、トピックcontrol/item1に通信があれば、S3に書き込んだり、Lambdaに送って処理させたりする。
モノシャドウ (Device Shadows)
IoTプラットフォーム上に保存されているモノのシルエットである。モノの状態を簡単に読み取ったり、更新したりすることが目的である。例えば、モノの状態を更新したいが、モノが接続されていないケースは多々ある。そこで、まず、モノの影から状態を更新し、モノが接続されたら、影から実際のモノに状態を更新するようにする。
この内容では、モノシャドウは使用しない。
セキュリティとアイデンティティ(Security and Identity)
通信する当事者間の認証を定義し、管理する。ユーザーパス、ssl証明書などのどのような認証か。sslキーと証明書を作成し、管理する。
基本な概念をここまで説明し、これからAWS IoTで基本的な通信チャネルを作成するための説明に入る。
1.モノの設定 (Device Setting)
この記事の内容は、モノを手動で登録する方法のみを示している。モノが自動的にIoT Platformと通信・登録したい場合は、Just In Time登録方式を使用してみてください。。その内容は、この記事の範囲外である。
まず、管理/モノに移動し、「モノを作成」をクリックする。そして、「1 つのモノを作成」を選択する。

次に、IoT Serviceと通信する際に認証に使用するモノの証明書を生成する必要がある。ここでは、IoTサービスにヘルプを生成させるので、自動生成証明書を選択する。

証明書を全てダウンロードします。
ルートCAファイルだけは、RSA 2048 bit keyを選択する:Amazon Root CA 1 を選択して、ダウンロードする。

証明書の使用を有効にするため、Activateをクリックすることを忘れないでください。そうしないと、接続が拒否される。
また、Attach a Policy for certificateにも注目してください。この証明書はIoTサービスとの通信に使用されるため、ポリシーはIoT関連の権限のみでよいが、とりあえず、IoT関連の全権限を与える。
1{
2 "Version": "2012-10-17",
3 "Statement": [
4 {
5 "Effect": "Allow",
6 "Action": "iot:*",
7 "Resource": "*"
8 }
9 ]
10}
2.ルールエンジンの設定 (Config Rule Engine)
ここでは、簡単なスレッドを作成する例である。モノは、トピック sensor-data を介して IoT Platform に接続し、メッセージを送信する。このトピックからのすべてのメッセージが 1 bucket がS3の上に保存されるように、ルール・エンジンを設定する。
まず、S3の上にbucket [001-sensor-data] を作成する。

次にRule Engineを作成する。
Actに移動し、Createをクリックする。

Name: SensorDataRule
Rule query statement: SELECT * FROM 'sensor-data/#'

[Add action]をクリックし、[Store to S3]を選択する。

bucket 001-sensor-data
を選択する。
Key: ${topic()}/${timestamp()}.json

次に、Create Roleをクリックし、S3 bucketへの書き込み権限を持つ Role を作成する。

Create roleをクリックする。次に、ルール作成画面でCreate roleをクリックする。
3.AWSのTest機能でメッセージ送信テスト
AWS IoTで利用できるMQTTクライアントを使用する。
Testに移動し、トピックを購読する。

Subscription topic: sensor-data/device1

次に、Publish to topicをクリックする。画像のようにメッセージが送信されるのが確認できる。
そして、S3の上にbucketに移動して、ここにデータが保存されていることを確認する。

Jsonファイルをダウンロードし、内容を確認する。

今回はAWS IoT Coreで利用できるMQTTエミュレータを使ったテストなので、認証のステップは必要ない。
4.ローカルのMQTTクライアントを使用して、AWS IoTに接続
まずMQTTクライアントをダウンロードし、ローカル環境にインストールする。
次に、 mosquitto_pub
コマンドを使用してIoT Serrviceにメッセージを送信する。送信時には、Deviceの項で作成した鍵・証明書ファイルを用いて認証・接続を行う。
まず、IoTのSettingsにあるIoT endpointの定義に進む。

この場合、エンドポイントは:
a24n91asa5anho-ats.iot.ap-southeast-1.amazonaws.com
次に、json 形式のデータメッセージを作成する。
1{"message": "Hello from AWS IoT console"}
そして、JSON String Escape形式に変換する。下記のオンラインサイトを使うこともお勧めである。
Free Online JSON Escape / Unescape Tool – FreeFormatter.com
結果は以下のようなJSON String Escapeになる。
1{\"message\": \"Hello from AWS IoT console\"}
最後に全部のコマンドを入れて、実行する。(このコマンドでは、あなた次第に鍵や証明書のファイル名を編集する)。
mosquitto_pub --cafile Amazon_Root_CA_1.pem --cert 8992b4c5c8-certificate.pem.crt --key 8992b4c5c8-private.pem.key -h a24n91asa5anho-ats.iot.ap-southeast-1.amazonaws.com -p 8883 -q 1 -t sensor-data/device2 -i MyIotThing --tls-version tlsv1.2 -m "{\"message\": \"Hello from DS Developers\"}" -d
ターミナルで実行すると、以下のような出力が表示される。
1Client MyIotThing sending CONNECT
2Client MyIotThing received CONNACK (0)
3Client MyIotThing sending PUBLISH (d0, q1, r0, m1, 'sensor-data/device2', ... (39 bytes))
4Client MyIotThing received PUBACK (Mid: 1)
5Client MyIotThing sending DISCONNECT
データメッセージが正常に送信されたかどうかはBucket S3 を確認してください。

jsonデータのファイルの内容を見る。

やった!おめでとうございます!
最後まで読んで頂き、どうも有難う御座います!