MODE JAPAN Blog

IoTを活用したデジタルトランスフォーメーションのための情報、開発の現場から技術的な情報や取り組みについてお届けします。

開発者版センサーゲートウェイと Local API の紹介

MODE エンジニアの野本です。前回はセンサーゲートウェイのアーキテクチャの紹介をしましたが、その記事中や MODE セミナーレポートの記事でも紹介している開発者版センサー・ゲートウェイやそこで利用している Local API というものについて説明したいと思います。

開発者版センサーゲートウェイ

開発者版センサーゲートウェイは、お客様がカスタマイズ可能な少し特殊なセンサーゲートウェイです。

お客様がMODEが予め対応済みのセンサーをご利用の場合は、通常のセンサーゲートウェイを用いて、センサーを繋げば簡単にセンサー情報を収集することができるようになります。

ですが、もしも、MODEがお客様の利用したいセンサーに対応していなかった場合はどうでしょうか?MODE自身も対応センサーを随時更新していますが、MODEの対応を待つしかないのでしょうか?

もしも、お客様(あるいは、お客様の開発パートナー)がセンサーから情報を取得するようなプログラムを作成することが可能なのであれば、開発者版センサーゲートウェイがお客様のニーズにマッチするソリューションかもしれません。

開発者版センサーゲートウェイは、小型のLinux(Ubuntu)マシンで、お客様ご自身がマシンにログインしてお客様の利用したい(されている)センサーから情報を取得するようなプログラムを実行することができます。

ところで、それができるようなら、なんでわざわざMODEの開発者版センサーゲートウェイを使う必要があるのか?と思われるかもしれません。確かに、シンプルにマシンにつながったセンサーから情報を取得するだけであれば、数時間(慣れていれば1時間以下)で動作するソフトウェアを作ることができるかと思います。

もしも、それが、現実の環境の下、長期間運用を想定しなければ…

IoTプロダクトやサービスを運用しようとした際、ゲートウェイにおける安定的にセンサーデータを収集しつづけることの難しさや、データを収集したあとの取り扱いの難しさ、長期運用を想定した際のファームウェアの管理、等の多数の課題が存在します。

センサーゲートウェイをはじめとしたMODEの提供するゲートウェイとWeb プラットフォームは、上記のような課題を少しずつ解決しながら育ってきました。

開発者版センサーゲートウェイを利用し、お客様は独自に収集したいデータを取得する部分だけを作成することで、その他のIoTゲートウェイとして必要な機能はMODEがこれまで培ってきた機能にまかせてMODEのセンサーゲートウェイを拡張することができるようになります。その他の機能のいくつかの例としては、OTA(Over the Air)アップデートを行うための仕組みや、到達保証(ネットワークが途切れていたとしても、最終的にデータをクラウドに届ける)機能などがあげられます。

この開発者版センサーゲートウェイにおいて、お客様自身が取得したデータをMODEに送る際に重要な機能がLocal APIになります。これは、開発者版センサーゲートウェイのコアアプリケーション内で動作するローカル HTTP サーバーで、このローカルサーバーに対してデータをPOSTすると、データを受け取ったサーバーがMODE プラットフォームにデータを送信します。次節以降ではこのLocal APIについての説明をしていきたいと思います。

またセンサーデータ収集の開発を進めるにあたり、データの管理 / 可視化を出来るセンサークラウドの簡易版としてMODE センサークラウド・開発キットも同時に提供されているので、これを利用しながらデータ収集の開発を進めることが可能です。今回はこの UI の詳細な説明は主題から外れるので省きますが、こちらはソースコードを提供しているのでお客様のローカル PC で動かすことが出来、必要であれば改変して利用いただけます。

f:id:reprimande:20200218143355p:plain
MODE センサークラウド・開発キット

Local API

Local API とはゲートウェイアプリケーションが提供している、センサーのデータをやりとりするインターフェースを HTTP API として提供している機能です。

Local API
Local API

この HTTP API はゲートウェイ内部のみに公開されることが前提となっています。MODE のゲートウェイはネットワークポートを外部に開放していないのでゲートウェイ内部でのみ利用可能です。 この機能を追加する以前はセンサーデータ取得処理はゲートウェイアプリケーション本体に実装していましたが、この機能によりゲートウェイアプリケーションとセンサーデータ取得処理の実装を切り離すことが出来るようになりました。

このような機構になったことにより、

  • センサーデータ取得の処理のみ実装していけば良い
  • 認証や到達保証はゲートウェイアプリケーションが行う
  • API 自体はシンプルなので開発コストが低い
  • ゲートウェイ本体は Golang で実装されているが、クライアントはそれに依存せず使いたいプログラミング言語で実装出来る

というような利点が生まれました。

実際の MODE 内での開発においても、この機能が追加されてからはセンサーデータ収集処理とゲートウェイ本体を分離して開発することが多くなっています。 具体的には BLE センサーを処理する実装は実績のあるBLEインターフェース実装を使うために NodeJS (TypeScript) で行っています。

Local API を利用した開発者版センサー・ゲートウェイでの実装

この Local API を実装したことによりデータ収集とクラウドへのデータ送信などそれ以外の部分を分離して開発することが可能となりました。

開発者版センサー・ゲートウェイではこれを利用することで MODE の開発者以外でもセンサーデータ収集の開発を行えるようにしたものです。

それでは Local API を利用してどのように実装をするのか簡単に見てみましょう。 新しいセンサーデバイスを追加してセンサーデータを収集し MODE クラウドへ送信するのには以下の実装を行います。

  1. センサースキーマの定義 / 通知
  2. センサーデバイスからのデータ収集
  3. センサーデータの送信

これらをゲートウェイマシンの CPU 温度をセンサーデータとして収集する簡単なシェルスクリプトでの実装例で見て行きましょう。

センサーの定義 / 通知

まず最初に取得するデータの定義を内部で扱えるデータ形式に沿って定義します。この定義を Local API のアナウンス API を利用して通知します。

announce_json=$(cat <<JSON
{
  "model": "CUSTOM",
  "id": "MyNUC",
  "sensors": [
    "TEMPERATURE:0"
  ]
}
JSON
)

curl -X POST -d "$announce_json" \
  --header "Content-Type: application/json" \
  http://localhost:55299/announce

アナウンス API で送信するデータの内容は以下です。

  • model 開発キットで設定出来る modelCUSTOM 固定となります。
  • id id はセンサーデバイスを識別する値を指定します。ここではゲートウェイマシンがデバイスとなる想定なので MyNUC を設定しています。
  • sensors sensors はそのデバイスで取得出来るデータの定義となります。今回は CPU 温度データを取得するので TEMPERATURE 型で定義しています。1つのセンサーデバイスで複数のデータを取得出来るものgaほとんどであり、ここでは複数のデータ定義を行えるようになっています。

これらを設定し、curl により POST します。

センサーからのデータ取得

開発キットのデバイスとして提供される Intel NUC (NUC5CPYH) 上の Linux では /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input を参照すると CPU 温度が取得出来ます。これを5秒おきに収集してみます。

while true
do
  sleep 5

  temp=$(cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input)
done

実際のセンサーではイベントとして定期 / 不定期にセンサー側から送信されるものもあります。扱うセンサーに応じた実装となると思います。

センサーデータの送信

収集したデータを Local API 経由で MODE Cloud に送信します。先ほどの収集するスクリプトを改変してデータの送信部分を追加します。

while true
do
  sleep 5

  temp=$(cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input)
  value=$(echo $temp | awk '{print $1/1000}')

  data_json=$(cat <<JSON
    [
      {
        "sensor": "TEMPERATURE:0",
        "value": $value
      }
    ]
JSON
)

  curl -X POST -d "$data_json" \
    --header "Content-Type: application/json" \
    http://localhost:55299/sensorModules/CUSTOM:MyNUC/sensorData
done

データ送信 API を利用し、先ほど定義した CUSTOM:MyNUC デバイスの TEMPERATURE:0 のデータとして curlPOST により送信します。

ここまでで基本的なデータ収集 / 送信の実装は完了です。実装の全体はこのようになっています。

#!/bin/bash

announce_json=$(cat <<JSON
{
  "model": "CUSTOM",
  "id": "MyNUC",
  "sensors": [
    "TEMPERATURE:0"
  ]
}
JSON
)

curl -X POST -d "$announce_json" \
  --header "Content-Type: application/json" \
  http://localhost:55299/announce

while true
do
  sleep 5

  temp=$(cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input)
  value=$(echo $temp | awk '{print $1/1000}')

  data_json=$(cat <<JSON
    [
      {
        "sensor": "TEMPERATURE:0",
        "value": $value
      }
    ]
JSON
)

  curl -X POST -d "$data_json" \
    --header "Content-Type: application/json" \
    http://localhost:55299/sensorModules/CUSTOM:MyNUC/sensorData
done

このスクリプトを実行し、センサークラウドの Web UI にてセンサーモジュールを追加するとクラウド上でのデータの格納始まります。

f:id:reprimande:20200218144333p:plain
CPU 温度のグラフ

簡単ですね!

まとめ

Local API を利用するととても簡単にセンサーデータの収集を行えることが分かったかと思います。開発者版センサーゲートウェイはこれらをお客様にも利用していただけるようにしたゲートウェイです。前述のようにデータ送信時の到達保証や認証、格納やその後データを取り出すところは全て MODE の機能が利用出来ます。データを取り出したりする時は MODE Cloud が提供している HTTP API を利用出来るので任意のアプリケーションとの連携も可能です。 今回は簡単な紹介となりましたが、利用していただく場合はより詳細なチュートリアルやドキュメントを提供しているのでそちらを参考に開発していただくこととなります。また MODE 開発陣によるサポートも行っております。

使いたいセンサーはありセンサーデータの収集は出来るけどそれ以外のシステムでお悩みの方に適したプランだと思うので興味のある方はお気軽にご相談下さい!

お問い合わせ|MODE - IoTクラウド センサーデータプラットフォーム