創(chuàng)建數(shù)據(jù)流轉(zhuǎn)規(guī)則時(shí),需編寫(xiě)SQL來(lái)解析和處理設(shè)備上報(bào)的JSON數(shù)據(jù)。二進(jìn)制格式的數(shù)據(jù)不做解析,直接透?jìng)鳌1疚闹饕榻B如何編寫(xiě)數(shù)據(jù)流轉(zhuǎn)規(guī)則的SQL表達(dá)式。
SQL表達(dá)式
您可使用新版云產(chǎn)品流轉(zhuǎn)功能,通過(guò)編輯腳本訪問(wèn)標(biāo)識(shí)符以數(shù)字開(kāi)頭的物模型,進(jìn)行數(shù)據(jù)流轉(zhuǎn)。具體內(nèi)容,請(qǐng)參見(jiàn)腳本編寫(xiě)說(shuō)明。
JSON數(shù)據(jù)可以映射為虛擬的表,其中Key對(duì)應(yīng)表的列,Value對(duì)應(yīng)列值,因此可以使用SQL來(lái)進(jìn)行數(shù)據(jù)處理。數(shù)據(jù)流轉(zhuǎn)規(guī)則的SQL表達(dá)示意圖如下:
數(shù)據(jù)流轉(zhuǎn)規(guī)則SQL示例:
- 處理自定義Topic數(shù)據(jù)的SQL示例。
某環(huán)境傳感器可以采集溫度、濕度及氣壓數(shù)據(jù)。設(shè)備上報(bào)到自定義Topic:/a1hRrzD****/+/user/update的數(shù)據(jù)如下:
{ "temperature":25.1, "humidity":65, "pressure":101.5, "location":"***,***" }
設(shè)置溫度大于38℃時(shí)觸發(fā)規(guī)則,并篩選出設(shè)備名稱(chēng)、溫度和位置信息,SQL語(yǔ)句如下:
SELECT temperature as t, deviceName() as deviceName, location FROM "/a1hRrzD****/+/user/update" WHERE temperature > 38
- 處理基礎(chǔ)通信Topic、物模型通信Topic數(shù)據(jù)的SQL示例。基礎(chǔ)通信Topic、物模型通信Topic中的數(shù)據(jù)流轉(zhuǎn)到規(guī)則引擎后,規(guī)則引擎會(huì)對(duì)數(shù)據(jù)進(jìn)行解析,解析后的數(shù)據(jù)格式,請(qǐng)參見(jiàn)數(shù)據(jù)格式。
某溫濕度傳感器的屬性如下:
溫濕度傳感器上報(bào)的溫度和濕度屬性數(shù)據(jù)經(jīng)規(guī)則引擎解析后,數(shù)據(jù)格式如下:
{ "deviceType": "TemperatureHumidityDetector", "iotId": "N5KURkKdibnZvSls****000100", "productKey": "a15NNfl****", "gmtCreate": 1564569974224, "deviceName": "N5KURkKdibnZvSls3Yfx", "items": { "CurrentHumidity": { "value": 70, "time": 1564569974229 }, "CurrentTemperature": { "value": 23.5, "time": 1564569974229 } } }
重要 SQL查詢(xún)時(shí),必須通過(guò)items.${屬性標(biāo)識(shí)符}.value
來(lái)訪問(wèn)指定屬性的數(shù)據(jù)。設(shè)置溫度值大于38℃時(shí)觸發(fā)規(guī)則,并篩選出設(shè)備名稱(chēng)、當(dāng)前溫度和當(dāng)前濕度,SQL語(yǔ)句如下:
SELECT deviceName() as deviceName, items.CurrentHumidity.value as Humidity, items.CurrentTemperature.value as Temperature FROM "/sysa15NNfl****/N5KUR***/thing/event/property/post" WHERE items.CurrentTemperature.value > 38
如果是自定義模塊(testFB)下屬性,屬性標(biāo)識(shí)符格式為
${模塊標(biāo)識(shí)符}:${屬性標(biāo)識(shí)符}
,訪問(wèn)指定屬性數(shù)據(jù)時(shí),必須使用英文雙引號(hào)(“”),SQL語(yǔ)句如下:SELECT deviceName() as deviceName, "items.testFB:CurrentHumidity.value" as Humidity, "items.testFB:CurrentTemperature.value" as Temperature FROM "/sysa15NNfl****/N5KUR***/thing/event/property/post" WHERE "items.testFB:CurrentTemperature.value" > 38
SELECT
- JSON數(shù)據(jù)格式
SELECT語(yǔ)句中的字段,可以使用上報(bào)消息的payload解析結(jié)果,即JSON中的鍵值,也可以使用SQL內(nèi)置的函數(shù),如
deviceName()
。規(guī)則引擎內(nèi)置的SQL函數(shù),請(qǐng)參見(jiàn)函數(shù)列表。支持
*
和函數(shù)的組合。不支持子SQL查詢(xún)。上報(bào)的JSON數(shù)據(jù)格式,可以是數(shù)組或者嵌套的JSON。SQL語(yǔ)句支持使用JSONPath獲取其中的屬性值,如對(duì)于
{a:{key1:v1, key2:v2}}
,可以通過(guò)a.key2
獲取到值v2
。使用變量時(shí),需要注意單雙引號(hào)區(qū)別:?jiǎn)我?hào)表示常量,雙引號(hào)或不加引號(hào)表示變量。如使用單引號(hào)'a.key2'
,值為a.key2
。本文SQL示例中:
- 處理自定義Topic數(shù)據(jù)SQL的SELECT語(yǔ)句
SELECT temperature as t, deviceName() as deviceName, location
中,temperature
和loaction
來(lái)自于上報(bào)數(shù)據(jù)中的字段,deviceName()
則使用了內(nèi)置的SQL函數(shù)。 - 處理上報(bào)屬性Topic數(shù)據(jù)SQL的SELECT語(yǔ)句
SELECT deviceName() as deviceName, items.CurrentHumidity.value as Humidity, items.CurrentTemperature.value as Temperature
中,items.CurrentHumidity.value
和items.CurrentTemperature.value
來(lái)自于上報(bào)的默認(rèn)模塊屬性數(shù)據(jù)中的字段,deviceName()
則使用了內(nèi)置的SQL函數(shù)。說(shuō)明items.testFB:CurrentHumidity.value
和items.testFB:CurrentTemperature.value
來(lái)自于上報(bào)的自定義模塊屬性數(shù)據(jù)中的字段。
- 處理自定義Topic數(shù)據(jù)SQL的SELECT語(yǔ)句
- 二進(jìn)制數(shù)據(jù)格式
- 可填
*
直接透?jìng)鲾?shù)據(jù)。*
后不能再使用函數(shù)。 - 可使用內(nèi)置函數(shù),如
to_base64(*)
函數(shù),將原始payload二進(jìn)制數(shù)據(jù)轉(zhuǎn)成base64的String提取出來(lái);deviceName()
函數(shù),將設(shè)備名稱(chēng)信息提取出來(lái)。
- 可填
FROM
FROM可以填寫(xiě)為T(mén)opic,用于匹配需要處理的設(shè)備消息來(lái)源Topic。Topic中的設(shè)備名(deviceName)類(lèi)目可以填寫(xiě)為通配符加號(hào)(+),代表當(dāng)前層級(jí)所有類(lèi)目,即產(chǎn)品下的所有設(shè)備;指定為自定義Topic時(shí),還可以使用通配符井號(hào)(#),代表Topic中當(dāng)前層級(jí)及之后的所有類(lèi)目。通配符說(shuō)明,請(qǐng)參見(jiàn)自定義Topic。
當(dāng)來(lái)自指定Topic的消息到達(dá)時(shí),消息的payload數(shù)據(jù)以JSON格式解析,并根據(jù)SQL語(yǔ)句進(jìn)行處理。如果消息格式不合法,將忽略此條消息。您可以使用topic()
函數(shù)引用具體的Topic值。
以上SQL示例中:
FROM "/a1hRrzD****/+/user/update"
語(yǔ)句表示該SQL僅處理自定義Topic:/a1hRrzD****/+/user/update的消息。FROM "/sys/a15NNfl****/N5KURkKdibnZvSls3Yfx/thing/event/property/post"
語(yǔ)句表示該SQL僅處理設(shè)備N(xiāo)5KURkKdibnZvSls3Yfx上報(bào)屬性的Topic中的消息。
WHERE
- JSON數(shù)據(jù)格式
規(guī)則觸發(fā)條件,條件表達(dá)式。不支持子SQL查詢(xún)。WHERE中可以使用的字段和SELECT語(yǔ)句一致,當(dāng)接收到對(duì)應(yīng)Topic的消息時(shí),WHERE語(yǔ)句的結(jié)果會(huì)作為是否觸發(fā)規(guī)則的判斷條件。具體條件表達(dá)式,請(qǐng)參見(jiàn)以下章節(jié):條件表達(dá)式支持列表。
上文兩個(gè)示例中,條件語(yǔ)句
WHERE temperature > 38
表示溫度大于38℃時(shí),才會(huì)觸發(fā)該規(guī)則。 - 二進(jìn)制數(shù)據(jù)格式
目前二進(jìn)制格式WHERE語(yǔ)句中,僅支持內(nèi)置函數(shù)及條件表達(dá)式,無(wú)法使用payload中的字段。
SQL結(jié)果
SQL語(yǔ)句執(zhí)行完成后,會(huì)得到對(duì)應(yīng)的SQL結(jié)果,用于下一步轉(zhuǎn)發(fā)處理。如果payload數(shù)據(jù)解析過(guò)程中出錯(cuò),會(huì)導(dǎo)致規(guī)則運(yùn)行失敗。
如果要將數(shù)據(jù)流轉(zhuǎn)到表格存儲(chǔ)中,設(shè)置轉(zhuǎn)發(fā)數(shù)據(jù)目的地時(shí),需要使用變量格式${表達(dá)式}
引用對(duì)應(yīng)的值。
如果以上兩個(gè)示例SQL對(duì)應(yīng)的規(guī)則需將數(shù)據(jù)流轉(zhuǎn)到表格存儲(chǔ)的數(shù)據(jù)表中,主鍵對(duì)應(yīng)的值可分別配置為:
- ${t}、${deviceName}和${loaction}。
- ${deviceName}、${Humidity}和${Temperature}。
數(shù)組使用說(shuō)明
數(shù)組表達(dá)式需要使用雙引號(hào),用$.
表示取jsonObject,$.
可以省略,.
表示取jsonArray。
{"a":[{"v":0},{"v":1},{"v":2}]}
,不同表達(dá)式結(jié)果如下: "a[0]"
結(jié)果為{"v":0}
"$.a[0]"
結(jié)果為{"v":0}
".a[0]"
結(jié)果為[{"v":0}]
"a[1].v"
結(jié)果為1
"$.a[1].v"
結(jié)果為1
".a[1].v"
結(jié)果為[1]
條件表達(dá)式支持列表
操作符 | 描述 | 舉例 |
---|---|---|
= | 相等 | color = 'red' |
<> | 不等于 | color <> 'red' |
AND | 邏輯與 | color = 'red' AND siren = 'on' |
OR | 邏輯或 | color = 'red' OR siren = 'on' |
+ | 算術(shù)加法 | 4 + 5 |
- | 算術(shù)減 | 5 - 4 |
/ | 除 | 20 / 4 |
* | 乘 | 5 * 4 |
% | 取余數(shù) | 20 % 6 |
< | 小于 | 5 < 6 |
<= | 小于或等于 | 5 <= 6 |
> | 大于 | 6 > 5 |
>= | 大于或等于 | 6 >= 5 |
函數(shù)調(diào)用 | 支持函數(shù),更多信息,請(qǐng)參見(jiàn)函數(shù)列表。 | deviceId() |
JSON屬性表達(dá)式 | 可以從消息payload以JSON表達(dá)式提取屬性。 | state.desired.color,a.b.c[0].d |
CASE … WHEN … THEN … ELSE …END | Case表達(dá)式(不支持嵌套)。 | CASE col WHEN 1 THEN 'Y' WHEN 0 THEN 'N' ELSE '' END as flag |
IN | 僅支持枚舉,不支持子查詢(xún)。 | 例如:where a in(1,2,3)。不支持以下形式:where a in(select xxx)。 |
like | 匹配某個(gè)字符,僅支持% 通配符,代表匹配任意字符串。
| where c1 like '%abc' |
not like | where c1 not like '%def%' |
調(diào)試SQL
若創(chuàng)建數(shù)據(jù)流轉(zhuǎn)規(guī)則時(shí),數(shù)據(jù)格式選擇了JSON,可在物聯(lián)網(wǎng)平臺(tái)進(jìn)行SQL在線調(diào)試。調(diào)試方法如下。
- 編寫(xiě)SQL后,單擊SQL調(diào)試。
- 在SQL調(diào)試對(duì)話(huà)框的調(diào)試參數(shù)頁(yè)簽下,輸入用于調(diào)試數(shù)據(jù),然后單擊調(diào)試。
請(qǐng)根據(jù)Topic上報(bào)的數(shù)據(jù)格式,輸入調(diào)試用的payload數(shù)據(jù)。數(shù)據(jù)格式說(shuō)明:
- 若Topic為自定義Topic,輸入的payload數(shù)據(jù)格式需與Topic上報(bào)的數(shù)據(jù)格式一致。
- 若Topic為基礎(chǔ)通信Topic或物模型通信Topic,請(qǐng)參見(jiàn)數(shù)據(jù)格式。
- 單擊調(diào)試結(jié)果,查看結(jié)果。