Fiwareを使って都市OSを動かしてみよう

Munu


データ仕様の現状と課題
スマートシティの標準規格(案)
データモデルのユースケース
ツール


Column
Link
用語集

Coppell

Technologies

7. ブローカーとしてのFiware




7.1 ブローカーの機能概観
2022年4月13日
 この章では、fiware/orionと言うcontext Brokerの機能を概観します。これまでの章で、EntityをPUTで格納したり、GETで読み出すなどの操作をしました。しかし、これでは普通のファイルへの読み書きと変わりありません (というよりも、普通のファイルよりもとてもめんどくさい) 。IoT基盤というからには、もっと特別な機能があるはずです。実はそれが、Subscriptionであり、Registrationです。
 Subscriptionは「センサからデータが上がってきたらデータを下さい」とクライアントをBrokerに予め登録しておくことで、センサデータが登録される度にデータを入手できます。また、registrationは逆に、あるEntityのAttributeにセンサを登録しておくことで、そのEntityを読み出す度に値をセンサまで取りに行ってくれます。



ここで、"センサを登録する"などと曖昧な表現をしましたが、実際はセンサ自身の時もありますし、センサにつながったプログラムや制御装置の場合もあります。そこで、データを供給する側をひっくるめてContext Provider(注)と呼びます。データを入手する側をContext Consumerと呼びます。


注: Entity ProviderやEntity Consumerと読んだ方がしっくり来るような気がしますが、Filwareの説明ではContext ProviderやContext Consumerと記述しています。NGSI-LDになると、ContextとEntityは明確に違う概念になるため、本書ではNGSI-LDに合わせてデータの単位をEntityと記述しています。


7.2 ユースケース
2022年4月13日
7.2.1.Entityの構造
2022年4月13日
この章からは、以下のデータをユースケースとして考えることにします。
建物のEntityとして"Building"を定義し、建物を構成する複数のフロアを"Floor"で定義し、各Floorを構成する部屋を"Room"として定義します。Roomは室温をtemperatureという項目をattributeとして持ちます。このように、Roomにはセンサからデータを持ってくる必要があるattributeとidの様に変化しないattributeの両方が含まれていることになります。Floorは、リアル世界ではBuildingの一部なので、Floorのidを持ち、同様にRoomはFloorのidを持つことにします。尚、BuildingはSmart Data Modelsに定義されているEntityであり、FloorとRoomは自分で定義したEntityです。



7.2.2.Entityのjsonデータの準備
2022年4月13日
 具体的なユースケースとして、フロアマップが公開されている東村山市の中央公民館をお借りしました。部屋数が多すぎるので、各フロア5部屋に減らしています。建物の部屋割りや部屋のidと名前は下図の様になっています。



ビル、フロア、部屋の各Entityをバッチ格納するように、jsonを以下の様に用意します。一階と二階には、Attributeとしてtemperatureを定義していますが、三階と四階には定義していません。

{
   "actionType": "APPEND",
   "entities": [
       {
           "id": "urn:ngsi-ld:Building:001",
           "type": "Building",
           "address": {
               "type": "PostalAddress",
               "value": {
                   "streetAddress": "本町2-33-2",
                   "addressLocality": "東村山市",
                   "addressRegion": "東京都",
                   "postalCode": "1890014"
               }
           },
           "category": "public",
           "location": {
               "type": "geo:json",
               "value": {
                   "type": "Point",
                   "coordinates": [
                       139.4670599792068,
                       35.75976417598571
                   ]
               }
           },
           "name": {
               "type": "Text",
               "value": "東村山市中央公民館"
           },
           "floorAboveGround": 4,
           "floorUnderGround": 0
       },
       {
           "id": "urn:ngsi-ld:Floor:001-001",
           "type": "Floor",
           "floorNumber": {
               "type": "Number",
               "value": 1
           },
           "refBuilding": {
               "type": "Text",
               "value": "urn:ngsi-ld:Building:001"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-001-001",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "展示室"
           },
           "temperature": {
               "type": "Integer",
               "value": 0
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-001"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-001-002",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "警備員室"
           },
           "temperature": {
               "type": "Integer",
               "value": {}
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-001"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-001-003",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "印刷室"
           },
           "temperature": {
               "type": "Integer",
               "value": 0
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-001"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-001-004",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "事務室"
           },
           "temperature": {
               "type": "Integer",
               "value": 0
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-001"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-001-005",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "EVホール"
           },
           "temperature": {
               "type": "Integer",
               "value": 0
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-001"
           }
       },
       {
           "id": "urn:ngsi-ld:Floor:001-002",
           "type": "Floor",
           "floorNumber": {
               "type": "Number",
               "value": 2
           },
           "refBuilding": {
               "type": "Text",
               "value": "urn:ngsi-ld:Building:001"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-002-001",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "第1集会室"
           },
           "temperature": {
               "type": "Integer",
               "value": 0
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-002"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-002-002",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "第2集会室"
           },
           "temperature": {
               "type": "Integer",
               "value": 0
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-002"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-002-003",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "第3集会室"
           },
           "temperature": {
               "type": "Integer",
               "value": 0
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-002"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-002-004",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "第4集会室"
           },
           "temperature": {
               "type": "Integer",
               "value": 0
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-002"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-002-005",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "談話ロビー"
           },
           "temperature": {
               "type": "Integer",
               "value": 0
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-002"
           }
       },
       {
           "id": "urn:ngsi-ld:Floor:001-003",
           "type": "Floor",
           "floorNumber": {
               "type": "Number",
               "value": 3
           },
           "refBuilding": {
               "type": "Text",
               "value": "urn:ngsi-ld:Building:001"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-003-001",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "ホール"
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-003"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-003-002",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "ステージ"
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-003"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-003-003",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "リハーサル室"
           },
           "temperature": {
               "type": "Integer",
               "value": 0
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-003"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-003-004",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "視聴覚室"
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-003"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-003-005",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "ホワイエ"
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-003"
           }
       },
       {
           "id": "urn:ngsi-ld:Floor:001-004",
           "type": "Floor",
           "floorNumber": {
               "type": "Number",
               "value": 4
           },
           "refBuilding": {
               "type": "Text",
               "value": "urn:ngsi-ld:Building:001"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-004-001",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "レクリエーションルーム"
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-004"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-004-002",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "ロビー"
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-004"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-004-003",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "第2音楽室"
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-004"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-004-004",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "EVホール"
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-004"
           }
       },
       {
           "id": "urn:ngsi-ld:Room:001-004-005",
           "type": "Room",
           "name": {
               "type": "Text",
               "value": "倉庫"
           },
           "refFloor": {
               "type": "Text",
               "value": "urn:ngsi-ld:Floor:001-004"
           }
       }
   ]
}


7.2.3.Entityの格納
 既に記載した、Entityのjson形式をファイルに格納し、PUTします。ファイル名は"postBuilding001.json"とし、いつも通りDドライブ直下に格納しました。コマンドは以下の通りです。

curl -X POST -H 'Content-Type: application/json' -d @d:\postBuilding001.json 'http://localhost:1026/v2/op/update?options=keyValues'
尚、ヘッダの表示の指定(-iXの"i")をしていませんので、レスポンスは表示されません。
PS C:\Users\owner> curl -X POST -H 'Content-Type: application/json' -d @d:\postBuilding001.json 'http://localhost:1026/v2/op/update?options=keyValues'
PS C:\Users\owner>