この例では、Cepheus-CEP 内の Geo:Point 特殊属性の使用方法を示します。

トラッカーがジオフェンス・ゾーンに入ったり、存在したりするとトリガーされるジオフェンシング・アラートを実証しましょう。

セットアップ

トラッカーには location 属性と time 属性を持っているとしましょう : このタイプの updateContext リクエストを送信します :

 {
     "id": "Tracker1",
     "type":"Tracker",
     "attributes": [
        { "name":"time", "type":"date", "value":"2015-10-26T22:47:09Z" },
        { "name":"location", "type":"geo:point", "value":"45.2334, 1.4233" }
     ]
 }

目標は、CEP にこのような updateContext リクエストをトリガさせることです :

 {
     "id": "Tracker1", // Id of the tracker that triggered the alert
     "type":"Alert",
     "attributes": [
        { "name":"time", "type":"date", "value":"2015-10-26T22:47:09Z" },
        { "name":"location", "type":"geo:point", "value":"45.2334, 1.4233" }
        { "name":"inside", "type":"boolean", "value":"true" }
     ]
 }

トラッカーがジオフェンスされたゾーンに出入りするたびに

CEPの設定

Cepheus-CEP の設定フォーマットに変換された、Tracker を入力として受け入れるための以下の "in "セクションがあります :

"in":[ { "id":"Tracker1", "type":"Tracker", "attributes":[ { "name":"time", "type":"date" }, { "name":"location", "type":"geo:point" } ] } ]

"out" セクションは、指定されたアラート定義の NGSI コンテキスト・エンティティにも似ています :

"out":[
       {
         "id":"Fence1",
         "type":"Alert",
         "attributes":[
           { "name":"time", "type":"date" },
           { "name":"location", "type":"geo:point" },
           { "name":"inside", "type":"boolean" }
         ]
       }
]

まず、ポリゴンを使ってフェンス(ジオフセンス・ゾーン)を定義する必要があります :

CREATE VARIABLE Geometry fence = polygon({point(0, 0), point(0,50), point(50,50), point(50, 0), point(0, 0)})

次に、Alert イベントタイプの後にモデル化された各トラッカーの状態を保持するウィンドウを作成します :

CREATE WINDOW TrackerState.std:unique(id) as Alert

次に、トラッカーがその場所を更新するたびにトラッカーがフェンス内にある場合に計算する新しいイベントタイプを定義します :

INSERT INTO TrackerInside SELECT *, fence.contains(location) as inside FROM Tracker

次に、FearCross イベントを定義します。このイベントは、ゾーン内でトラッカーが検出されたとき、またはゾーン外にある時、一定の期間に反対の更新が発生しなかったときに発生します :

INSERT INTO FenceCross SELECT a.* FROM pattern [ every a=TrackerInside -> (timer:interval(4 sec) and not TrackerInside(id=a.id, inside!=a.inside)) ]

これにより、トラッカーが一定時間エッジに留まるケースを処理することができます。

TrackerState は、状態が異なる場合または状態がまだ定義されていない場合にのみ更新されます :

ON FenceCross fc MERGE TrackerState ts
WHERE fc.id = ts.id
   WHEN NOT MATCHED THEN INSERT SELECT id, time, location, inside
   WHEN MATCHED AND fc.inside != ts.inside THEN UPDATE SET inside = fc.inside

最後に、TrackerState ウィンドウのすべてのイベントは Alert として送信されます :

INSERT INTO Alert SELECT * FROM TrackerState"

config.json は、完全な設定のセットアップを持っています。

セットアップをテスト

run.sh ファイルを端末で実行し、Cepheus CEP のログをチェックすることで、CEP に送信されたルームの温度と CEP がイベントに反応することを確認できます。

最初の端末で、Cepheus-CEP を起動します :

cd cepheus-cep
mvn spring-boot:run

デフォルト設定では、マシン上の port :8080で起動する必要があります。

今度は別のターミナルで、run.sh スクリプトを起動します :

cd doc/examples/8_DateAndGeoPoint
sh run.sh

スクリプトは最初に config.json ファイルを Cepheus-CEP に送信し、位置更新の送信を開始します。

CEP を開始した端末に戻ります。 "EventIn"がログに記録され、Alert "EventOut"が3回発生した場所が表示されます :

  • トラッカーがゾーン外として定義されている初期アラート
  • トラッカーがゾーン内として定義している次のアラート
  • トラッカーがゾーンに存在する最終的なアラート