IoTデバイスからAWSにデータを蓄積する方法(データ送信編)

  • 2021.04.10
  • AWS
IoTデバイスからAWSにデータを蓄積する方法(データ送信編)

こんにちはなおです!
私は仕事上AWSを触ることが多いのですが、AWSって入り口が物凄くわかりずらいんですよね…
とにかく最初にAWSやってと言われた時に苦労しました。
そんな経験もあってAWSについてわかりやすくまとめたら役に立つかな?と思い、今回記事にまとめました。

今回はIoTデバイスからデータを送信してAWSにデータを蓄積させる基本的な方法を紹介します!
AWSを全く触ったことがなく、右も左もわからない人向けの説明になりますのでご了承ください。

[スポンサーリンク]


そもそもAWSって何?

そもそもAWSってなんなの?という感じの人向けにざっくり説明するとAmazon Web Serviceの略でAmazonが提供している「めっちゃ機能がたくさんあるクラウドサービス」です。
とにかく機能が何百とたくさんあるらしいのですが、IoT向けだとクラウドにデータを蓄積、解析、デバイスに送信、仮想環境構築などがよく使う機能かなと思います。

その他にもWebアプリ開発やらVR、AR、機械学習のサービスなど挙げたらキリがないレベルです。
基本的に1サービス1機能というイメージですね。
データを蓄積させるサービス、分析だけを行うサービス、割り込みを行うサービス、機械学習を行うサービスなどなど関数的に分割されていいます。

そんなAWSを使用するメリットはやはり開発のし易さでしょう。
もしもIoTデバイスからクラウドにデータを送信して解析しようとしただけでも、サーバーの環境セットアップ、セキュリティ構築、データベース構築などなど面倒と言わざるを得ません。
しかしAWSであれば機能がそろっているので使いたい機能を選別して機能同士をつっくけるだけで行えるのです。
面倒な環境セットアップも必要ありませんので試したいときにパっと試せます。
この開発の容易性と拡張性が何よりのメリットだと思います。

そんなAWSを使用してデバイスからのデータを蓄積していくというのが記事の本題になります。
1つの記事では長くなりすぎるのでいくつかの記事で分けて段階毎に紹介していきます。

最終的なAWS構成

この項目はあまり気にしなくて大丈夫です。
振り返りのためだったり、AWSを知っている人向けに構成を紹介します。

最終的な構成は以下のようにPCからAWSIoTCoreにデータを送信し、その後AWSIoTAnalyticsにデータを送信してデータを蓄積させるようにします。

AWSを触ったことがほとんどない人だとIoTCoreとかIoTAnalyticsって何??という感じだと思いますが、順番に解説していくのでご安心ください。
一連の流れを実装すれば説明できるようになります。

あとIoTデバイスからの送信ですが、図にも記載の通りテストということでPCから送信します。
結局は同じことを行うのでPCでも問題ありません。
むしろ何も試していない段階でIoTデバイスからいきなり行うのは難易度が高いです。

今回の構成はIoTデバイスからAWSにデータを送信して蓄積させるための基本的な超シンプルな構成になります。
AWSには何百もの機能があり、DB機能だけでもいくつもあるくらいなので同じ「IoTデバイスからAWSにデータを送信して蓄積させる」という動作でも組み合わせによっていくつもの構成が存在します。
あくまで今回の構成は超シンプルな形であるということをご了承ください。

まずはこれで試してその後、用途によってカスタマイズしていくのがおすすめです。
では初めにデータの玄関口ともいえるAWSIoTCoreについて紹介します。

AWSIoTCoreとは?

IoTデバイスからAWSにデータを送信する際、まず初めに使用するのはAWSIoTCoreというサービスになります。
IoTCoreというサービスは何なのか簡単に言うとIoTデバイスからのデータをAWSで受け取るための機能があるサービスになります。

IoTデバイスからAWSにデータを送信する際はほぼほぼIoTCoreを使用します。
いわばデータの玄関口ですね。

まずはIoTCoreにデータを送信して、IoTCoreデータをが受信したデータを他のAWSサービスに送信することで色んなことが行えるわけです。
今回はデータを蓄積させることが目的なのでまずはAWSのデータ玄関口であるIoTCoreにデータを送信、IoTCoreにデータが到着したらAWS内でストレージサービスにデータを送信して蓄積させるというイメージになります。

[スポンサーリンク]


AWSIoTCoreのセットアップ

それでは初めにデータの玄関口であるIoTCoreのセットアップを行います。
今回の記事ではセットアップまで行い、それ以降の動作は続きの記事で紹介します。

1. AWSIoTCoreコンソールに移動する

初めにIoTCoreの各種操作を行うIoTCoreコンソールにアクセスしましょう。
https://console.aws.amazon.com/iot/home

2.ポリシーの作成

初めにIoTCoreのポリシーなるものを作成します。
ポリシーとはざっくり権限をまとめたものというイメージです。
例えばIoTCoreからとあるストレージサービスにアクセスする権限、書き込みをする権限などをまとめたポリシーを作成すると先ほどのストレージサービスへのアクセス、書き込みが行えるようになります。

このポリシーも複数作成することができるので例えばAデバイスにはアクセスだけ行うポリシーを付与させて、Bデバイスにはアクセスと書き込みのポリシーを付与させるみたいな形で使い分けられるようにもなります。
AWSは複数人、複数デバイスで操作することが前提で考えられているのでこのようにポリシーというワードが頻繁に出てきます。
先ほども述べたようにポリシーというのは色んな権限をまとめたものなんだなと思っていただけるとわかりやすいです。

ということで今後の動作で設定を行う関係でIoTCoreのポリシーを作成します。
まずはIoTCoreコンソール左のバーにあるポリシーをクリックし、その後、ポリシーの作成をクリックします。

任意のポリシー名を入力し、
アクションは「iot:*」、リソースARNには「*」を入力し、
許可にチェックします。
その後作成ボタンをクリックしてください。

アクションとは設定する権限の種類です。
今回はiot:*と入力しましたが、これはiotの全権限を示します。
リソースARNとは各種サービスの各種ユーザー向けに付与されているIDみたいなものです。
今回、リソースARNは*としましたが、これは全ユーザーを示します。

そのため今回の入力はiotCoreの全操作が行えかつユーザーの制約が無いポリシーを作成したことになります。
例えば細かく一部の機能だけのポリシーを作成したい、一部のユーザーの操作だけ対象にしたいという場合はアクションやリソースARNを細かく設定する必要があります。

その場合は以下が参考になると思います。
基本的には先ほどのポリシーで問題ありません。
https://docs.aws.amazon.com/iot/latest/developerguide/example-iot-policies.html

3. モノを登録する

次にデータを送信するIoTデバイスを“モノ”として登録します。
この登録を行うとIoTCoreに送信するための証明書などを取得できるようになります。
初めに左のバーにあるモノをクリックしましょう。

何もモノが存在しない場合は以下の画面が表示されます。
モノの登録をクリックします。

今回は単一のモノを作成します。
今後、複数のIoTデバイスを登録する場合は多数のモノの作成を行いましょう。

以下のような画面に推移します。
入力項目がいくつかありますが、今回は登録するモノの名前だけ入力して次へを押しましょう。

モノのタイプだとかグループとか検索可能なモノの属性の設定いうのはこれから多くのモノを登録した時に管理しやすくするための機能になります。
モノのタイプはデバイスの解説みたいなのを紐づける機能ですね。
グループはモノをひとまとめにグループ分けするための機能です。
検索可能なモノの属性の設定はデバイスのメーカーなどを登録して検索しやすくするための機能です。
以上のようにこのページでは名前以外はモノがめっちゃ増えたときに管理するための機能なので今は必要ありません。

次の画面では証明書の作成を行います。
この証明書はデバイスからデータをIoTCoreに送信する際に認証するための証明書です。
今回は一番上の「1-Click証明書作成」を選択します。

これで今回登録するモノの証明書が発行されました。
モノの証明書、パブリックキー、プライベートキーをダウンロードします。
プライベートキーは今回のこの画面でしかダウンロードできません!
そのためダウンロードをし忘れると再度モノの登録をしないといけなくなるため注意ください。
次にCAダウンロードボタンを押してください。

そうすると以下のような画面に推移すると思いますが、AmazonRootCA1を押してCA証明書情報を表示します。
このCA1を選択する理由はAmazon側が推奨しているためです。

そして表示されたCA証明書の内容(—–BEGIN CERTIFICATE—– から —–END CERTIFICATE—–までのすべて)をコピーしてテキストエディタに貼り付け、root.pemという名前で保存してください。

次に先ほどの証明書をダウンロードした画面に戻り、有効化ボタンを押してください。
これで証明書が有効になり、使用できるようになります。
最後に右下にあるポリシーをアタッチボタンをクリックします。

次に1で作成したポリシーを選択してモノの登録をクリックします。

以上でモノの登録が終わりました。

4. ファイルの整理

今後の動作のためにダウンロードした証明書を整理します。
certificatesという名前のフォルダを作成し、先ほどダウンロードしたモノの証明書、パブリックキー、プライベートキーと保存したroot.pemを配置してください。

[スポンサーリンク]


IoTCoreテスト

では実際にPCからIoTCoreにデータを送信して確認してみましょう。

1. IoTCoreエンドポイントの確認

デバイスからIoTCoreに送信する際、送信先を指定する必要があります。
この送信先はエンドポイントと呼ばれるIDのようなものになります。
そのためエンドポイントの確認を行います。

IoTCoreの左バーにある設定をクリックし、先頭付近にあるデバイスデータエンドポイントに記載のエンドポイントをコピーしましょう。
後ほど使用します。

2. Pythonプログラムを作成

次にPCからAWSにデータを送信するコードを作成します。
今回使用するのはPythonになります。

もしもPCにPython環境がない場合は以下等を参考に構築してみましょう。
https://www.javadrive.jp/python/install/index1.html

Pythonのエディタは個人的にPycharmがおすすめです。
今回はさほど編集しないのでとりあえずテキストエディタでも大丈夫です。
https://miyabikno-jobs.com/start-python-pycharm/

送信コードのサンプルはAWSが用意してくれているのでそれを丸々コピーして一部設定を変更して使える形にしましょう。

サンプルコードでは以下を変更して「publish.py」という名前でcertificatesフォルダの上階層に保存してください。
・ENDPOINT→先ほどの5項目で確認したエンドポイントに変更
・PATH_TO_CERT→自分のcertificatesフォルダにあるcertificate.pem.crtファイル名に変更
・PATH_TO_KEY→自分のcertificatesフォルダにあるprivate.pem.keyファイル名に変更

Pycharmをインストールした人はPycharmエディタに張り付けて保存、インストールしていない人はテキストエディタなどに張り付けて保存しましょう。

# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

from awscrt import io, mqtt, auth, http
from awsiot import mqtt_connection_builder
import time as t
import json

# Define ENDPOINT, CLIENT_ID, PATH_TO_CERT, PATH_TO_KEY, PATH_TO_ROOT, MESSAGE, TOPIC, and RANGE
ENDPOINT = "customEndpointUrl"
CLIENT_ID = "testDevice"
PATH_TO_CERT = "certificates/a1b23cd45e-certificate.pem.crt"
PATH_TO_KEY = "certificates/a1b23cd45e-private.pem.key"
PATH_TO_ROOT = "certificates/root.pem"
MESSAGE = "Hello World"
TOPIC = "test/testing"
RANGE = 3

# Spin up resources
event_loop_group = io.EventLoopGroup(1)
host_resolver = io.DefaultHostResolver(event_loop_group)
client_bootstrap = io.ClientBootstrap(event_loop_group, host_resolver)
mqtt_connection = mqtt_connection_builder.mtls_from_path(
            endpoint=ENDPOINT,
            cert_filepath=PATH_TO_CERT,
            pri_key_filepath=PATH_TO_KEY,
            client_bootstrap=client_bootstrap,
            ca_filepath=PATH_TO_ROOT,
            client_id=CLIENT_ID,
            clean_session=False,
            keep_alive_secs=6
            )
print("Connecting to {} with client ID '{}'...".format(
        ENDPOINT, CLIENT_ID))
# Make the connect() call
connect_future = mqtt_connection.connect()
# Future.result() waits until a result is available
connect_future.result()
print("Connected!")
# Publish message to server desired number of times.
print('Begin Publish')
for i in range (RANGE):
    data = "{} [{}]".format(MESSAGE, i+1)
    message = {"message" : data}
    mqtt_connection.publish(topic=TOPIC, payload=json.dumps(message), qos=mqtt.QoS.AT_LEAST_ONCE)
    print("Published: '" + json.dumps(message) + "' to the topic: " + "'test/testing'")
    t.sleep(0.1)
print('Publish End')
disconnect_future = mqtt_connection.disconnect()
disconnect_future.result()

送信内容はHello World[送信回数]をJSONに変換したものになります。

こんな感じのフォルダ構成になっていればOKです。

またコマンドプロンプトで以下を実行し、今回の処理に必要なライブラリをインストールしておきましょう。

pip intall awsiot
pip install awscrt
pip install awsiotsdk

3. 送信テスト

では実際にPCからIoTCoreにデータを送信してみましょう。
その前にIoTCoreにデータが到着したか確認するための準備をしておきましょう。

IoTCoreに到着したデータを確認するにはテスト機能を使用します。
これはIoTCoreに到着したデータを見れるだけでなく、IoTCoreから指定のデータを送信するなども行えます。
IoTCoreが絡むAWSの処理をテストする際に必ず使用する項目になります。

IoTCoreコンソール左バーにあるテストをクリックし、トピックフィルターに「test/testing」を入力し、サブスクライブをクリックしてください。
そうするとサブスクリプションにtest/testingの項目が追加されたかと思います。

今回、トピックフィルターにtest/testingと入力しましたが、トピックとは送信先みたいなイメージです。
今回だとtestフォルダの下にあるtestingフォルダにデータを送信しているみたいな感じです。

このトピック名はサンプルコードのTOPIC定数で指定しています。
トピック名は特定の送信先を絶対指定しないといけないといった制約が無く、自由に設定することができるので例えばサンプルコードのTOPICを適当にiot/testのように変更したらトピックフィルターも同じようにiot/testに変更しましょう。

ではpublish.pyをコマンドプロンプトで実行します。

python publish.py

実行後、IoTCoreテスト画面にHello Worldが3回届いていたら送信成功です!

以上でIoTCoreの設定から実際にPCからAWSへのデータ送信が行えました!
次回は以下のリンクより送信したデータをAWS内のストレージに蓄積させる動作を行います!

IoTデバイスからAWSにデータを蓄積する方法(データ蓄積編)

 

参考URL:
https://aws.amazon.com/jp/premiumsupport/knowledge-center/iot-core-publish-mqtt-messages-python/

[スポンサーリンク]


AWSカテゴリの最新記事