2017-05-29 82 views
1

我正在嘗試創建訂閱,以通知我關於某些傳感器值的更改。FIWARE Orion:訂閱的服務路徑

curl broker.waziup.io/v2/subscriptions -s -S --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'Fiware-Service:watersense' --header 'Fiware-ServicePath:/#' -d @- <<EOF 
{ 
    "description": "Send XXX when YYY", 
    "subject": { 
    "entities": [ 
     { 
     "id": "WS_UPPA_Sensor2", 
     "type": "SensingDevice" 
     } 
    ], 
    "condition": { 
     "attrs": [ 
     "SM1" 
     ], 
     "expression": { 
     "q": "SM1>400" 
     } 
    } 
    }, 
    "notification": { 
    "httpCustom": { 
     "url": "https://api.plivo.com/v1/Account/MAMDA5ZDJIMDM1NZVMZD/Message/", 
     "headers": { 
     "Content-type": "application/json", 
     "Authorization": "Basic XXX" 
     }, 
     "method": "POST", 
     "payload": "{ %22src%22: %2200393806412092%22, %22dst%22: %2200393806412093%22, %22text%22: %22WaterSense: Field is too dry. \${id} humidity value is \${SM1} %22}" 
    }, 
    "attrs": [ 
     "SM1" 
    ] 
    }, 
    "expires": "2040-05-24T20:00:00.000Z", 
    "throttling": 1 
} 
EOF 

第一個問題,ServicePath在訂閱中有什麼用處? 它似乎在檢索與該訂閱相關的實體時使用。所以/#是有效的。這是否正確(我沒有在文檔中找到它)?

其次,假設你想創建一個基於幾個實體屬性值的訂閱。如果這些實體屬性具有相同的名稱(通常是這種情況),那麼您如何引用它們?你可以這樣做:有效載荷類似

"q": "Sensor1.SM1>100, Sensor2.SM1>100" 

而且什麼東西?

+0

我已經回答了第一個問題。對於第二個問題,我需要一點澄清。你的意思是* *不同*實體中的*相同*名稱的屬性?那是對的嗎?謝謝! – fgalan

+0

我認爲他可以使用'idPattern'之類的東西,就像這個鏈接所說的:'https:// stackoverflow.com/questions/43230064/fiware-orion-subscribe-to-all-entities'。或者,也許只需將所有感興趣的實體放入訂閱結構中的「id」字段即可。 @fgalan,做這件事的正確方法是什麼,在訂閱結構中指定許多實體ID? – Dalton

+0

@fgalan是在不同實體中具有相同名稱的屬性。 – cdupont

回答

1

關於第一個問題,使用Fiware-Service: /#表示訂閱涵蓋任何服務路徑中的實體。換句話說,任何實體(無論其在服務中的服務路徑)都可能觸發訂閱(當然,只要其他條件,例如實體id /類型,屬性,過濾器等等)。

關於第二個問題,考慮到給定的訂閱是通過在實體的更新觸發。換句話說,Orion收到給定實體的更新,如果它與訂閱的條件相匹配,則會觸發訂閱併發送包含該實體的通知。因此,q過濾器總是指被更新的實體(並且在某些情況下通知,如果符合q過濾器和其他條件)。

subject.entities字段的作用是定義訂閱引用的實體的子集。例如,您可以使用{ "idPattern": ".*", "type": "TempMeter" }來指代類型爲TempMeter的所有實體。但是,如果Orion獲取TempMeter類型的實體ID Meter1的更新,那麼q過濾器僅引用該實體。

關於在一個「包裝」多個實體更新(例如POST /v2/update)中的操作,它們在多個單實體更新中被分解,上述規則適用於這些更新。

例外情況:在訂閱創建時發送的初始通知將包含subject.entities涵蓋的所有實體。然而,這是一個非常特殊的情況(更接近同步查詢操作而不是常規訂閱行爲),所以它不是很有意義。在這種情況下,q過濾器會添加到subjects.entities所涵蓋的集合中,以選擇哪些實體將包含在初始通知中。

+0

好吧,我明白了。通知是基於每個實體的。要根據涉及多個實體的複雜條件創建通知,最好使用CEP http://fiware-iot-stack.readthedocs.io/en/latest/cep_api/ 謝謝! – cdupont