You dont have javascript enabled! Please enable it!
Tech

sakura.io を利用した FIWARE デジタルツイン・システムの構築 (WebSocket)

さくらインターネットが提供する IoT プラットフォームサービス 「sakura.io」を利用して、IoT デバイスから温湿度情報を取得し、FIWARE Orion のエンティティ情報を更新する「デジタルツイン・システム」を構築する方法を紹介します。

前提条件

次の環境が必要となります。

  • Raspberry Pi
  • sakura.io モジュール (LTE)
  • sakura.io HAT for Raspberry Pi
  • 環境センサ Enviro for Raspberry Pi (Pimoroni)
  • サーバ環境
  • docker, git, curl, make コマンド等

Raspberry Pi の種類は、Raspberry Pi WH, 3, 4 等です。sakura.io モジュールと sakura.io HAT for Raspberry Pi は、秋月電子通商や Amazon.co.jp 等から購入できるようです。環境センサの Enviro は、発売元の Pimoroni から購入するか、国内では秋月電子通商、スイッチサイエンス等から購入できるようです。

ソースコード

使用するソースコードは、Github の https://github.com/lets-fiware/lets-fiware.tutorials から入手できます。git コマンドで、リポジトリをクローンして、”sakuraio” ディレクトリに移動してください。

git clone https://github.com/lets-fiware/lets-fiware.tutorials.git
cd ./sakuraio

  • IoT デバイス関連のソースコード: ./sakuraio/iot-devcie
  • サーバ関連のソースコード: ./sakuraio/ngsi-adapter-websocket

システム構成

センサ・データを FIWARE Orion に送信するため、sakura.io が提供する通信モジュール、通信環境、連携処理を利用します。システムは、通信モジュールを搭載した IoT デバイス、クラウドにある sakura.io プラットフォーム、および、FIWARE プラットフォームで構成されます。FIWARE プラットフォームには、sakura.io から Orion へのデータ送信を仲介する NGSI Adapater for sakura.io があります。

FIWARE IoT Device の作成

ハードウェア

FIWARE IoT Device には、Raspberry Pi を使用します。これに、sakura.io モジュール (LTE), sakura.io HAT for Raspberry Pi および、環境センサ Enviro for Raspberry Pi を接続します。以下の写真は これら部品のRaspberry Pi 4 への搭載例です。

ソフトウェア

Python で記述されたプログラムで、一定間隔でセンサから温湿度、気圧の値を取得し、通信モジュールを制御してデータを sakura.io プラットフォームへ送信します。環境センサおよび通信モジュールの制御には、I2C インタフェースを使用します。ソースコードは、クローンしたリポジトリの “./sakuraio/iot-devcie” にあり、ファイル名は、”sakuraio-i2c.py” です。

プログラム全体

プログラムの実行環境

OS 環境

プログラムは、Raspberry Pi OS または Ubuntu 18.04.4 LTS で実行できます。動作確認した環境は以下の通りです。また、sakura.io モジュールと環境センサの制御に I2C インタフェースを使用しますので、インタフェースを有効化してください。

Raspberry Pi OS (32bit)

Ubuntu 18.04.4 LTS  (64bit)

OS 上で実行

プログラムを OS 上でダイレクトに実行する場合、Python ライブラリをインストールします。

関連するライブラリをインストール後に、以下のコマンドでプログラムを起動できます。

sudo python3 sakuraio-i2c.py

Docker コンテナで実行

Docker コンテナ内でプログラムを実行することもできます。コンテナ・イメージの作成は、”make build” で、実行は、”make run” です。詳細は、”./sakuraio/iot-devcie” にある、Dokcerfile と Makefile を参照ください。

コマンド 説明
make build コンテナ・イメージを作成
make run コンテナを起動
make stop コンテナを提示
make rm コンテナを削除
make logs コンテナのログを表示

sakura.io 連携設定

WebSocket 連携サービスの設定

sakura.io のコントロールパネルにログインして、連携サービスの設定を行います。使用する連携サービス名は WebSocket です。任意の名前で WebSocket を作成すると、WebSocket の URL が生成されます。この値を NGSI Adapter for sakura.io (WebSocket) の環境設定で使用します。

サーバ環境の作成

FIWARE プラットフォームは、sakura.io からデータ取得に連携サービスの WebSocket 連携サービスを使用します。WebSocket とは、RFC 6455 で定義された通信プロトコルで、HTTP を使用して双方向通信を行うことができます。NGSI Adapter for sakura.io が WebSocket クライアントとなり、WebSocket サーバの sakura.io にコネクションを張ることで、センサ・データを sakura.ioから受信します。

サーバでは次の3つのコンポーネントを実行します。

  • Orion Context Broker : コンテキスト管理
  • MongoDB: Orion のバックエンド DB
  • NGSI Adapter for sakura.io: WebSocket クライアントとして動作。sakura.io からデータを受信し、Orion のエンティティを更新

Docker 環境

docker-compose ファイル

Orion, MongoDB, NGSI Adapter for sakura.io は、Docker コンテナを利用して、サーバ上にデプロイします。クローンしたリポジトリの “./sakuraio/ngsi-adapter-websocket” に、docker-compose.yml ファイルがあります。SAKURA_IO_WEBSOCKET には、sakura.io 連携設定で生成された WebSocket の URL を設定してください。

環境変数 設定値
ORION_URL http://orion:1026/
FIWARE_SERVICE openiot
FIWARE_SERVICEPATH /sakuraio
ENTITY_TYPE Device
SAKURA_IO_WEBSOCKET WebSocket サーバの URL
FIWARE_DEBUG true

Docker コンテナの起動

設定が完了したら、次のコマンドで、Docker コンテナを起動します。これで一連のコンテナが実行されます。初回起動時は、Docker Hub からコンテナ・イメージをプルするため、起動が完了するまで数分かかかります。

docker-compose up -d

コンテナ・イメージのビルド

コンテナ・イメージをビルドしたい場合、make build でビルドできます。詳細は、Makefile を参照ください。

システムの実行

サーバ環境の起動

サーバ環境で、docker-compose を使って一連のコンテナを起動します。 “./sakuraio/ngsi-adapter-websocket” ディレクトリに移動して、次のコマンドを実行します。

docker-compose up -d

次のようなメッセージが表示されます。

次に、NGSI Adapter for sakura.io のログを参照して、正常に起動したことを確認します。ログは次のコマンドで表示できます。

docker-compose logs ngsi-adapter

次のようなログを確認できるはずです。

IoT デバイスの起動

Raspberry Pi で “./sakuraio/iot-devcie” ディレクトリに移動して Python のプログラムを起動します。

OS上で実行

次のコマンドを実行すると、プログラムが起動して、コンソールにメッセージが表示されます。

sudo python3 sakuraio-i2c.py

Docker コンテナで実行

次のコマンドを実行して、コンテナを起動します。

make run

メッセージは次のコマンドで表示できます。

make logs

実行結果

次のようなメッセージが表示されます。”Connected” は、IoT デバイスが sakura.io に接続したことを示し、”Send Data” は、センサ・データを sakura.io に送信したことを示します。プログラムは60秒毎にセンサ・データを送信します。そのたびに、”Send Data” のメッセージが表示されます。

NGSI Adapter for sakura.io の動作確認

NGSI Adapter for sakura.io のログを参照すると、sakura.io からセンサ・データを受信し、Orion のエンティティ情報を更新したことを確認できます。サーバ環境で、”./sakuraio/ngsi-adapter-websocket” ディレクトリに移動し、”docker-compose logs ngsi-adapter” コマンドを実行します。次のようなメッセージを確認できるはずです。

エンティティの確認

サーバ環境で、Orion にアクセスしてエンティティ情報を確認してみます。次のコマンドで、エンティティ情報を取得できます。

curl -sS -H ‘FIWARE-Service: openiot’ -H ‘FIWARE-ServicePath: /sakuraio’ localhost:1026/v2/entities

実行結果

実行結果は次の通りです。このような情報を取得できれば、エンティティ情報を正しく更新できています。エンティティの id 属性値は、”urn:ngsi-ld:Device:xCr8vqsJ0Zbe” で、末尾の “xCr8vqsJ0Zbe” は通信モジュールの ID です。

 

NGSI Adapter for sakura.io の解説

NGSI Adapter for sakura.io は、sakura.io から送信されたデータを受信し、NGSI データモデル形式のエンティティ情報を作成して、Orion に更新リクエストを行います。

プログラムは Node.js で記述された WebSocket クライアントです。メイン処理は、server.js にあり、ソースコードは次の通りです。

データ形式の変換

sakura.io から送信されるデータは、channels 形式と呼ばれる JSON データです。これを NGSIデータモデル形式の JSON データに変換します。

sakura.io channels 形式の JSON データ

FIWARE NGSI データモデル形式の JSON データ

メタデータ TimeInstant

温湿度の属性値は、TimeInstant というメタデータを持ち、sakura.io から送信されたデータ中の時刻を保持しています。この TimeInstant は、この属性値を履歴データして保存するときに特別な意味を持ちます。

FIWARE では、コンテキスト情報 (属性値) の更新履歴を永続化する場合、Cygnus という Generic Enabler を使用します。Cygnus は、通常、永続化する属性値を受信した時刻をタイムスタンプとして保存します。しかし、NGSISTHSink や NGSIMongoSink を利用しているケースで、 属性が TimeInstant メタデータを持っている場合、受信時刻の代わりに TimeInstant の値をタイムスタンプとして使用します。

この TimeInstant を使用することで、sakura.io から受信したデータ中のセンサ値と時刻を永続化できます。

エンティティ情報の更新 /v2/op/update

NGSI v2 API は、エンティティを管理するための RESTful なオペレーションとは別に、バッチ・オペレーションを持っています。バッチ更新オペレーション (POST /v2/op/update) とバッチ・クエリ・オペレーション (POST /v2/op/query) です。バッチ更新オペレーションは、更新アクション・タイプ (Update action types) と呼ばれる、いつかの動作モードを持っています。

このプログラムでは、エンティティの管理にバッチ更新オペレーション (POST /v2/op/update) の append 更新アクション・タイプを使用しています。このアクション・タイプは、エンティティの作成、エンティティの属性の作成、およびエンティティの属性の更新を行うことができます。

エンティティが存在しない場合、POST /v2/entities と同等の処理を行い、エンティティが存在する場合、 POST /v2/entities/<id>/attrs と同等の処理を行います。

sakura.io を利用した FIWARE デジタルツイン・システムの構築 (Webhook)さくらインターネットが提供する IoT プラットフォームサービス 「sakura.io」を利用して、IoT デバイスから温湿度情報を取得...
Let’s FIWARE Tutorialsセットアップ WireCloud のセットアップ オープンデータの可視化 避難場所のオープンデータを可視化 ...