🦙

Fiware チュートリアルをやってみる(コア・コンテキスト管理 : 基本)

2021/08/16に公開

都市OS Fiware を勉強しようと思っています。

はじめに

https://zenn.dev/jqinglong/articles/f65e20cc2c4242

上記でざっくり理解したところとしては、都市OSは、情報の
生成
収集
公開
消費
といった手段を提供することで、スマートなソリューションを作りやすくする。
Fiwareでは、Context Broker GE(オープンソース・リファレンス実装:Orion)が、その中心部分を担当する。
さらに、共通データフォーマットを整備することで、ソリューション間連携を容易にする。

が、合っているかどうか分かりません。現時点での私の理解です。
この理解を確認し、深めるために、チュートリアルをやってみようと思います。

各サイトの関係性

ここがワンストップサイトとなっているので、ここから入っていくのが基本?
https://www.letsfiware.jp/fiware-tutorials/

実際のドキュメントはこちらにリンクされている
https://fiware-tutorials.letsfiware.jp/

Githubで管理されている
https://github.com/FIWARE/tutorials.Getting-Started/blob/master/README.ja.md

しかし結構たくさんあります・・・

コア・コンテキスト管理 : 基本
101. Getting Started
102. Entity Relationships
103. CRUD Operations
104. Context Providers
105. Altering the Context Programmatically
106. Subscribing to Changes in Context

Internet of Things, ロボット, サードパーティ・システム
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)

セキュリティ:ID管理
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

コア・コンテキスト管理:NGSI-LD
601. Introduction to Linked Data
602. Linked Data Relationships and Data Models
603. Traversing Linked Data Programmatically
604. Linked Data Subscriptions and Registrations

順にやっていきます。

101. Getting Started

https://github.com/FIWARE/tutorials.Getting-Started/blob/master/README.ja.md

まずは、Orion を立ち上げて、データの登録、参照を行います。

驚くほど書いてある通りにやって動きました。

こんな感じで、「1.5km 以内」という検索ができるなど、面白いですね。

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'

環境の公開

せっかくなので、公開できるようにしておきます。

  • fiware/orion
  • mongo

の Docker イメージをどこで動かすか。

コンテナレジストリとか考えるとお高くなってくるイメージがあります。
とりあえず公開するだけなら、Google Cloud のAlways Free で使える、Compute Engine でも動かせました。

102. Entity Relationships

ここでは、リレーションシップを作って、それに基づく情報取得を行います。

docker-compose.yml は101と同じなので、環境は継続利用します。

一度に複数のエンティティを作成 のリクエストを実行すると、

HTTP/1.1 100 Continue

HTTP/1.1 204 No Content
Connection: Keep-Alive
Fiware-Correlator: c522dbd4-fd9f-11eb-a898-0242ac120103
Date: Sun, 15 Aug 2021 08:07:01 GMT

エラーメッセージかと思ったが、登録はされています。

options=values&attrs=refStore
で、refStore 情報を取得するなどは、SQLを覚えるような学習が必要という感じでしょうか。

103. CRUD Operations

環境は102から引き続き。

基本CRUDのおさらいに良いチュートリアルですね。

作成 (Create) オペレーション
オペレーションが成功した場合、レスポンスは、204 - No Context になるか、オペ レーションが失敗した場合、422 - Unprocessable Entity

削除 (DELETE) オペレーション
オペレーションが成功すれば、204 - No Content となり、失敗すれ ば、404 - Not Found

違うんだ・・・

この時点での感想。要は、MongoDB の CRUDインターフェース?

104. Context Providers

ここで、docker-compose.yml に、下記が追加になる。

docker-compose.yml

  # Tutorial acts as a series of dummy IoT Sensors over HTTP
  tutorial:
    image: fiware/tutorials.context-provider
    hostname: tutorial
    container_name: fiware-tutorial
    depends_on:
      - orion
    networks:
      default:
        aliases:
          - iot-sensors
          - context-provider
    expose:
      - "${TUTORIAL_APP_PORT}" # localhost:3000
      - "${TUTORIAL_DUMMY_DEVICE_PORT}" # localhost:3001
    ports:
      - "${TUTORIAL_APP_PORT}:${TUTORIAL_APP_PORT}" # localhost:3000
      - "${TUTORIAL_DUMMY_DEVICE_PORT}:${TUTORIAL_DUMMY_DEVICE_PORT}" # localhost:3001
    environment:
      - "MONGO_URL=mongodb://mongo-db:27017"
      - "DEBUG=tutorial:*"
      - "WEB_APP_PORT=${TUTORIAL_APP_PORT}" # Port used by the content provider proxy and web-app for viewing data
      - "IOTA_HTTP_HOST=iot-agent"
      - "IOTA_HTTP_PORT=${IOTA_SOUTH_PORT}"
      - "DUMMY_DEVICES_PORT=${TUTORIAL_DUMMY_DEVICE_PORT}" # Port used by the dummy IOT devices to receive commands
      - "DUMMY_DEVICES_TRANSPORT=HTTP" # Default transport used by dummy Io devices
      - "DUMMY_DEVICES_API_KEY=4jggokgpepnvsb2uv4s40d59ov"
      - "CONTEXT_BROKER=http://orion:${ORION_PORT}/v2" # URL of the context broker to update context
      - "OPENWEATHERMAP_KEY_ID=<ADD_YOUR_KEY_ID>"
      - "TWITTER_CONSUMER_KEY=<ADD_YOUR_CONSUMER_KEY>"
      - "TWITTER_CONSUMER_SECRET=<ADD_YOUR_CONSUMER_SECRET>"

既存の環境を一旦終了し、新環境を取得して起動

docker-compose -p fiware down
git clone https://github.com/FIWARE/tutorials.Context-Providers.git
./services create; ./services start;

前のデータも残っている。
ではなくて、./services start の中で、データをインポートしてくれている。

Twitter API コンテキスト・プロバイダ

何も設定しないと、下記は403エラーとなっている。

curl -X GET \
  'http://localhost:3000/health/twitter'

docker-compose.yml の環境変数を設定

https://developer.twitter.com/ から Twitter でアプリを作成する必要があり ます。

>Developer Portal
既存のアプリのキーを使って良いのかな・・・

      - "TWITTER_CONSUMER_KEY=<ADD_YOUR_CONSUMER_KEY>"
      - "TWITTER_CONSUMER_SECRET=<ADD_YOUR_CONSUMER_SECRET>"

を設定して再起動したら、取得できました。

Weather API コンテキスト・プロバイダ

Open Weather Map API にアクセスするには、https://openweathermap.org/api でキーを申請する必要があります

これも以前サインアップしていた。キーを設定して再起動。

コンテキスト・プロバイダの登録アクション

ここがポイントですね。データを登録するのではなく、プロバイダを登録することで、プロバイダ経由で情報を返せるようにする。

105. Altering the Context Programmatically

こんなタイトルですが、要は、アプリからの呼び出し方、という感じですね。

swagger-codegen なるツールがある。へえ。けど、使うことはあまりないかな。JavaとかPHPとかで、ハマるなら良いかな。

https://github.com/swagger-api/swagger-codegen

docker-compose.yml は104から変更なし。

「在庫管理の例」のソースへのリンクが違ってますね。

これを見るとよいですね。

https://github.com/FIWARE/tutorials.NGSI-v2/tree/master/context-provider

ついに画面が見えて、安心する。

http://localhost:3000/app/store/urn:ngsi-ld:Store:001

これのソースが、これか。
https://github.com/FIWARE/tutorials.NGSI-v2/blob/master/context-provider/views/store.pug

説明しているコードは 、Git リポジトリ の store コントローラ内にあります。
と言っているのはちょっと差異があるけど、これか

https://github.com/FIWARE/tutorials.NGSI-v2/blob/master/context-provider/controllers/ngsi-v2/store.js

106. Subscribing to Changes in Context

/v2/subscriptions/ エンドポイントに POST リクエストを行うことで、新しいサブスクリプションを追加

expression で条件を指定するようなことができ、これにより在庫不足のような通知ができると。
すごいね。

"expression": {"q": "shelfCount<10;refStore==urn:ngsi-ld:Store:001"}

以上で、

  1. コア・コンテキスト管理 : 基本
    を終わります。

  2. Internet of Things, ロボット, サードパーティ・システム
    も続けたいと思います。

Discussion