腾讯云物联网SQL处理数据教程

创建规则时,需要编写SQL来处理数据。当规则为二进制时,不对数据内容做处理,直接透传。
 
当规则为JSON数据时,可以将Jsons数据映射为虚拟表,其中Key对应表的列,Value对应列值。为了方便理解,我们将数据处理的某条规则抽象为SQL表达式(类似MySQL语法):
 
例如某智能电灯具有开、关、色度、亮度等属性,上报数据内容如下:
 
{
 
"status":”on”
 
"bright":65
 
"color":3000
 
}
 
假定需要转发“电灯在打开状态并且亮度在50以下”的数据,可以编写如下的SQL语句:
 
SELECT status, deviceName() as deviceName, bright FROM /ProductA/+/update WHERE status=”on” and bright < =50
 
当上报的数据符合电灯打开、并且亮度小于等于50时,会触发该规则,并且解析数据中的状态、设备名称、亮度,用于进一步处理。
 
SELECT
 
1.  JSON数据格式
 
SELECT语句中的字段,可以使用上报消息的payload中的解析结果(即JSON中的键值),也可以使用SQL内置的函数,比如deviceName()。
 
支持*和函数的组合。不支持子SQL查询。
 
上报的JSON数据格式,可以是数组或者嵌套的JSON。SQL语句支持使用JSONPath获取其中的属性值,如对于{a:{key1:v1, key2:v2}},可以通过a.key2 获取到值v2。值得注意的是,单引号''和双引号""均表示常量,不带引号则表示变量,变量区分大小写。
 
操作符不区分大小写,+-*/%均支持大数运算,除法除不尽时保留小数点后9位,%表示求余运算,不支持表示百分比,并且支持中文字符。
 
例如上述的" SELECT status, deviceName() as deviceName, bright FROM /ProductA/+/update WHERE status=”on” and bright < =50"语句,其中status和bright来自于上报数据中的字段,deviceName()则使用了内置的SQL函数。内置的SQL函数可以参考函数列表。
 
2.  二进制数据格式
 
a. 可填*直接透传数据。*后不能再使用函数。
 
b. 可使用内置函数,如to_base64(*)函数,将原始Payload二进制数据转成base64String提取出来等。

FROM
 
FROM 可以是Topic信息。Topic中的设备名(deviceName)一级类目可以填写通配符+(代表本级所有类目),用于匹配需要处理的设备消息Topic。
 
当有符合Topic规则的消息到达时,消息的payload数据以JSON格式解析,并根据SQL语句进行处理(如果消息格式不合法,将忽略此消息)。您可以使topic()用函数引用具体的Topic值。
 
上文例子中,"FROM /ProductA/+/update"语句表示该SQL仅处理符合/ProductA/+/update格式的消息。
 
WHERE
 
1. JSON数据格式
 
WHERE为规则触发条件。不支持子SQL查询。WHERE中可以使用的字段和SELECT语句一致。当接收到对应Topic的消息时,WHERE语句的结果会作为是否触发规则的判断条件。具体条件表达式列表见下方表格。
 
上文例子中 " WHERE status=”on” and bright < =50" 表示状态为开并且亮度小于等于50时,才会触发该规则,执行配置。
 
2.   二进制数据格式
 
目前二进制格式WHERE语句中仅支持内置函数及条件表达式,无法使用payload中的字段。

SQL执行结果
 
SQL语句执行完成后,会得到对应的SQL结果,用于下一步转发处理。如果payload数据解析过程中出错则会导致规则运行失败。转发数据动作中的表达式需要使用 ${表达式} 引用对应的值。
 
对于上文例子,配置转发动作时,可以${status}、${deviceName}和${bright}获取SQL解析结果。
 
数组使用说明
 
支持JSON数组引用,比如{"a":[{"a1":12},{"a2":13}]},a[0]表示{"a1":12},a[0].a1表示12,数组索引从0开始。

标签