これからはじめるIoTシステム開発&テスト入門 3

データをDynamoDBへ保存&mockmockによるIoTシステムのテスト方法

岡嵜 雄平

2020年3月27日 6:30

目次

  1. はじめに
  2. IoT Coreが受信したデータをDynamoDBに保存する 前回までの手順で、「人を検知したときにSlackへ通知する機能」は完成しています。ただし、検知した情報はSlack上にしか残っておらず、少々不便です。 例えば「時間ごとの人が通過した回数をグラフ化して表示したい」「人の通過が多くなる要因を分析したい」といったユースケースに備えて、データをデータベースに保存しておくと良いでしょう。 今回はデータベースとして、AWSが提供する完全マネージド型key-valueおよびドキュメントデータベースであるDynamoDBを使用します。 DynamoDBの準備 データを保存するためのテーブルを事前に作成しておきます。 DynamoDBのダッシュボードにアクセスし、「テーブルの作成」をクリックします。
    クラウドアプリケーションの構成図
    以下の通り入力します。 項目名 入力値 テーブル名 check_points プライマリキー
    (パーティションキー) clientid (文字列) ソートキーの追加 チェック プライマリキー
    (ソートキー) timestamp (数値) デフォルト設定の使用 チェック
    DynamoDBテーブルの作成
    入力が完了したら「作成」をクリックしてください。 IoT Core(DynamoDBとの接続) IoT Coreのルールにアクセスして、「check_point」をクリックします。
    アクションの設定
    「アクションの追加」をクリックします。
    アクションの追加
    「DynamoDBテーブルにメッセージを挿入する」を選択して、「アクションの設定」をクリックします。
    アクションを選択
    以下の通り入力します。 項目名 入力値 テーブル名 check_points Hash Keyのタイプ STRING パーティションキー値 ${clientid() レンジキー timestamp Range key type NUMBER レンジキーの値 ${timestamp()}
    アクションの設定
    「ロールの作成」をクリックします。
    ロールの作成
    「名前」に「iot-core-dynamodb」を入力して「ロールの作成」をクリックします。
    ロールの作成
    「アクションの追加」をクリックします。
    ロールの作成
    DynamoDBの閲覧 DynamoDBのダッシュボードにアクセスし、サイドメニューの「テーブル」をクリックします。 閲覧したいテーブル名をクリックします。表示されたタブのうち「項目」タブを選択すると、テーブルに格納されているデータを閲覧できます。
    DynamoDBテーブルの閲覧
    mockmockを利用して
    クラウドアプリケーションをテストする ここまでの手順で「人を検知したときにSlackへ通知するIoTシステム」は完成です。しかし、システムを運用するにあたり、一定の品質を担保するためのテストが必要です。 ユニットテスト このシステムはデバイスがArduino言語(C/C++ベース)、クラウドのLambdaがRubyで実装されています。
    ユニットテストの構成
    デバイス上のソフトウェアのユニットテストは、実行環境やライブラリをシミュレートするといった工夫が必要となるものの、不可能ではないでしょう。 Rubyのソースコードはユニットテストフレームワークも多数あるので、それらを使えば容易にユニットテストが可能です。 本記事ではユニットテストの詳細については割愛します。 結合テスト 今回開発したシステムはそこまで大きなシステムではないため、デバイス・クラウドアプリケーションのそれぞれを結合してテストします。
    結合テストの構成
    多くの場合、ここで2つの問題が生じます。
    1. デバイスのテストで「データを送信できたこと」を確認する必要があるが、送信先のサーバがない。
    2. クラウドのテストで「データを受信したときにSlack通知すること/DynamoDBにデータを格納すること」を確認する必要があるが、データを送信するデバイスがない。
    つまり、デバイス・クラウドの双方が鶏と卵のような関係になっています。
    結合テストにおける鶏と卵問題
    この関係を打開するため、mockmockを使います。 mockmockを使ったクラウドアプリケーションの結合テスト mockmockはデバイスの代わりとなるmock(仮想デバイス)を用意して、デバイスの代わりにクラウドアプリケーションへデータを送信するサービスです。これにより、デバイスの開発完了を待たずしてクラウドアプリケーションの結合テストを簡単に開始できます。
    mockmockを利用した結合テスト
    なお、mockmockはmock1台までは無料で使えるので、読者の皆様もぜひお試しください。 IoT開発を加速する仮想デバイス作成サービス | mockmock プロジェクトの作成 mockmockにログインし、まず最初に作成するのが「プロジェクト」です。 プロジェクト新規作成へ移動し、以下の通り入力します。 項目名 入力値 プロジェクト名 check_point サーバータイプ AWS IoT Core キャパシティ cn1 プロトコル MQTT 送信先ホスト IoT Coreの設定画面に表示されているエンドポイント 証明書ファイル IoT Coreで発行した証明書ファイル 秘密鍵ファイル IoT Coreで発行した秘密鍵ファイル Root証明書ファイル こちらのページで取得したRoot証明書ファイル SSL/TLS TLSv1.2
    プロジェクト新規作成
    入力が完了したら、「登録」をクリックしてください。 バリュージェネレーターの作成 次に、mockmockから送信するデータを定義します。mockmockでは「グラフ」「バケット」「位置」の3種類のバリュージェネレーターを利用できます。 今回は、人感センサーの仕様に合わせ、値を1または0を切り替えるためバケットバリュージェネレーターを利用します。 サイドメニューの「バケット」の新規作成をクリックし、パケットバリュージェネレーター新規作成へアクセスし、以下の通り入力します。 項目名 入力値 バケットバリュージェネレーター名 pir 送信ルール ランダム データリスト 0を9行、1を1行
    バケットバリュージェネレーター新規作成
    10個のデータのうち、1つだけが1、残りは0となっています。これをランダムに選択して送信するため、10%の確率で1を送信します。 入力が完了したら、「登録」をクリックしてください。 データテンプレートの作成 続いて、データテンプレートを作成します。 サイドメニューの「テンプレート」の新規作成をクリックし、データテンプレート新規作成へアクセスして、以下の通り入力します。 項目名 入力値 テンプレート名 check_point 元になるjson { "detected": 1 }
    データテンプレート新規作成
    入力したら「登録」をクリックしてください。 次に表示された画面で「detected」の行をクリックし、モーダル上に以下の通り入力します。 項目名 入力値 型 integer 生成タイプ bucket ジェネレーター名 pir バケット 値
    データテンプレートの設定
    最終的にデータテンプレートはこのような構造となります。
    データテンプレート最終形
    mockグループ・mockステータスの作成 データの準備ができたので、続いてmockの設定に移ります。サイドメニューの「mockグループ」の新規作成をクリックし、以下の通り入力します。 項目名 入力値 mockグループ名 check_point 最大稼働時間[sec] 300
    mockグループ新規作成
    入力したら「登録」をクリックしてください。 次に、タブの「mockステータス」をクリックし、「mockステータス作成」をクリックします。
    mockステータス
    以下の通り入力します。 項目名 入力値 状態名 default 初期状態 チェック Topic /check_point QoS 1 Retain 無効 最小送信間隔[sec] 10 最大送信間隔[sec] 10 データテンプレート check_point
    mockステータス作成
    入力したら「登録」をクリックしてください。 mock起動 タブの「mock管理」をクリックし、「mock作成」をクリックします。MQTTクライアントIDはデバイスと区別できるよう、任意の値を入力してください。
    mock新規作成
    mockが作成されるので「操作」→「起動」の順にクリックするとmockが起動します。
    mock起動
    DynamoDBに値が格納されています。
    DynamoDBテーブルにPUTされたデータ
    Slackにも通知が来ました。
    Slackへの通知
    その他mockmockの活用例 今回は、バリュージェネレーターとして「バケットバリュージェネレーター」を使用しましたが、mockmockを使うとグラフを操作することで値を設定できる「グラフバリュージェネレーター」や、地図上で位置情報を設定する「位置ジェネレーター」も利用できます。
    グラフバリュージェネレーター
    位置ジェネレーター
    また、有料プランを使用すると、以下のようなテストも実施できます。
    • 複数(最大5万台)のmockを使った、クラウドアプリケーションの負荷テスト
    • 周期10秒未満の高頻度なデータ送信によるテスト(High-end mock)
    • 複数ユーザでのプロジェクトの共有(Organization)
    • 実際のデバイスから送信したデータの蓄積・加工・再送(DataRecorder)
    • SORACOMを利用したテスト(50台以下のmockであればオプション不要 / 51台以上は SORACOM Unlimited)
    この中で特に重宝するのが「DataRecorder」です。DataRecorderを利用するとデバイスから送信したデータをmockmock上のストレージに蓄積できます。
    データレコーダー概略
    蓄積したデータはmockmockのコンソールで閲覧できるだけでなく、必要に応じて加工した上で、クラウドアプリケーションへ何度でも送信し直すことができます。
    データレコーダーデータ閲覧画面
    クラウドアプリケーションが未完成の状態でデバイスをテストする場合や、デバイスが遠隔地に存在する状況下でクラウドアプリケーションを繰り返しテストする場合に重宝します。 有料プランを活用することで、より簡単に本番運用に近い環境でのテストを実現できますので、ぜひご利用ください。 おわりに 本連載も、今回で最終回となります。全3回を通じて、IoTシステム開発のイメージを掴んでいただけたでしょうか。既存のデバイスやクラウドサービスを活用することで、個人開発レベルであればIoTシステムを構築できることがお分かりいただけたかと思います。 また、IoTシステムの品質を担保する観点でmockmockの活用方法も紹介しました。PoCから本番運用に進むIoTシステムを開発・テストする際の手助けとなることを祈っています。 最後になりましたが、本記事を参考に、読者の皆さまがIoT開発の最初の一歩を踏み出すきっかけとなれば幸いです。
  3. mockmockを利用して
    クラウドアプリケーションをテストする
  4. おわりに

はじめに

前回は、AWSを利用してセンサーが人を検知したときにSlackへ通知するクラウドアプリケーションの構築手順を解説しました。

クラウドアプリケーションの構成図

今回は、このデータをデータベースに格納する方法と、mockmockを利用したテストの実施方法を解説します。

IoT Coreが受信したデータをDynamoDBに保存する

前回までの手順で、「人を検知したときにSlackへ通知する機能」は完成しています。ただし、検知した情報はSlack上にしか残っておらず、少々不便です。

例えば「時間ごとの人が通過した回数をグラフ化して表示したい」「人の通過が多くなる要因を分析したい」といったユースケースに備えて、データをデータベースに保存しておくと良いでしょう。

今回はデータベースとして、AWSが提供する完全マネージド型key-valueおよびドキュメントデータベースであるDynamoDBを使用します。

DynamoDBの準備

データを保存するためのテーブルを事前に作成しておきます。

DynamoDBのダッシュボードにアクセスし、「テーブルの作成」をクリックします。

クラウドアプリケーションの構成図

以下の通り入力します。

項目名 入力値
テーブル名 check_points
プライマリキー
(パーティションキー)
clientid (文字列)
ソートキーの追加 チェック
プライマリキー
(ソートキー)
timestamp (数値)
デフォルト設定の使用 チェック

DynamoDBテーブルの作成

入力が完了したら「作成」をクリックしてください。

IoT Core(DynamoDBとの接続)

IoT Coreのルールにアクセスして、「check_point」をクリックします。

アクションの設定

「アクションの追加」をクリックします。

アクションの追加

「DynamoDBテーブルにメッセージを挿入する」を選択して、「アクションの設定」をクリックします。

アクションを選択

以下の通り入力します。

項目名 入力値
テーブル名 check_points
Hash Keyのタイプ STRING
パーティションキー値 ${clientid()
レンジキー timestamp
Range key type NUMBER
レンジキーの値 ${timestamp()}

アクションの設定

「ロールの作成」をクリックします。

ロールの作成

「名前」に「iot-core-dynamodb」を入力して「ロールの作成」をクリックします。

ロールの作成

「アクションの追加」をクリックします。

ロールの作成

DynamoDBの閲覧

DynamoDBのダッシュボードにアクセスし、サイドメニューの「テーブル」をクリックします。

閲覧したいテーブル名をクリックします。表示されたタブのうち「項目」タブを選択すると、テーブルに格納されているデータを閲覧できます。

DynamoDBテーブルの閲覧

この記事のキーワード

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る