FIWARE Banner NGSI v2

FIWARE Core Context Management License: MIT Support badge
Documentation

これは、FIWARE Platform のチュートリアルです。スーパーマーケット・チェーンのスト ア・ファインダのデータから始め、コンテキスト・データとして各ストアの住所と場所を FIWARE context broker に渡して、非常に単純な "Powered by FIWARE" アプリケーシ ョンを作成します。

このチュートリアルでは、全体で cUrl コマンドを使用してい ますが 、Postman documentation も利用できます。

Run in Postman


アーキテクチャ

デモアプリケーションでは 、Orion Context Broker という 1 つの FIWARE コンポーネントしか使用しません。アプリケーションが "Powered by FIWARE" と認定するには、Orion Context Broker を使用するだけで十分です。

現在、Orion Context Broker はオープンソースの MongoDB 技術を利用して、コンテキスト・データの永続性 を維持しています。したがって、アーキテクチャは 2 つの要素で構成されます :

  • NGSI-v2 を使用してリ クエストを受信する Orion Context Broker
  • バックエンドの MongoDB データベース
    • Orion Context Broker が、データ・エンティティなどのコンテキスト・データ 情報、サブスクリプション、登録などを保持するために使用します

2 つの要素間のすべての対話は HTTP リクエストによって開始されるため、エンティティ はコンテナ化され、公開されたポートから実行されます。

前提条件

Docker

物事を単純にするために、両方のコンポーネントが Docker を使用して実行されます。Docker は、さまざまコンポーネントをそれぞれの環境に 分離することを可能にするコンテナ・テクノロジです。

  • Docker を Windows にインストールするには 、こちらの手順に従ってくださ い
  • Docker を Mac にインストールするには 、こちらの手順に従ってください
  • Docker を Linux にインストールするには 、こちらの手順に従ってください

Docker Compose (オプション)

Docker Compose は、マルチコンテナ Docker アプリケーションを定義して実行する ためのツールです 。YAML file ファイルは、アプリケーションのために必要なサービスを構成するために使用します。つ まり、すべてのコンテナ・サービスは 1 つのコマンドで呼び出すことができます 。Docker Compose は、デフォルトで Docker for Windows と Docker for Mac の一部と してインストールされますが、Linux ユーザ はここに記載されている手順に従う必要 があります

次のコマンドを使用して、現在の Docker バージョンと Docker Compose バージ ョンを確認できます :

docker-compose -v
docker version

Docker バージョン 20.10 以降と Docker Compose 1.29 以上を使用していることを確認 し、必要に応じてアップグレードしてください。

コンテナの起動

オプション 1) Docker コマンドを直接使用

まず、Docker Hub から必要な Docker イメージを取得し、コンテナが接続するネットワ ークを作成します :

docker pull mongo:4.4
docker pull fiware/orion
docker network create fiware_default

MongoDB データベースを実行している Docker コンテナを 起動し、ネットワークに接続するには、次のコマンドを実行します :

docker run -d --name=mongo-db --network=fiware_default \
  --expose=27017 mongo:4.4 --bind_ip_all

Orion Context Broker は、次のコマンドを使用して起動し、ネットワークに接続できま す :

docker run -d --name fiware-orion  --network=fiware_default \
  -p 1026:1026  fiware/orion -dbhost mongo-db

: クリーンアップして再び開始したい場合は、以下のコマンドを使用して行う ことができます

docker stop fiware-orion
docker rm fiware-orion
docker stop mongo-db
docker rm mongo-db
docker network rm fiware_default

オプション 2) Docker Compose を使用

すべてのサービスは、docker compose コマンド、または、Compose V2 にある新しい docker compose コマンド (ハイフンなし -) を使用してコマンドラインから初期化 できます。次のようにコマンドを実行して、リポジトリのクローンを作成し、必要なイメージを作成 してください:

git clone https://github.com/FIWARE/tutorials.Getting-Started.git
cd tutorials.Getting-Started
git checkout NGSI-v2

export $(cat .env | grep "#" -v)
docker compose -p fiware up -d

: クリーンアップして再起動する場合は、次のコマンドを使用して再起動でき ます :

docker compose -p fiware down

最初の "Powered by FIWARE" アプリを作成

サービスの状態を確認

公開されたポートに対して HTTP リクエストを行うことで、Orion Context Broker が実 行されているかどうかを確認できます :

1 リクエスト :

curl -X GET \
  'http://localhost:1026/version'

レスポンス :

レスポンスは次のようになります :

{
    "orion": {
        "version": "3.0.0",
        "uptime": "0 d, 0 h, 17 m, 19 s",
        "git_hash": "d6f8f4c6c766a9093527027f0a4b3f906e7f04c4",
        "compile_time": "Mon Apr 12 14:48:44 UTC 2021",
        "compiled_by": "root",
        "compiled_in": "f307ca0746f5",
        "release_date": "Mon Apr 12 14:48:44 UTC 2021",
        "machine": "x86_64",
        "doc": "https://fiware-orion.rtfd.io/en/3.0.0/",
        "libversions": {
            "boost": "1_66",
            "libcurl": "libcurl/7.61.1 OpenSSL/1.1.1g zlib/1.2.11 nghttp2/1.33.0",
            "libmicrohttpd": "0.9.70",
            "openssl": "1.1",
            "rapidjson": "1.1.0",
            "mongoc": "1.17.4",
            "bson": "1.17.4"
        }
    }
}

Failed to connect to localhost port 1026: Connection refused のレスポンス を受け取った時の対応は?

Connection refused のレスポンスを受け取った場合、Orion Content Broker はこの チュートリアルで期待される場所には見つかりません。各 cUrl コマンドの URL とポ ートを修正した IP アドレスで置き換える必要があります。すべての cUrl コマンドの チュートリアルでは、localhost:1026 で orion を使用できると仮定しています。

次の対策を試してください :

  • Docker コンテナが動作していることを確認するには、以下を試してください :
docker ps

実行中の 2 つのコンテナが表示されます。orion が実行されていない場合は、必要に 応じてコンテナを再起動できます。このコマンドは、開いているポート情報も表示しま す。

  • Virtual Boxdocker-machine をインストールしてい る場合は、orion docker コンテナが別の IP アドレスから実行されている可能性 があります。次のように仮想ホスト IP を取得する必要があります :
curl -X GET \
 'http://$(docker-machine ip default):1026/version'

または、コンテナネットワーク内からすべての cUrl コマンドを実行します :

docker run --network fiware_default --rm appropriate/curl -s \
 -X GET http://orion:1026/version

コンテキスト・データの作成

FIWARE はコンテキスト情報を管理するシステムなので、2 つの新しいエンティティ (Berlin のストア) を作成することによって、コンテキスト・データをシステムに追 加することができます。どんなエンティティも idtype 属性を持たなければなら ず、追加の属性はオプションであり、記述されているシステムに依存します。それぞれの 追加属性も typevalue 属性を定義しなければなりません。

2 リクエスト :

curl -iX POST \
  'http://localhost:1026/v2/entities' \
  -H 'Content-Type: application/json' \
  -d '
{
    "id": "urn:ngsi-ld:Store:001",
    "type": "Store",
    "address": {
        "type": "PostalAddress",
        "value": {
            "streetAddress": "Bornholmer Straße 65",
            "addressRegion": "Berlin",
            "addressLocality": "Prenzlauer Berg",
            "postalCode": "10439"
        },
        "metadata": {
            "verified": {
                "value": true,
                "type": "Boolean"
            }
        }
    },
    "location": {
        "type": "geo:json",
        "value": {
             "type": "Point",
             "coordinates": [13.3986, 52.5547]
        }
    },
    "name": {
        "type": "Text",
        "value": "Bösebrücke Einkauf"
    }
}'

3 リクエスト :

後続の各エンティティには、指定された type の一意の id が必要です。

curl -iX POST \
  'http://localhost:1026/v2/entities' \
  -H 'Content-Type: application/json' \
  -d '
{
    "type": "Store",
    "id": "urn:ngsi-ld:Store:002",
    "address": {
        "type": "PostalAddress",
        "value": {
            "streetAddress": "Friedrichstraße 44",
            "addressRegion": "Berlin",
            "addressLocality": "Kreuzberg",
            "postalCode": "10969"
        },
        "metadata": {
            "verified": {
                "value": true,
                "type": "Boolean"
            }
        }
    },
    "location": {
        "type": "geo:json",
        "value": {
             "type": "Point",
             "coordinates": [13.3903, 52.5075]
        }
    },
    "name": {
        "type": "Text",
        "value": "Checkpoint Markt"
    }
}'

データモデルのガイドライン

コンテキスト内の各データ・エンティティは、ユースケースによって異なりますが、各デ ータ・エンティティ内の共通構造は、再利用を促進するために標準化された順序にする必 要があります。完全な FIWARE データモデルのガイドラインは 、ここに あります。このチュートリアルでは、次の推奨事項の使用方法を示します :

すべての用語はアメリカ英語で定義されています

コンテキスト・データの value フィールドは任意の言語であってもよく、すべての属 性およびタイプは英語を使用して書かれています。

エンティティ・タイプの名前は大文字で始まる必要があります

この場合、1 つエンティティ・タイプしか持っていません - Store

エンティティ ID は、NGSI-LD のガイドラインに従った URN でなければなりません

NGSI-LD は最近、完全な ESTI 仕様 として公開されました。提案では、各 id は URN であり、標準フォーマット urn:ngsi-ld:<entity-type>:<entity-id> に従います。これは、システム内のすべての id がユニークであることを意味します。

データ・タイプ名は、可能であれば schema.org データ・タイプを再利用する必要があります

Schema.org は、共通の構造化データ・スキーマを作成するイニ シアチブです。再利用を促進するために、Store エンティティ内 で TextPostalAddress タイプ名を意図的に使用してい ます。Open311 (市政問題追跡用) や Datex II (輸送システム用) などの既存の標準も使用できま すが、既存のデータモデルに同じ属性が存在するかどうかを確認して再利用することが重 要です。

属性名にはキャメルケースの構文を使用します

streetAddressaddressRegionaddressLocality および postalCode 属性のす べての例は、キャメルケースを使用しています。

位置情報は address および location 属性を使用して定義する必要があります

  • schema.org のように、市政の位置に address 属性を使用 しています
  • 地理座標には location 属性を使用しています

GeoJSON を使用して地理空間プロパティをコード化

GeoJSON は、単純な地理的特徴を表現するためのオープンな標準 フォーマットです。location 属性が GeoJSON Point location としてエンコードさ れています。

属性メタデータ

メタデータは、データに関するデータ ("data about data") であり、精度, プロバイダ, タイムスタンプなどの属性値自体の プロパティを記述するために使用される追加データです。いくつかの組み込みメタデータ属性がすでに存在し、これらの名前は 予約されています。

  • dateCreated (type: DateTime): 属性作成日 (ISO8601 文字列)
  • dateModified (type: DateTime): 属性変更日 (ISO8601 文字列)
  • previousValue (type: any): 以前の値。通知時のみ
  • actionType (type: Text): アクションタイプ。通知時のみ

メタデータの1つの要素は、address 属性内にあります。verified フラグは、アドレスが確認されたかどうかを示します。

コンテキスト・データのクエリ

コンシューマ向けアプリケーションは、Orion Context Broker への HTTP リクエストを 作成することにより、コンテキスト・データをリクエストできるようになりました。既存 の NGSI インタフェースにより、複雑なクエリを作成し、結果をフィルタリングすること ができます。

現時点では、ストア・ファインダのデモでは、すべてのコンテキスト・データが HTTP リ クエストを介して直接追加されていますが、より複雑なスマートなソリューションでは 、Orion Context Broker は各エンティティに関連付けられたセンサーからコンテキスト を直接取得します。

いくつかの例を示します。それぞれの場合、options=keyValues クエリ・パラメータは 、各属性からタイプ要素を取り除いてレスポンスを短縮するために使用されています。

id でエンティティ・データを取得

この例では、 urn:ngsi-ld:Store:001 のデータを返します

4 リクエスト :

curl -G -X GET \
   'http://localhost:1026/v2/entities/urn:ngsi-ld:Store:001' \
   -d 'options=keyValues'

レスポンス :

options=keyValues を使用しているため、レスポンスは属性 type 要素と metadata 要素を含まない JSON のみで 構成されます。

{
    "id": "urn:ngsi-ld:Store:001",
    "type": "Store",
    "address": {
        "streetAddress": "Bornholmer Straße 65",
        "addressRegion": "Berlin",
        "addressLocality": "Prenzlauer Berg",
        "postalCode": "10439"
    },
    "location": {
        "type": "Point",
        "coordinates": [13.3986, 52.5547]
    },
    "name": "Bösebrücke Einkauf"
}

タイプ別にエンティティ・データを取得

この例では、コンテキスト・データ内のすべての Store エンティティのデータを返します。type パラメータは、レスポンスを Store エンティティのみに制限します。

5 リクエスト :

curl -G -X GET \
    'http://localhost:1026/v2/entities' \
    -d 'type=Store' \
    -d 'options=keyValues'

レスポンス :

options=keyValues を使用しているため、レスポンスは属性 type 要素と metadata 要素を含まない JSON のみで 構成されます。

[
    {
        "id": "urn:ngsi-ld:Store:001",
        "type": "Store",
        "address": {
            "streetAddress": "Bornholmer Straße 65",
            "addressRegion": "Berlin",
            "addressLocality": "Prenzlauer Berg",
            "postalCode": "10439"
        },
        "location": {
            "type": "Point",
            "coordinates": [13.3986, 52.5547]
        },
        "name": "Bose Brucke Einkauf"
    },
    {
        "id": "urn:ngsi-ld:Store:002",
        "type": "Store",
        "address": {
            "streetAddress": "Friedrichstraße 44",
            "addressRegion": "Berlin",
            "addressLocality": "Kreuzberg",
            "postalCode": "10969"
        },
        "location": {
            "type": "Point",
            "coordinates": [13.3903, 52.5075]
        },
        "name": "Checkpoint Markt"
    }
]

属性の値を比較してコンテキスト・データをフィルタリング

この例では、name 属性 CheckpointMarkt を持つすべてのストアを返します。フィルタリングは q パラメータを使用して 実行できます。文字列にスペースが含まれている場合は、URL エンコードして、一重引用符 ' = %27 で囲むことができます。

6 リクエスト:

curl -G -X GET \
    'http://localhost:1026/v2/entities' \
    -d 'type=Store' \
    -d 'q=name==%27Checkpoint%20Markt%27' \
    -d 'options=keyValues'

レスポンス:

options=keyValues を使用しているため、レスポンスは属性 type 要素と metadata 要素を含まない JSON のみで 構成されます。

[
    {
        "id": "urn:ngsi-ld:Store:002",
        "type": "Store",
        "address": {
            "streetAddress": "Friedrichstraße 44",
            "addressRegion": "Berlin",
            "addressLocality": "Kreuzberg",
            "postalCode": "10969"
        },
        "location": {
            "type": "Point",
            "coordinates": [13.3903, 52.5075]
        },
        "name": "Checkpoint Markt"
    }
]

サブ属性の値を比較してコンテキスト・データをフィルタリング

この例では、Kreuzberg 地区にあるすべてのストアを返します

フィルタリングは q パラメータを使用して実行できます-サブ属性はドット構文を使用して注釈が付けられます。例えば address.addressLocality

7 リクエスト :

curl -G -X GET \
    'http://localhost:1026/v2/entities' \
    -d 'type=Store' \
    -d 'q=address.addressLocality==Kreuzberg' \
    -d 'options=keyValues'

レスポンス :

options=keyValues を使用しているため、レスポンスは属性 type 要素と metadata 要素を含まない JSON のみで 構成されます。

[
    {
        "id": "urn:ngsi-ld:Store:002",
        "type": "Store",
        "address": {
            "streetAddress": "Friedrichstraße 44",
            "addressRegion": "Berlin",
            "addressLocality": "Kreuzberg",
            "postalCode": "10969"
        },
        "location": {
            "type": "Point",
            "coordinates": [13.3903, 52.5075]
        },
        "name": "Checkpoint Markt"
    }
]

メタデータをクエリしてコンテキスト・データをフィルタリング

この例では、確認済みのアドレス (verified address) を持つすべての Store エンティティのデータを返します。

メタデータのクエリは、mq パラメータを使用して行うことができます。

8 リクエスト :

curl -G -X GET \
    'http://localhost:1026/v2/entities' \
    -d 'type=Store' \
    -d 'mq=address.verified==true' \
    -d 'options=keyValues'

レスポンス :

options=keyValues を使用しているため、レスポンスは属性 type 要素と metadata 要素を含まない JSON のみで 構成されます。

[
    {
        "id": "urn:ngsi-ld:Store:001",
        "type": "Store",
        "address": {
            "streetAddress": "Bornholmer Straße 65",
            "addressRegion": "Berlin",
            "addressLocality": "Prenzlauer Berg",
            "postalCode": "10439"
        },
        "location": {
            "type": "Point",
            "coordinates": [13.3986, 52.5547]
        },
        "name": "Bösebrücke Einkauf"
    },
    {
        "id": "urn:ngsi-ld:Store:002",
        "type": "Store",
        "address": {
            "streetAddress": "Friedrichstraße 44",
            "addressRegion": "Berlin",
            "addressLocality": "Kreuzberg",
            "postalCode": "10969"
        },
        "location": {
            "type": "Point",
            "coordinates": [13.3903, 52.5075]
        },
        "name": "Checkpoint Markt"
    }
]

geo:json 属性の値を比較してコンテキスト・データをフィルタリング

この例 では、ベルリンのブランデンブルク門から 1.5km 以内のすべてのストアを返 却します (52.5162N 13.3777W)

:nine リクエスト :

curl -G -X GET \
  'http://localhost:1026/v2/entities' \
  -d 'type=Store' \
  -d 'georel=near;maxDistance:1500' \
  -d 'geometry=point' \
  -d 'coords=52.5162,13.3777' \
  -d 'options=keyValues'

レスポンス :

options=keyValues を使用しているため、レスポンスは属性 type 要素と metadata 要素を含まない JSON のみで 構成されます。

[
    {
        "id": "urn:ngsi-ld:Store:002",
        "type": "Store",
        "address": {
            "streetAddress": "Friedrichstraße 44",
            "addressRegion": "Berlin",
            "addressLocality": "Kreuzberg",
            "postalCode": "10969"
        },
        "location": {
            "type": "Point",
            "coordinates": [13.3903, 52.5075]
        },
        "name": "Checkpoint Markt"
    }
]

このシリーズの他のチュートリアルを読むことで見つけることができます :

  101. Getting Started
  102. Entity Relationships
  103. CRUD Operations
  104. Context Providers
  105. Altering the Context Programmatically
  106. Subscribing to Changes in Context

  201. Introduction to IoT Sensors
  202. Provisioning an IoT Agent
  203. IoT over MQTT
  204. Using an alternative IoT Agent
  205. Creating a Custom IoT Agent
  250. Introduction to Fast-RTPS and Micro-RTPS

  301. Persisting Context Data using Apache Flume (MongoDB, MySQL, PostgreSQL)
  302. Persisting Context Data using Apache NIFI (MongoDB, MySQL, PostgreSQL)
  303. Querying Time Series Data (MongoDB)
  304. Querying Time Series Data (CrateDB)
  305. Big Data Analysis (Flink)

  401. Managing Users and Organizations
  402. Roles and Permissions
  403. Securing Application Access
  404. Securing Microservices with a PEP Proxy
  405. XACML Rules-based Permissions
  406. Administrating XACML via a PAP

  501. Creating Application Mashups
  503. Introduction to Media Streams
  507. Cloud-Edge Computing

  601. Introduction to Linked Data
  602. Linked Data Relationships and Data Models
  603. Traversing Linked Data Programmatically
  604. Linked Data Subscriptions and Registrations

全てのドキュメントはここにあります 。

反復型開発

ストア・ファインダ・デモのコンテキストは非常にシンプルです。各ストアの現在の在庫 数をコンテキスト・データとして Orion Context Broker に渡すこ とで、在庫管理システム全体を簡単に拡張することができます。

これまでのところ単純ですが、このスマート・アプリケーションをどのように反復できる かを考えてみましょう :

  • ビジュアライゼーション・コンポーネントを使用して各ストアの在庫状態を監視する リアルタイム・ダッシュボードを作成することができます 。[Wirecloud]
  • 倉庫とストアの現在のレイアウトを Context Broker に渡すことができるので、在庫 の場所を地図上に表示することができます 。[Wirecloud]
  • ストア管理者のみがアイテムの価格を変更できるように、ユーザ管理コンポーネント [Wilma, AuthZForce, Keyrock] を追加することができます
  • 棚が空でないことを保証して商品が販売するので、倉庫内で閾値警報を発生させるこ とができます。[publish/subscribe function of Orion Context Broker]
  • 倉庫から積み込まれるアイテムの生成された各リストは、補充の効率を最大にするた めに計算することができます 。[Complex Event Processing - CEP]
  • 入り口にモーション・センサーを追加して顧客数をカウントすることもできます 。[IDAS]
  • 顧客がと入店するたびに、モーション・センサーがベルを鳴らすことができます 。[IDAS]
  • 各ストアにビデオ・フィードを導入するための一連のビデオカメラを追加することが できます 。[Kurento]
  • ビデオ画像を顧客が店内に立っている場所を認識するために処理することができます 。[Kurento]
  • システム内の履歴データを維持し、処理することによって、顧客の足跡と滞留時間を 計算することができます。ストアのどの領域が最も関心を集めているかを確認するこ とができます。[connection through Cygnus to Apache Flink]
  • 異常な行動を認識したパターンは、盗難を避けるために警告を発するのに使用するこ とができます 。[Kurento]
  • 群衆の移動に関するデータは、科学的研究に有用です。ストアの状態に関するデータ は、外部に公開することができます 。[extensions to CKAN]

各反復は、標準インタフェースを備えた既存のコンポーネントを介してソリューションに付加価値を与え、開発時間を最小限に抑えます。

License

MIT © 2018-2022 FIWARE Foundation e.V.