IoTボード利用ガイド(ファイル受信タイプ)

IoT Board Guide

IoT ボード利用ガイド

はじめに

IoT をビジネスに活用するにあたって課題となるのが、IoT デバイスが収集したデータをどうやってサーバーやクラウドに保存するかということです。サーバーやクラウドの構築には専門知識が必要です。また、それにかかる費用や期間も気になるところです。

IoT ボードでは、クラウドにデータを保存する仕組みを提供します。利用するクラウドには、セキュアで大規模データを高速に処理できる Google Cloud Platform を採用しています。

この IoT ボードを使えば、IoT デバイスからのデータを収集・蓄積する仕組みが、サーバーやクラウドに関する専門的な知識を必要とせず、簡単かつスピーディに構築できます。

IoT ボードとは何か

IoT ボードは、IoT デバイス(「デバイス」)から送られてくるデータを受け取り、ストレージに保存するクラウド型のシステムを提供します。

IoT ボード概略図

このシステムは、お客さまの Google Cloud Platform (「GCP」) プロジェクト上に、BLOCKS が自動で構築します。システムの構築(IoT ボードの作成)に、GCP に関する専門的な知識は不要です。

   IoT ボードのシステムは、お客さまの GCP プロジェクト上に構築するため、BLOCKS の料金とは別に「 GCP サービスの利用料金」が発生します。

IoT ボードには、データの種類(「タイプ」)に応じて、2 つのタイプあります。

タイプ 説明
メッセージ受信タイプ
  • デバイスから加速度・温度・湿度などの比較的小さなデータ(「メッセージ」)を受け取り、BigQuery のテーブルにデータを保存します。
メッセージ受信タイプ概略図
ファイル受信タイプ
  • デバイスから画像ファイルや音声ファイルなどのファイル形式のデータを受け取り、Google Cloud Storage にファイルを保存します。
  • ログ(ファイル名や保存日時など)を保存できます(オプション)。
  • ファイルの保存を契機に、ビッグデータボードのフローを実行します(オプション)。
ファイル受信タイプ概略図

   現バージョンで作成できる IoT ボードの数は、5 ボード / 組織[1]までです。

IoT ボードの作り方

このドキュメントでは、ファイル受信タイプの IoT ボードについて解説しています。

メッセージ受信タイプの IoT ボードについては、「IoT ボード利用ガイド(メッセージ受信タイプ)」で解説しています。

IoT ボードは、ユーザーの GCP プロジェクトに環境を構築します。このため、IoT ボードを作る前に、「GCP プロジェクトの作成」および「GCP の各種サービスにアクセスするためのサービスアカウントの作成」を済ませておく必要があります。

エンジニアブログの「GCP 入門 その 1 」を参考に準備してください。ブログ記事は、BigQuery ブロックの利用を前提としています。プロジェクト名やサービスアカウント名に、bigquery というキーワードを含めていますが、自由に設定して構いません。また、記事中の「MAGELLAN BLOCKS に GCP アカウントを登録する。」部分の作業は不要です。

なお、この準備には Google アカウントが必要です。Google アカウントをお持ちでない方は、Google アカウントの作成 ページで、Google アカウントを作成してから準備を進めてください。

IoT ボードを作る大まかな流れ

IoT ボードは、ボード一覧(BLOCKS ログイン直後の画面)から IoT ボードの [追加する] ボタンをクリックして、案内に沿って操作するだけで簡単に作れます。

IoT ボードを作る大まかな流れは、以下のとおりです。

  1. IoT ボード作成
    IoT ボードに名前をつけて、作成するボードの種類を選択します。
  2. GCP サービスアカウント設定
    IoT ボードで使用する GCP サービスアカウントを設定します。
  3. エントリーポイント設定
    デバイスが IoT ボードへデータを送るときの送り先の設定をします。
  4. ストレージ設定
    IoT ボードが受け取って処理したデータをどう保存するかを設定します。
  5. ビッグデータボード連携設定
    IoT ボードが受け取ったデータをストレージへ保存したときに、実行するビッグデータボードのフローを設定します。
  6. 入力内容の確認
    これまでの設定内容を確認します。

それぞれについて、以降で詳しく解説します。

IoT ボード作成

「IoT ボード作成」は、ボード一覧の画面から IoT ボードの [追加する] ボタンをクリックすると、表示される画面です。

ここでは、IoT ボードの名前(「ボード名」)と、ボードのタイプ(「タイプ選択」)を設定します。

ボード名には、わかりやすい名前をつけておくと、管理しやすくなります。なお、IoT ボード作成後、名前は変更できません。

タイプ選択は、以下の説明を参考にして選択してください。

タイプ 説明
メッセージ受信タイプ
  • デバイスから加速度・温度・湿度などの比較的小さなデータ(「メッセージ」)を受け取り、BigQuery のテーブルにデータを保存します。
メッセージ受信タイプ概略図
ファイル受信タイプ
  • デバイスから画像ファイルや音声ファイルなどのファイル形式のデータを受け取り、Google Cloud Storage にファイルを保存します。
  • ログ(ファイル名や保存日時など)を保存できます(オプション)。
  • ファイルの保存を契機に、ビッグデータボードのフローを実行します(オプション)。
ファイル受信タイプ概略図

ボード名とタイプ選択が完了したら、[次へ] ボタンをクリックして、「GCP サービスアカウント設定」へ進みます。

([キャンセル] ボタンをクリックすると、IoT ボードは作らずに、ボード一覧画面に戻ります。ここで設定した内容は残りません。)

GCP サービスアカウント設定

「GCP サービスアカウント設定」は、「IoT ボード作成」画面で [次へ] ボタンをクリックすると表示される画面です。

ここでは、GCP のサービスアカウントキーファイル(JSON 形式)を次のいずれかの方法で登録(「アップロード」)します。

  • ドラッグ&ドロップの操作で、「GCP サービスアカウント JSON ファイルアップロード」にファイルをドロップする
  • [ファイルを選択] ボタンをクリックしファイルを指定する

「GCP プロジェクト」や「GCP サービスアカウント」の準備ができていない場合は、エンジニアブログの「GCP 入門 その 1 」を参考に準備してください。

ブログ記事は、BigQuery ブロックの利用を前提としています。プロジェクト名やサービスアカウント名に、bigquery というキーワードを含めていますが、自由に設定して構いません。また、記事中の「MAGELLAN BLOCKS に GCP アカウントを登録する。」部分の作業は不要です。

なお、この準備には Google アカウントが必要です。Google アカウントをお持ちでない方は、Google アカウントの作成 ページで、Google アカウントを作成してから準備を進めてください。

GCP サービスアカウントキーのアップロードが完了したら、[次へ] ボタンをクリックして、「エントリーポイント設定」へ進みます。

([キャンセル] ボタンをクリックすると、IoT ボードは作らずに、ボード一覧画面に戻ります。ここまで設定した内容は残りません。)

エントリーポイント設定

「エントリーポイント設定」は、「GCP サービスアカウント設定」画面で [次へ] ボタンをクリックすると表示される画面です。

ここでは、以下のエントリーポイントに関する設定を行います。

  • App Engine Admin API (「Admin API」) の有効化
  • Google Cloud Deployment Manager V2 API (「Deployment Manager V2 API」) の有効化
  • 接続先 URL の設定

エントリーポイントとは、デバイスが IoT ボードへデータを送るときの送り先(データを受け取って処理する部分の受け取り口)のことです。エントリーポイントは、URL (「接続先 URL」) で示されます。デバイスは、この接続先 URL に HTTP の POST メソッドでデータを送ります。

エントリーポイントのイメージ図

   エントリーポイントでファイルを受け取る処理は、Google App Engine (「GAE」) で実現しています。この GAE を使ったシステムの構築は BLOCKS 側で行いますが、そのためには Admin API と Deployment Manager V2 API を有効にする必要があります。

API を有効化する手順は以下のとおりです。

  1. API のリンクをクリックします。
    別タブに GCP の画面が表示されます。
  2. 画面上部にある [有効にする] ボタンをクリックします。
  3. [有効にする] ボタンが [無効にする] に変化したら、画面を閉じて BLOCKS の画面に戻ります。
  4. [更新する] ボタンをクリックします。
    API の状態表示が「有効化済み」と表示されます。「有効化済み」とならない場合は、しばらく時間をおいてから [更新する] ボタンをクリックしてください。

また、接続先 URL は、以下のように形式が決まっています。一部のみ自由に設定することができます。

https://magellan-file-<*****>-dot-<プロジェクト ID>.appspot.com

項目 説明
<*****>

この IoT ボードのエントリーポイントを特定するための文字列です。自由に設定できます。デフォルトの値は、ランダムな 16 進数文字列です。

  • 使用できる文字は、英小文字(a 〜 z)、数字 (0 〜 9) およびハイフン (-) です。
  • 末尾の文字は、数字か英小文字でなければなりません。
  • 文字数は、プロジェクト ID の長さによって変わり、15 文字から 27 文字までです。

1 つの GCP プロジェクトで、複数の IoT ボードを作成する場合は、文字列が重複しないように設定してください。

<プロジェクト ID> GCP プロジェクト のプロジェクト ID が自動で設定されます。変更できません。

エントリーポイントの設定が完了したら、[次へ] ボタンをクリックして、「ストレージ設定」へ進みます。

([キャンセル] ボタンをクリックすると、IoT ボードは作らずに、ボード一覧画面に戻ります。ここまで設定した内容は残りません。)

ストレージ設定

「ストレージ設定」は、「エントリーポイント設定」画面で [次へ] ボタンをクリックすると表示される画面です。

ここでは、デバイスから送られてきたデータを Google Cloud Storage (「GCS」) のバケットへ保存する設定を行います。また、ファイルの保存履歴(「ログ」)を BigQuery に残すことができるため、その設定もここで行います。

「GCS (Google Cloud Storage) バケットの選択」では、GCS 上のどのバケットにファイルを保存するかを設定します。なお、バケットとは、ファイルを保存する GCS 上の領域のことです。バケットは、事前に作成してください。

「オプション設定」では、ログを BigQuery に保存する設定を行います。ログを保存したい場合は、「ログを BigQuery に保存する」をチェックして、ログの保存先とする BigQuery のデータセットとテーブルを指定します。

指定したデータセットやテーブルが存在しなければ、IoT ボード作成時に自動でデータセットやテーブルを作成します。作成するテーブルでは、gcs_url と timestamp というフィールドが必ず作成されます。

フィールド名 データ型 説明
gcs_url STRING 保存するファイルの GCS URL (gs://バケット名/ファイル名)
timestamp TIMESTAMP ファイルを保存した日時

このほかに、ログに追加で記録したい情報があれば、その情報を記録するスキーマを追加してください。ログに追加で記録したい情報は、IoT ボードへデータを送るときに、ログに追加で記録したい情報も一緒に送ります。ログに記録したい情報は、「スキーマで追加したフィールド名=記録する情報」という形式で送ります。

例えば、ファイルの所有者情報もログに記録したいとします。スキーマにファイルの所有者情報を記録する「author」フィールドを追加します。デバイスから IoT ボードへデータを送るときに、「author=MAGELLAN」というパラメーターを付加します。IoT ボードは、ログの「author」フィールドに、「MAGELLAN」を記録します。

デーバイスから IoT ボードへデータを送る様子の図

なお、テーブルに既存のテーブルが指定された場合は、これらのフィールドがあることを期待します。少なくとも gcs_url と timestamp フィールドがないと、ログ保存時にエラーが発生します。

ストレージの設定が完了したら、[次へ] ボタンをクリックして、「ビッグデータボード連携設定」へ進みます。

([キャンセル] ボタンをクリックすると、IoT ボードは作らずに、ボード一覧画面に戻ります。ここまで設定した内容は残りません。)

ビッグデータボード連携設定

「ビッグデータボード連携設定」は、「ストレージ設定」画面で [次へ] ボタンをクリックすると表示される画面です。

ここでは、デバイスから送られたデータを GCS にファイルとして保存されたことをきっかけにして、特定のビッグデータボードのフローを実行する設定を行います。

GCS へのファイル保存を契機にビッグデータボードのフローを実行したい場合は、「ビッグデータボード連携機能を使用する」をチェックして、実行したいフローを選択します。

フロー実行時には、以下のパラメーターが渡されます。

パラメーター名 説明
gcs_url 保存したファイルの GCS URL (gs://バケット名/ファイル名)
target_time ファイルを保存した UTC 時刻(2016-10-13 12:39:10.234)
filename 保存したファイル名

このほかに、デバイスが IoT ボードへ送った上記以外のパラメーターもそのまま渡されます。

file_type_iot_board_parameter_ja

   連携するビッグデータボードに、「API Token for IoT Board <IoT ボードのボード名>」という説明内容で API トークンが追加されます。この API トークンは削除しないでください(連携できなくなります)。API トークンの説明内容は変更できます。

ビッグデータボードとの連携の設定が完了したら、[次へ] ボタンをクリックして、「入力内容の確認」へ進みます。

([キャンセル] ボタンをクリックすると、IoT ボードは作らずに、ボード一覧画面に戻ります。ここまで設定した内容は残りません。)

入力内容の確認

「入力内容の確認」は、「ビッグデータボード連携設定」画面で [次へ] ボタンをクリックすると表示される画面です。

ここでは、これまで設定した内容が確認できます。設定に間違いがないかを確認して、もし間違いがあれば [前へ] ボタンをクリックして、間違いを修正する設定画面まで戻ります。設定に間違いがなければ、[完了] ボタンをクリックします。

([キャンセル] ボタンをクリックすると、IoT ボードは作らずに、ボード一覧画面に戻ります。ここまで設定した内容は残りません)。

[完了] をクリックすると、ユーザーの GCP プロジェクトに作成される IoT ボード関連のリソースが一覧表示されます。これらのリソースは、IoT ボード作成後、GCP プロジェクトから誤って削除しないように気をつけてください。

このまま、IoT ボードの作成を続ける場合は、[OK] ボタンをクリックしてください。ここで、[OK] ボタンをクリックすると、IoT ボードの作成が開始されます。

([キャンセル] ボタンをクリックすると、IoT ボードは作成せずに、「入力内容の確認」画面に戻ります。)

IoT ボードの作成には、しばらく時間がかかります。IoT ボードの作成が完了すると、IoT ボードの詳細画面に切り替わり、画面上部に IoT ボードの作成が完了した旨のメッセージが表示されます。

IoT ボードへデータを送る方法

デバイスから IoT ボードへデータを送るには、HTTP の POST メソッドで「接続先 URL」へデータを送ります。送るデータは、application/x-www-form-urlencoded 形式でエンコードしてください。

デバイスから IoT ボードへデータを送るときは、少なくとも以下のパラメーター(「パラメーター名=値」という形式)が必要です。

送る情報 パラメーター名
API トークン key IoT ボード詳細画面の「API トークン」の値
ファイル名 filename GCS に保存するときのファイル名
ファイルとして送るデータ content Base64 でエンコードしたデータ

このほかに、任意のパラメーターが送れます。ビッグデータボードのフローと連携した場合は、IoT ボードに送る任意のパラメーターは、そままフローにも送られます。

ログに標準以外のフィールドを追加した場合は、フィールド名をパラメーター名としたパラメーターを送ると、ログにそのデータが保存されます。

例えば、以下の仕様でファイルを GCS に保存するとします。

  • テキストファイルを GCS へ保存します。
    • ファイル名は、「sample.txt」とします。
    • ファイルの中身は、「hello, world」という文字列のみとします。
  • ログに追加のフィールド「author」があります。
  • ビッグデータボードのフローと連携します。
    • フローでは、外部からの情報を変数 foo で参照します。

デバイスから IoT ボードへ送るデータは、以下のとおりです(HTTP ヘッダーは一部のみの例示です)。

POST /upload HTTP/1.1
Content-Type: application/x-www-form-urlencoded
    
key=d29b76ac16181816ac7bd678&filename=sample.txt&content=aGVsbG8sIHdvcmxkCg%3D%3D&author=MAGELLAN&foo=bar

このときの各パラメーターの意味は、以下のとおりです。

パラメーター 説明
key=d29b76ac16181816ac7bd678 API トークンです。
filename=sample.txt GCS にデータを保存するときのファイル名です。
content=aGVsbG8sIHdvcmxkCg%3D%3D GCS に保存するデータです。「hello, world」という文字列を Base64 でエンコード後、さらに application/x-www-form-urlencoded 形式でエンコードしています。
author=MAGELLAN 任意のパラメーターです。ログの追加フィールド「author」に、「MAGELLAN」という値を保存する目的で使用しています。連携するフローにも渡されます。フローでは、「MAGELLAN」という値を変数「author」で参照できます。
foo=bar 任意のパラメーターです。連携するフローに渡されます。フローでは、「bar」という値を変数「foo」で参照できます。

なお、連携するフローには、「gcs_url」・「target_time」・「filename」というパラメーターも渡されます。詳しくは、「ビッグデータボード連携設定」を参照してください。

   「接続先 URL」と「API トークン」は、IoT ボード詳細画面で確認できます。IoT ボード詳細画面は、確認したい IoT ボードの [詳細] ボタンをクリックすると表示されます。

GCP サービスの利用料金

IoT ボードは、ユーザーの GCP プロジェクトに各種 GCP サービスを利用した環境を構築します。

このため、MAGELLAN BLOCKS の料金とは別に GCP の料金が発生します。適用される料金は、サービスごとに異なります。詳しくは、IoT ボードで使用する各サービスごとの料金ページを参照してください。

IoT ボードの使い方

ここでは、デバイスから IoT ボードへ画像ファイルを送り、ビッグデータボードのフローと連携し画像解析する方法を例示します。

作成する IoT ボードの仕様

下図は、「IoT ボード」と「ビッグデータボードのフロー」との連携の様子です。

サンプルの概略図
  • デバイスから画像ファイルを IoT ボードへ送ります。このとき画像ファイルの所有者情報(「author=MAGELLAN」)も一緒に送ります。
  • IoT ボードでは、画像ファイルを GCS のバケットに保存し、所有者情報もログ(「author」フィールド)に記録します。
    また、画像ファイルの保存後、ビッグデータボードのフローを実行します。
  • ビッグデータボードのフローでは、保存された画像を「Vision API (汎用)」ブロック使って色解析します。解析結果は、「ログへ出力」ブロックを使って、ログに出力します。

IoT ボードを作る

まず、ビッグデータボードのフローを以下の内容で準備します。# 列は、ブロックを上から順に繋げる順番を示します。なお、フローの開始と終了は省略しています。

# ブロック ブロックの設定
1 Vision API (汎用)
  • GCP サービスアカウント: 適切な GCP サービスアカウント
  • 画像のGCS上のURL: ${gcs_url}
  • 検知する情報: 色解析のみ
2 ログへ出力
  • ログへ出力する変数: _
3 ログへ出力
  • ログへ出力する変数: author

続いて、IoT ボードは、以下の内容で作ります。実際に試す場合は、バケットやテーブルなどの具体的な値を示しているところは、自由に変えて構いません。

画面 項目 内容
エントリーポイント設定 接続先 URL デフォルトのままとします。
ストレージ設定 GCS バケット 「magellan-iot-sample」とします。
ログ

ログを BigQuery に保存します。

  • データセット: samples
  • テーブル: logs
  • 追加するフィールド: author (STRING 型)
ビッグデータボード連携設定 連携 先に作っておいた「Vision API (汎用)」ブロックで画像を解析し、解析結果をログへ出力するフローと連携します。

試してみる

以下のサンプル画像を色解析し、ドミナント・カラーを分析してみます。

ドミナント・カラー分析用サンプル画像

なお、このドキュメントでは、Unix 系の「curl」コマンドと「base64」コマンドをターミルで使って試しています。

まず、画像の準備をします。以下のコマンドを実行します。

curl https://storage.googleapis.com/blocks-docs/basic-guide/image_properties_sample.jpg | base64 -o sample.jpg

「curl」コマンドを使って、サンプル画像ファイルをダウンロードしています。また、「base64」コマンドを使って、Base64 形式にエンコードしています。ファイル名は、「sample.jpg」としています。

続いて、画像ファイルを IoT ボードへ送ります。

以下のように「curl」コマンドを使います。API トークン(「key」パラメーター)は、作成するボードごとに異なります。実際に試す場合は、お使いの IoT ボードの API トークンに読み替えてください。

curl --data key=d29b76ac16181816ac7bd678 --data filename=sample.jpg --data-urlencode content@sample.jpg --data author=MAGELLAN https://magellan-iot-2edblhnt-dot-magellan-iot-sample.appspot.com/upload

これで、画像ファイルが GCS に保存され、ビッグデータボードのフローでその画像が解析されます。以下は、フローの実行ログです。

[2016-10-20 14:01:17.513]  info : Job-37 start
[2016-10-20 14:01:17.535]  info : VersatileVisionApi step start
[2016-10-20 14:01:17.543]  info : VersatileVisionApi: annotate for file gs://magellan-iot-sample/sample.jpg start
[2016-10-20 14:01:19.231]  info : VersatileVisionApi: annotate for file gs://magellan-iot-sample/sample.jpg finished
[2016-10-20 14:01:19.240]  info : VersatileVisionApi step finished
[2016-10-20 14:01:19.273]  info : Print step start
[2016-10-20 14:01:19.284]  info : Variable: '_'
{
  "imagePropertiesAnnotation": {
    "dominantColors": {
      "colors": [
        {
          "pixelFraction": 0.14428461,
          "color": {
            "green": 18,
            "blue": 17,
            "red": 23
          },
          "score": 0.362649
        },
        {
          "pixelFraction": 0.24923818,
          "color": {
            "green": 161,
            "blue": 117,
            "red": 131
          },
          "score": 0.15836251
        },
        {
          "pixelFraction": 0.035149883,
          "color": {
            "green": 164,
            "blue": 95,
            "red": 116
          },
          "score": 0.065103777
        },
        {
          "pixelFraction": 0.0064488696,
          "color": {
            "green": 194,
            "blue": 208,
            "red": 196
          },
          "score": 0.0080435993
        },
        {
          "pixelFraction": 0.12600099,
          "color": {
            "green": 132,
            "blue": 90,
            "red": 104
          },
          "score": 0.094027691
        },
        {
          "pixelFraction": 0.026787613,
          "color": {
            "green": 47,
            "blue": 46,
            "red": 51
          },
          "score": 0.057900768
        },
        {
          "pixelFraction": 0.025795478,
          "color": {
            "green": 137,
            "blue": 71,
            "red": 90
          },
          "score": 0.036577545
        },
        {
          "pixelFraction": 0.027354546,
          "color": {
            "green": 160,
            "blue": 100,
            "red": 125
          },
          "score": 0.02605368
        },
        {
          "pixelFraction": 0.018850543,
          "color": {
            "green": 91,
            "blue": 58,
            "red": 72
          },
          "score": 0.0187341
        },
        {
          "pixelFraction": 0.03351995,
          "color": {
            "green": 136,
            "blue": 78,
            "red": 104
          },
          "score": 0.016537288
        }
      ]
    }
  },
  "gcs_url": "gs://magellan-iot-sample/sample.jpg",
  "timestamp": 1476939676.1383731
}
[2016-10-20 14:01:19.293]  info : Print step finished
[2016-10-20 14:01:19.324]  info : Print step start
[2016-10-20 14:01:19.333]  info : Variable: 'author'
"MAGELLAN"
[2016-10-20 14:01:19.341]  info : Print step finished
[2016-10-20 14:01:19.368]  info : Job-37 finished

[1] 組織とは、何人かの MAGELLAN BLOCKS ユーザーをひとつにまとめる仕組みです。組織は、BLOCKS アカウント登録時に、自動で作成されます。この組織には、自身のアカウントのみが所属しています。現バージョンでは、組織を追加したり、他の組織に所属したりできません。従って、現時点では、「組織 = ユーザー」となっています。