通知の仕組み¶
プラットフォームは、Context Broker によって実装されたサブスクリプション・メカニズムに基づいて通知を送信できます 。それを段階的に説明しましょう。
このドキュメントでは、smartown
と呼ばれるサービスと /roads
と呼ばれるサブサービスが作成されたと仮定します。プラットフォームへのすべての要求には、ここで説明するように、適切な Fiware-service
と Fiware-servicepath
ヘッダーが含まれます。
IoT Agent でのデバイスプロビジョニング¶
ある都市(マドリッドなど) の周りを移動している複数の車両を考えてみましょう。各車にはセンサが内蔵されており、センサとプラットフォーム間のネットワーク接続を想定してプラットフォーム IoT Agents によって管理されています。まず、センサプロバイダは、そのデバイスの構成グループをプロビジョニングする必要があります。これは、次のクエリで実現できます :
POST /iot/services
Content-Type: application/json
Fiware-service: smartown
Fiware-servicepath: /roads
{
"services": [
{
"protocol": [
"IoTA-UL"
],
"apikey": "801230BJKL23Y9090DSFL123HJK09H324HV8732",
"entity_type": "Car",
"attributes": [
{
"object_id": "s",
"name": "speed",
"type": "Number"
}
]
}
]
}
サブサービスが Car エンティティを使用するように構成されると、自動車は IoT Agents に情報を送信し始めることができます。この場合、選択された IoT Agent は Ultralight 2.0 エージェントです。次のリクエストは、速度を Context Broker に送信する方法を示しています :
POST /iot/d?k=801230BJKL23Y9090DSFL123HJK09H324HV8732&i=BCZ6754
Content-Type: text/plain
s|55
この要求は、55の速度値を IoT Agent に送り、Context Broker 内の Car
タイプの BCZ6754
エンティティの speed
属性を更新します。
IoT Agents と Ultralight 2.0 の仕組みの詳細については、Device API を参照してください。
Context Broker でのサブスクリプションと通知¶
車速情報が Context Broker に定期的に送信されたので、通知を設定する方法を見てみましょう。最も単純な通知トリガは、エンティティ属性の変更に基づいています。たとえば、Car型を持つ任意のエンティティで
speed属性が変更されるたびに通知を取得するには、次のサブスクリプションを使用します。通知は(サンプル)エンドポイント
http://example.com/receiver` に送信されます。
POST /v2/subscriptions
Content-Type: application/json
Fiware-service: smartown
Fiware-servicepath: /roads
{
"subject": {
"entities": [
{
"idPattern": ".*",
"type": "Car"
}
],
"condition": {
"attrs": [ "speed" ]
}
},
"notification": {
"http": {
"url": "http://example.com/receiver"
}
}
}
サブスクリプションは、エンティティのように、Context Brokerが管理するファーストクラスのオブジェクトです。したがって、作成後に変更したり、管理したり(たとえば一時停止/再開など)、最終的に削除することができます。
デフォルトでは、通知にはエンティティ内のすべての属性、つまり speed
属性だけでなく、Car
型が持つ可能性のある他の属性が含まれます。属性のサブセットのみを受信する場合は、属性を notification
フィールドの一部として構成できます :
...
"notification": {
"http": {
"url": "http://example.com/receiver"
},
"attrs": [ "speed" ]
}
...
さらに、サブスクリプションに関連付けられたフィルタを含めることができます。たとえば、speed
が変わるたびに通知を受けるだけでなく、スピードが50km/hを超えることを要求し、マドリッド市内中心部(特に市内中心部から15km近く)に車が位置することを要求するためには :
...
"conditions": {
"attrs": [ "speed" ],
"expression": {
"q": "speed>50",
"georel": "near;maxDistance:15000",
"geometry": "point",
"coords": "40.418889,-3.691944"
}
}
...
デフォルトでは、http://example.com/receiver
によって受信した通知は、次の方法で"固定"形式を使用しました :
POST http://example.com/receiver
Content-Type: application/json
Fiware-service: smartown
Fiware-servicepath: /roads
{
"subscriptionId": "...",
"data": [
{
"id": "BCZ6754",
"type": "Car",
"speed": {
"value": 57,
"type": "Number",
"metadata": {}
}
}
]
}
attrsFormat
フィールドを使用すると、よりコンパクトな形式(型やメタデータなしで属性の値だけを含む)を選択したり、すべての通知パラメータを完全にカスタマイズすることができます。カスタマイズは、httpCustom
(ではなくhttp)フィールドを使用して行われ、マクロ置換をサポートします。
たとえば、次のようにテキスト・アラームを送信できます :
...
"notification": {
"httpCustom": {
"url": "http://example.com/receiver",
"headers": {
"Content-Type": "text/plain"
},
"qs": {
"format": "text"
},
"payload": "Car ${id} speed is ${speed} km/h. Be careful you could be fined!"
},
"attrs": [ "speed" ]
}
...
このような通知が表示されます :
POST http://example.com/receiver?format=text
Content-Type: text/plain
Car BCZ6754 speed is 57 km/h. Be careful you could be fined!
これは、サブスクリプション/通知機能全体の簡単な紹介です。Context BrokerのドキュメントとNGSIv2仕様の"サブスクリプション"のセクションで、 詳細と例を見つけることができます。
TimeInstant
メタデータ¶
Context Broker のデフォルト動作では、IoT Platform version v4.1のように、属性が実際に変更された場合にのみ通知を送信します。したがって、Car speed
が 67 で Context Broker が値 67 の更新を受け取った場合、通知は送信されません。
実際の値の変更に関係なく、各更新プログラムに通知する必要があるユースケースの場合、IoT Agentは、更新のタイムスタンプとともに TimeInstant
メタデータを追加することに基づいて巧妙なメカニズムを実装します。このようにして、論理的な観点からは、メタデータの変更は属性の変更とみなされるため、属性は常に変更されます。IoT Agentのドキュメント で TimeInstant
要素のドキュメントを確認してください。
クライアントが提供するエンティティ (すなわち、IoT Agentによって管理されていないエンティティですが、アプリケーションによって管理される、以下に示すDGM2765エンティティです) の場合、同様のメカニズムが必要な場合があります。この場合、TimeInstant
メタデータの解像度が十分に高いことを確認してください。たとえば、システムが1秒間に数回通知できる場合は、タイムスタンプの解像度は1秒以上にする必要があります。
PUT /v2/entities/DGM2765/attrs/speed
Content-Type: application/json
Fiware-service: smartown
Fiware-servicepath: /roads
{
"value": 57,
"type": "Number",
"metadata": {
"TimeInstant": {
"value": "2017-06-17T07:21:24.238Z",
"type": "DateTime"
}
}
}