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

Munu


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


Column
Link
用語集

Coppell

Technologies

 7. ブローカーとしてのfiware/orion 7.4節




7.4 subscriptionの動作確認
2022年4月13日

7.4.1 Subscriptionの設定
2022年4月13日
 それでは、温度が変化したら、通知が前節で用意したコンシューマ(Webサーバ)に通知されるように設定しましょう。
以下のjsonファイルを用意します。筆者はpostSubscription.jsonというファイルで作りました。

{
  "description": "Notify temperature changes of Building001",
  "subject": {
      "entities": [
          {
              "idPattern": "urn:ngsi-ld:Room:001.*",
              "type": "Room"
          }
      ],
      "condition": {
          "attrs": [
              "temperature"
          ]
      }
  },
  "notification": {
      "http": {
          "url": "http://hostpc:3000/subscriptions/temperature-change"
      }
  }
}

 上記のjsonで、subjectはEntityと通知条件を指定する部分、notificationは、どこに通知するかをしていする部分です。この指定では、subject内のidPatternに"urn:ngsi-ld:Room:001.*"という記述があります。最後の".*"は何でもありという指定です。つまり、本書の場合は、この建物のすべての部屋(Room)のidが全て該当する指定となっています。条件は、temperatureというAttributeが更新されると、通知される指定です。通知先は、hostpcというサーバ(つまり、Windows)の3000番のボードとなります。その後ろのパスは何でも構いませんが、色々なSubscriptionが設定される事を想定し、この様なパスとしました。
 次に以下のコマンドをPowerShellで実行します。

curl -iX POST -H 'Content-Type: application/json' -d @d:\postSubscription.json 'http://localhost:1026/v2/subscriptions'

この様に、Subscriptionの設定は、subscriptionsというエンドポイントに対して実行します。
結果は以下の様になりました。
PS C:\Users\owner> curl -iX POST -H 'Content-Type: application/json' -d @d:\postSubscription.json 'http://localhost:1026/v2/subscriptions'
HTTP/1.1 201 Created
Connection: Keep-Alive
Content-Length: 0
Location: /v2/subscriptions/624a39ed88e83d3c082bb31b
Fiware-Correlator: 1be1fe00-b3ad-11ec-ad91-0242ac120003
Date: Mon, 04 Apr 2022 00:21:02 GMT

PS C:\Users\owner>

この場合は、/v2/subscriptions/624a39ed88e83d3c082bb31bという場所に格納されたことがわかりますね。
それでは、ちゃんと格納されたかどうか読み出してみましょう。

curl -X GET 'http://localhost:1026/v2/subscriptions/624a39ed88e83d3c082bb31b'
PS C:\Users\owner> curl -X GET 'http://localhost:1026/v2/subscriptions/624a39ed88e83d3c082bb31b'
{"id":"624a39ed88e83d3c082bb31b","description":"Notify temperature changes ofBuilding001","status":"active","subject":{"entities":[{"idPattern":"urn:ngsi-ld:Room:001.*","type":"Room"}],"condition":{"attrs":["temperature"]}},"notification":{"attrs":[],"onlyChangedAttrs":false,"attrsFormat":"normalized","http":{"url":"http://hostpc:3000/subscriptions/temperature-change"}}}
PS C:\Users\owner>

この様にちゃんと格納されていることがわかります。



7.4.2 Subscriptionの動作
2022年4月13日
本チュートリアルは本家Fiware.orgのチュートリアルの環境をそのまま流用していますが、何らかの理由によりDocker ContainerのFiware/OrionからWindows上のプログラムへの通信が失敗する現象が確認されています。原因は究明出来ていませんが、筆者の環境ではPCをリブートすると事により現象が収まります。尚、リブート後は、Mongo-DBとFiware/orionのContainerのstopとrmを実行したあと、再度runしなおす必要があります。
いよいよ温度を変化させてみましょう。cUrlで、以下の様に打ちます。

curl -X PUT -H 'Content-Type:text/plain' -d 10 http://localhost:1026/v2/entities/urn:ngsi-ld:Room:001-001-001/attrs/temperature/value

これは、"urn:ngsi-ld:Room:001-001-001"というidを持つ"Room"コンテキストのtemperatureの値を10に書き換えるという意味を持ちます。そうすると、Consumerに以下の様に表示されました。
部屋 : 展示室
室温 : 10
172.22.32.1 - - [07/May/2022 15:23:47] "POST /subscriptions/temperature-change HTTP/1.1" 200 -

temperatureの値を変化させたために、fiware/orionがsubscriptionの指定と照らし合わせ、条件が合致したために、指定された"hostpc"のポート3000の"/subscriptions/temperature-change"に対し、POSTに行ったことが分かります。
因みに、POSTされたメッセージは以下の通りです。

{
  "subscriptionId": "624d28bedad97c726d36631b",
  "data": [
      {
          "id": "urn:ngsi-ld:Room:001-001-001",
          "type": "Room",
          "name": {
              "type": "StructuredValue",
              "value": {
                  "type": "Text",
                  "value": "展示室"
              },
              "metadata": {}
          },
          "refFloor": {
              "type": "StructuredValue",
              "value": {
                  "type": "Text",
                  "value": "urn:ngsi-ld:Floor:001-001"
              },
              "metadata": {}
          },
          "temperature": {
              "type": "StructuredValue",
              "value": 10,
              "metadata": {}
          }
      }
  ]
}

Pythonのconsumerのプログラムで、

print('部屋 : {}'.format(json_dict['data'][0]['name']['value']['value']))

 という箇所がありましたが、これは、メッセージの中のdataの記述の中の最初(ひとつしかありませんが)の記述の中のnameの記述の中のvalueの記述の中のvalueの項目に格納されている値を取り出していたという事になります。