数据存储
更新时间: 2023-04-10

当前版本的平台没有直接存储设备属性、事件数据,我们提供以下方案实现设备历史数据的存储。

方式 使用场景 优缺点
TSDB存储 利用规则引擎将设备数据存储到时序数据库TSDB中 优点:操作简单、无需代码开发,经过简单配置即可实现
缺点:必须同时部署AIoTTSDB数据库
自定义存储 利用规则引擎将设备数据推送到自定义http服务或kafka中,用户服务存储设备数据到自有的数据库中,例如MySQL、MongoDB等 优点:可以灵活选择自有数据库
缺点:数据流程长,需要代码开发才能实现完整数据存储过程

# 使用规则引擎存储数据

# 属性数据存储

设备使用G+link上报的属性数据,推荐使用以下格式进行存储,业务服务可以基于设备的物模型及业务场景需要生成查询条件获取设备历史数据

此方案是为帮助用户熟悉使用规则引擎存储设备数据的方法,当你熟悉之后,可以根据业务需要灵活设计数据存储方式,如增加更多的tag等

  • TSDB数据存储格式示意

image.png

  • 属性数据存储规则配置

数据来源

thing/+/+/property/post

测试输入(选填)

{
    "reqId":"442c1da4-9d3a-4f9b-a6e9-bfe858e4ac43",
    "method":"thing.property.post",
    "version":"1.0",
    "timestamp":1610430718000,
    "bindName":"MAIN",
    "properties":{
        "humidity":23.1,
        "temperature":28.0
    }
}

过滤条件

查询语句

{ "datapoints":[$each(properties, function($v, $k) { 
    { 
    "metric":"property",
    "field":$k, 
    "tags":{ 
        "deviceName":$split($topic(),'/')[2],
        "productKey":$split($topic(),'/')[1],
        "instanceId":"zasr9fjmk53aur26" 
        }, 
    "timestamp":$exists(timestamp)?timestamp:$millis(), 
    "value":$type($v) in ["number","string" ]?$v:$string($v) 
    }
})] }

其中的instanceId替换为实际的ID,其他内容不用修改

数据目的地

时序数据库TSDB,选择目标数据库实例

  • 编辑调试规则操作参考

image.png

  • 查询设备历史属性数据

调用TSDB数据查询属性数据

PUT /v1/datapoint?query HTTP/1.1
Host: {database}.tsdb.iot.gz.AIoTbce.com
Authorization: {authorization}
Content-Type: application/json; charset=utf-8
x-bce-date: 2016-06-08T16:49:51Z

{
    "queries": [{
        "metric": "property",
        "fields": ["temperature","humidity"],
        "filters": {
            "start": "1 hour ago",
            "tags": {
                "instanceId": ["zasr9fjmk53aur26"],
                "productKey": ["dht22"],
                "deviceName": ["sn202112280001"]
            }
        }
        "limit": 1000  
    }],
    "disablePresampling": false
} 

以上查询条件可以查询最多1000个1小时以前的设备历史属性数据

其中:

fields字段由物模型中定义的事件输入参数keys组成

tags为设备的基本ID信息

# 事件数据存储

设备使用G+link上报的事件数据,如果需要可以使用以下格式进行存储,业务服务可以基于设备的物模型及业务场景需要生成查询条件获取设备历史事件数据

此方案是为帮助用户熟悉使用规则引擎存储设备数据的方法,当你熟悉之后,可以更加业务需要灵活设计数据存储方式,如增加更多的tag等

image.png

  • 事件数据存储规则配置

数据来源

thing/+/+/event/post

测试输入

{
    "reqId":"442c1da4-9d3a-4f9b-a6e9-bfe858e4ac43",
    "method":"thing.event.post",
    "version":"1.0",
    "timestamp":1610430718000,
    "bindName":"MAIN",
    "events":{
        "temperature_overrun":{
            "temperature":38.5,
            "msg":"环境温度超限,请开启空调"
        },
        "humidity_overrun":{
            "humidity":50,
            "msg":"环境湿度超限,请开启空调"
        }
    }
}

过滤条件

$count($keys(events))=1

查询语句

{ "datapoints":$each($merge($each(events, function($v, $i, $a) {
    $merge($each($v, function($v1, $k1) {
      {$string($i&"/"&$k1):$v1}
      }))})), function($v2, $k2) {
    { 
    "metric":"event",
    "field":$split($k2,"/")[1], 
    "tags":{ 
        "deviceName":$split($topic(),'/')[2], 
        "productKey":$split($topic(),'/')[1],
        "instanceId":"zasr9fjmk53aur26",
        "eventName":$split($k2,'/')[0] 
        }, 
    "timestamp":$exists(timestamp)?timestamp:$millis(), 
    "value":$type($v2) in ["number","string" ]?$v2:$string($v2) 
    }
}) }

数据目的地

时序数据库TSDB,选择目标数据库实例

  • 查询设备历史事件数据

调用TSDB接口查询设备事件数据

PUT /v1/datapoint?query HTTP/1.1
Host: {database}.tsdb.iot.gz.AIoTbce.com
Authorization: {authorization}
Content-Type: application/json; charset=utf-8
x-bce-date: 2016-06-08T16:49:51Z

{
    "queries": [{
        "metric": "event",
        "fields": ["temperature","msg"],
        "filters": {
            "start": "1 hour ago",
            "tags": {
                "instanceId": ["zasr9fjmk53aur26"],
                "productKey": ["dht22"],
                "deviceName": ["sn202112280001"],
                "eventName": ["temperature_overrun"]
            }
        }
        "limit": 1000  
    }],
    "disablePresampling": false
} 

以上查询条件可以查询最多1000个1小时以前的设备历史事件数据

其中:

fields字段由物模型中定义的事件输入参数keys组成

tags为设备的基本ID信息和事件名称