MODE JAPAN Developer Blog

Here you'll learn all you need to know about developing with MODE.

IoTで使われるセンサーゲートウェイのソフトウェア・アーキテクチャ

はじめまして、MODEエンジニアの野本です。主にセンサークラウド / ゲートウェイの開発を担当しています。 …と、センサークラウド / ゲートウェイといってもなかなか分かりづらいと思うので、今回はセンサークラウド / ゲートウェイとはどのようなものか、センサーゲートウェイはどんな役割でこれらをどのように開発しているかを紹介してみようと思います。

センサークラウドから見るMODEプラットフォームの概観

前々回、エンジニアの武田から MODE Japan 2 周年イベントのレポート をさせていただきました。 このイベントではMODEセンサークラウドの新機能の紹介とともに、どのような技術領域をどのようにカバーしているかの概要も紹介しました。

  • センサーからデータを取得し
  • そのセンサーデータを格納し活用出来るようにする

というIoTを使ったプロダクトを作る場合に誰もがやらなければならないが手間のかかる領域を、MODEではクラウドサービスをベースとして、それ以外の部分が必要であれば利用者個別の要望にあうようなシステムとして開発・提供しています。

f:id:tinkermode-jp:20191021114641p:plain
MODE Cloud & Sensor Cloud

MODE のシステムの中心には 「MODEクラウド」と呼んでいるプラットフォームが存在します。ゲートウェイからのデータやイベントを受け付け、独自で開発している時系列データベースにデータが格納されます。格納されたデータは、HTTP APIにより取り出し、利用者はそのデータを分析したりアプリケーションで利用することが出来ます。

センサーゲートウェイは様々なセンサーと通信しデータを収集し MODEクラウドに送信します。センサークラウドは MODEクラウドのAPIを利用しセンサーデータを可視化したりセンサーの制御を行います。

これらのMODEで開発提供しているものを利用していただくことによって利用者は

  • どんなセンサー(データ)を
  • どのように使うか

といったプロダクトの肝となる事柄を考えることに集中出来るようになります。

センサーゲートウェイの開発

ここでセンサーゲートウェイに注目してみましょう。

ゲートウェイは先ほど説明したようにセンサーの近くに配置され、センサーと直接通信し、そのデータをクラウド側に送り出すということが主な役割です。 前回の CEO 上田の記事 での説明でもあるように、データを欠損なく送信するような実装をするのはそれなりに手間がかかります。

また、前述のレポートの中でもあったようにセンサーゲートウェイでは、OTAアップデートを使った遠隔ソフトウェアアップデート、機器認証、センサーとの接続部分を開発しやすくするためのLocal APIなどが実装されています。

これらを実現するのに基本的には以下のような技術を利用しています。

  • デバイス: Intel NUC
  • OS: Linux (Ubuntu)
  • 開発言語
    • Golang
    • NodeJS (TypeScript)

f:id:tinkermode-jp:20191021121407p:plain
Sensor Gateway

センサーゲートウェイから派生したモビリティ用のゲートウェイではまた違った構成が取られたりと要求によって変わることもありますが、基本的には上記の構成により提供されています。

これらの技術は、例えば Webエンジニアなどにとっても馴染みのあるようなものであるかと思います。汎用的なもの、よりモダンな技術をうまく活用することにより開発を効率化させまたポータビリティも確保しやすくなっています。

ちなみに、MODEのエンジニアはシリコンバレー側のメンバーも含め前職ではクラウドを主戦場として開発をしていたエンジニアがほとんどで、組み込み領域をメインに業務をしていたエンジニアはほぼいません。このようなエンジニアたちが割と汎用的な技術を用いてIoT事業を進めているのもMODEの面白いところかと思います。

デバイス / OS

Intel NUC はどこでも手に入りやすく安定して稼働するので使い勝手がよく、Ubuntuを採用することでネットワークなどのOSのコンフィグレーションや外部デバイスとの通信なども基本的な Linux の扱い方やWebでの開発などでも活用している技術を利用して開発を進めることが出来ます。

開発言語

現在の言語の使い分けは以下のようになっています

  • Golang
    • MODEクラウドへのデータ送信や到達保証などのデータ回りのケア
    • ゲートウェイ内部で開発者に開放している HTTP API (Local API)
    • OTAアップデートクライアント
  • NodeJS
    • BLE などのセンサーとの通信
    • ゲートウェイのコア部分 (上記の Golang によるアプリケーション) との内部通信

Golang や NodeJS は言語本体に優れた非同期の機構が備わっているので、頻度の高いセンサーとの通信やインターネットへの通信などを互いにブロックすることなく多重化して行うことができます。

ゲートウェイソフトウェアの大部分はGolangで実装していますが、Bluetooth(BLE)センサーとの通信部分については実績のあるBLEインターフェース実装を使うためにNodeJSを使っています。センサーと通信する部分のコードをLocal APIでゲートウェイコアと切り離すことで、このように別の言語を使った実装が可能になっています。この他多くのセンサーとの通信には、ここでもGolangを使っていますが、他の言語、例えばPythonやCなどで実装することも容易です。

開発者版ゲートウェイ / センサークラウド・デモwebアプリ

ゲートウェイの開発は、Local APIの導入により、到達保証などデータ回りのケアや OTAアップデートを扱うという部分と、センサーとの通信が切り離されたことで新しいセンサー対応の開発が行いやすくなりました。

ゲートウェイのコア部分を提供し、従来は開放していなかったゲートウェイのOS環境を自由に使えるようにしたのが2周年イベントでもお知らせした開発者版センサーゲートウェイです。このゲートウェイを利用すれば、センサー通信の部分はお客様で開発し、以降のデータフローはMODEにまかせるといったことが出来るようになります。

また、開発キットでは、ゲートウェイから収集したデータを手軽に可視化するWebアプリケーションも同時に提供されており、お客様の手元で動作させることができます。このセンサーデータをリアルタイムに表示出来るこのアプリケーションを用い、効率よくセンサー対応の開発を進めることが出来ます。

終わりに

今回はセンサーゲートウェイに焦点をあて、基本的な開発スタイルを紹介させていただきました。この記事で紹介した通り、MODE開発チームではゲートウェイの開発においてもWebなどで使われる技術のいいとこ取りをして開発を進めています。他社でも同じような技術やプロセスで開発されているところもあるかとも思いますが、実際にどのような形でIoTソフトウェアの開発を進めているかが伝われば幸いです。個別機能の技術などの詳細は今後紹介出来ると思うのでお楽しみに!