IoTプラットフォームをOSSで手軽に構築する　その１

# はじめに

この記事は、IoTデータを扱うためのオープンソースのプラットフォームである**FIWARE**を紹介します。

この記事を読むと以下のことがわかります。

- [なぜIoTプラットフォームが必要なのか](#なぜiotプラットフォームが必要なのか)
- [FIWAREとは何か](#fiwareとは)
- [FIWAREのアーキテクチャ](#fiwareのアーキテクチャ)
- [FIWAREで扱うデータモデルの概念](#fiwareで扱うデータモデルの概念)

※この記事を読むのにかかる時間は20分ほどです。**とにかく動かしてみたい方** は、[IoTプラットフォームをOSSで手軽に構築する　その２](https://qiita.com/okinawa-openlab/items/a1b0187c9cd92ac1cc83) へ進んでください。

# なぜIoTプラットフォームが必要なのか

現在、パブリッククラウドなどの商用サービスやオープンソースプロジェクトとして数多くのIoTプラットフォームが存在し開発されていますが、そもそもなぜIoTプラットフォームが必要なのでしょうか。

IoTがセンサーデバイスがインターネットにつながっただけの単純なものではないことは広く知られるようになりました。今日のIoTは、大量のセンサーデバイスからのデータを効率よく収集し、高度に分析・可視化され、様々なビジネスの課題や社会課題の解決のために利活用できることが求められています。

このようなIoTのシステムを実現するために、IoTに関わる様々な技術要素を使いやすいようにひとまとめにしてしまったものがIoTプラットフォームです。IoTプラットフォームは一般的に以下に示すような多岐にわたる機能を持っている必要があります。

  - **IoTデバイス管理**
IoTデバイスをプラットフォームに接続し、状態の管理などを行う機能
  - **データの蓄積**
大量のデータを蓄積し、取り出せるようにする機能
  - **データの分析**
蓄積されたデータから傾向などを分析する機能
  - **プロトコル変換**
MQTTなどのIoTデバイスに適したプロトコルへ変換する機能
  - **データの可視化**
蓄積・分析されたデータを可視化する機能
  - **セキュリティ**
IoTデバイスやデータを保護する機能
  - **認証・認可**
IoTデバイスやデータ利用者に対する認証認可機能

これらの機能に加えて、開発環境やデータ利用やデータアップロードのためのライブラリなど、まだまだ多くの機能が必要です。こういった機能の一つ一つを開発者が自力で構築するのは非常に困難であり非効率です。

# FIWAREとは

FIWAREとは、データ流通やIoTなどのスマートソリューションの開発を迅速に行うためのオープンソースソフトウェアです。

FIWAREは2011年に欧州委員会の官民連携プログラム(FI-PPP)で開発が開始され、現在はヨーロッパを中心とした企業で開発・利用されています。日本においても地方自治体を中心に導入が進められてきています。

FIWAREの大きな特徴として以下の3点が挙げられます。

  1. **オープンAPI**
FIWAREは様々な種類の情報にアクセスし管理するための[オープンAPI](https://github.com/FIWARE/specifications)を持っています。

  2. **標準化されたAPI**
FIWAREが採用する[NGSI](http://www.openmobilealliance.org/release/NGSI/V1_0-20120529-A/OMA-TS-NGSI_Context_Management-V1_0-20120529-A.pdf)はOpen Mobile Alliance(OMA)によって標準化されています。最新の[NGSI-LD](https://www.etsi.org/deliver/etsi_gs/CIM/001_099/009/01.01.01_60/gs_CIM009v010101p.pdf)はEuropean Telecommunications Standards Institute(ETSI)によって標準化されています。


  3. **マイクロサービスアーキテクチャ**
FIWAREは機能別に分割された多数のマイクロサービス郡で構成されており、必要なコンポーネントを選んで構築できます。

FIWAREを使うことによって、IoTデバイスによって生まれる多数のデータを簡単に収集・蓄積・利用することが可能になります。

## FIWAREのアーキテクチャ
FIWAREではIoTプラットフォームに必要な機能として約４０種類のコンポーネントが用意されています。代表的なものとして、データ管理コンポーネント、認証・認可コンポーネント、デバイス管理コンポーネントなどがあります。それらのコンポーネントを用途にあわせて自由に組み合わせて利用します。

これらのFIWAREコンポーネントはGeneric Enabler(以降、GE)と呼ばれており、DockerのコンテナイメージでFIWAREのコミニュティ（FIWARE Foundaiotn）より公開されています。
![](https://i.imgur.com/kcoEVBz.png)

次にFIWAREの代表的なコンポーネントについて説明します。FIWAREでは、最新のデータと過去の履歴データは分けて管理します。最新のデータは**Orion**というコンポーネントで保持されます。過去の履歴データは**Comet**というコンポーネントへ蓄積されます。

履歴データを扱うコンポーネントはComet以外にもあります。**CKAN**や**Cosmos**(Hadoop)といったものです。どのコンポーネントへ蓄積するかは、履歴データを何にどう使うかによって異なるため、自由に選択できるようになっています。
Orionが履歴データコンポーネントにデータを通知する際のキューとなるのが**Cygnus**です。また各コンポーネントへのアクセスの認可・認証をするモジュールでは**Keyrock**となります。

![](https://i.imgur.com/veE6Zux.png)

# FIWAREで扱うデータモデルの概念
FIWAREのデータモデルではとてもシンプルです。データモデルは主にエンティティとアトリビュートと呼ばれる２つの要素から構成されます。エンティティとアトリビュートについて、車両に関する情報を蓄積するシーンを考えながら説明していきます。

## エンティティ(Entities)

エンティティは、現実世界のあらゆる物理オブジェクトを仮想的に表現したもので、タイプ(型)、ID(識別子)、アトリビュート(属性)を持っています。

エンティティのタイプはオブジェクトの種類を指します。たとえば車両情報を扱う場合、タイプは「車」とします。また車だけでなく他の乗り物の情報を管理したい場合は、エンティティのタイプを「バイク」とすることで車、バイクと車両に関する情報を分類して持つことができます。

IDはエンティティを一意に識別する識別子となります。この場合、特定の車を識別できるナンバープレートの番号などをIDにします。

そして、エンティティは次に説明する１つ以上のアトリビュートを持ちます。
　
## アトリビュート(Attribute)
アトリビュートとは物理オブジェクトが持つ情報のことで、エンティティは必ず１つ以上のアトリビュートを持ちます。車両に関する情報を扱う場合、車種や色、車重、位置情報などがアトリビュートにあたります。アトリビュートはアトリビュート名とその値、そして値が文字か数字などの型の情報から構成されます。

![](https://i.imgur.com/cyNgkhN.png)

エンティティやアトリビュートをどう定義するかが利用しやすいデータモデルかどうかに大きく影響します。データの可視化や分析など目的にあわせてどういうデータをどんな型で定義するかということを検討しデータモデルを作成することが重要です。FIWAREでは多くのユースケースをカバーするいくつかの[データモデル](https://www.fiware.org/developers/data-models/)が用意されています。FIWAREのユーザーはこの[データモデル](https://www.fiware.org/developers/data-models/)を再利用することによって、難しいデータモデル設計をせずに済みます。もし、これらのデータモデルが自分のユースケースに合わなかった場合には独自のデータモデルを定義することも可能です。

このようにデータモデルが標準化され再利用できるのは、AWSやGoogleのIoTのサービスにはない特徴の一つです。

# 次回は

今回で、IoTプラットフォームやFIWAREの概要についてわかっていただけたと思います。

[次回](https://qiita.com/okinawa-openlab/items/a1b0187c9cd92ac1cc83)は実際にFIWAREを構築して、データの登録、取得をやってみます。