JSON 設定¶
設定は、CEP エンジン( EPL 文のセット)の動作の完全な記述と、NGSI コンテキスト・エンティティと CEP イベントとの間のマッピングを含む単純な JSON オブジェクトです。
次に例を示します:
{
"host":"http://localhost:8080",
"in":[
{
"id":"Room.*",
"type":"Room",
"isPattern": true,
"attributes":[
{
"name":"temperature", "type":"double",
"metadata": [
{ "name":"unit", "type":"string" }
]
},
{ "name":"floor", "type":"string" }
]
"providers":[
{
"url":"http://"http://localhost:8081",
"serviceName": "tenant",
"servicePath": "test/example",
}
]
}
],
"out":[
{
"id":"FloorX",
"type":"Floor",
"attributes":[
{
"name":"temperature", "type":"double",
"metadata": [
{ "name":"unit", "type":"string" }
]
}
],
"brokers":[
{
"url":"http://orion.fiware.org:3000",
"serviceName": "tenant",
"servicePath": "test/example",
"authToken": "OAUTH_TOKEN"
}
]
}
],
"statements":[
"INSERT INTO Floor SELECT floor as id, avg(temperature) as temperature, temperature_unit FROM Room.win:time(10 min) GROUP BY floor OUTPUT LAST EVERY 10 sec"
]
}
メイン・セクション¶
ホスト url¶
host
url は Cepheus-CEPをコンタクトさせることができる HTTP アドレス(スキーム、ホストおよびポート)で定義しました。これは、コンテキスト・プロバイダをサブスクライブするために使用されます。次のセクションを参照してください。
着信イベント¶
この in
配列は、CEP がコンテキスト・プロバイダから入力として期待する着信イベント(NGSI コンテキスト・エンティティの更新)のリストを定義します。
各コンテキスト・エンティティは、次のように定義する必要があります :
id
: コンテキスト・エンティティのID。isPattern
がtrue
ならパターンを指定できます。必須type
: コンテキスト・エンティティのタイプ。必須isPattern
:id
がパターンの場合。オプション。デフォルト :false
attributes
: 一致するコンテキスト属性のリスト。必須。空にすることはできませんproviders
: このコンテキスト・エンティティにサブスクライブするコンテキスト・プロバイダへのURLのリスト
各コンテキスト属性は、次のように定義されます :
name
: 属性の名前。必須type
: 属性のタイプ。必須。今のところ。シンプルなタイプのみサポートしています :string
,double
,float
,int
,bool
metadata
: コンテキスト・メタデータ属性のリスト。オプションjsonpath
: "複雑な"オブジェクト内の値にアクセスするための jsonpath・オプション
各コンテキスト・メタデータは、次のように定義されます :
name
: メタデータの名前。必須type
: メタデータのタイプ。必須。今のところシンプルなタイプのみサポートしています :string
,double
,float
,int
,bool
jsonpath
: "複雑な"オブジェクト内の値にアクセスするための jsonpath。オプション
各プロバイダは次のように定義されます :
url
: プロバイダへのURL。必須serviceName
:Fiware-Service
HTTP ヘッダの値。オプションservicePath
:Fiware-ServicePath
HTTP ヘッダの値。オプション
発信イベント¶
out
配列は、コンテキスト・エンティティに変換された発信イベントのリストを定義します。
各コンテキスト・エンティティは、次のように定義する必要があります :
id
: EPL ステートメントが定義していない場合は、コンテキスト・エンティティにデフォルトで使用されるID、必須type
: コンテキスト・エンティティのタイプ、必須isPattern
:id
がパターンの場合、オプション、デフォルト :false
attributes
: 一致するコンテキスト属性のリスト。必須。空にすることはできませんbrokers
: 通知するブローカのリスト
各コンテキスト属性は、次のように定義されます :
name
: 属性の名前。必須type
: 属性のタイプ。必須。今のところシンプルなタイプのみサポートしています :string
,double
,float
,int
,bool
metadata
: 属性Context Metadataのリスト。オプション
各コンテキスト・メタデータは、次のように定義されます :
name
: メタデータの名前。必須。type
: メタデータのタイプ。必須。今のところシンプルなタイプのみサポートしています :string
,double
,float
,int
,bool
各ブローカは次のように定義されます :
url
: ブローカへの URL、必須serviceName
:Fiware-Service
HTTP ヘッダの値(Orion Broker で必要)。オプションservicePath
:Fiware-ServicePath
HTTP ヘッダの値(Orion Broker で必要)。オプションauthToken
:X-Auth-Token
HTTP ヘッダの値(PEP Proxy で必要)。オプション
ステートメント¶
statements
配列は、 以前に定義されたイベントと対話する Esper EPL ステートメント のリストを定義します。
特別なフィールド¶
プロバイダ・フィールド¶
providers
フィールドは、CEP が、着信イベントを受信する方法を制御します。
コンテキスト・プロバイダが CEP に通知する方法は2つあります :
- コンテキスト・プロバイダにとって最も簡単な方法は、CEP に
/updateContext
リクエストを直接送信することです
- 2番目の方法は、CEP を ブローカ のようなコンテキスト・プロバイダに登録させることです。イベントの
providers
フィールドで定義された各コンテキスト・プロバイダについて、CEP は、最初に/subscribeContext,
を送信し、コンテキスト・プロバイダに/notifyContext
リクエストで通知することを期待します。
ブローカ・フィールド¶
各発信イベントは複数のブローカを持つことができます。CEP は、すべての発信イベントについて各ブローカに ngsi10/updateContext
リクエストを送信します。
jsonpath フィールド¶
コンテキスト属性またはコンテキスト・メタデータの jsonpath
フィールドでは、JsonPath 式を使用して深くネストされた構造体から値を抽出することができます。
これは JSON 形式と XML 形式の両方で機能します。XML 形式にはいくつかの制限があります。
たとえば、/updateContext
リクエストが次のペイロードを送信するとします :
{
"contextElements": [
{
"type": "Room",
"isPattern": "false",
"id": "Room1",
"attributes": [
{
"name": "temperature",
"type": "double",
"value": { "raw": ["16.2", "°C", "Celcus"] }
},
{
"name": "floor",
"type": "string",
"value": "1"
}
]
}
],
"updateAction": "UPDATE"
}
この 16.2
値は、JsonPath 式 $.raw[0]
を使用してJSONオブジェクト { "raw": ["16.2", "°C", "Celcus"] }
から抽出できます。
温度値を CEP に公開してこのペイロードを処理する設定例を次に示します :
{
"host":"http://localhost:8080",
"in":[
{
"id":"Room1",
"type":"Room",
"attributes":[
{ "name":"temperature", "type":"double", "jsonpath":"$.raw[0]" },
{ "name":"floor", "type":"string" }
]
}
],
"out":[
{
"id":"Floor1",
"type":"Floor",
"attributes":[
{ "name":"temperature", "type":"double" }
]
}
],
"statements":[
"INSERT INTO Floor SELECT floor as id, avg(temperature) as temperature FROM Room.win:time(10 min) GROUP BY floor OUTPUT LAST EVERY 10 sec"
]
}