本文以一个典型的开源时序型数据库(InfluxDB)为例,描述如何使用边缘函数计算应用,实现时序存储设备数据。
前提条件
- 请您确保已完成边缘实例的创建,具体操作,请参见专业版环境搭建。
- 您已创建光照度传感器产品以及该产品下的LightSensor设备,并将设备分配至边缘实例,具体操作,请参见示例驱动。
- 您已创建容器镜像类型的边缘应用,具体操作,请参见容器镜像应用。
其中,部分参数设置按如下要求配置。
表 1. 应用信息参数说明 参数 说明 应用类型 此处选择容器镜像。 仓库类型 此处选择公共仓库 。 镜像地址 设置为 influxdb:latest
。应用版本 设置为当前使用的数据库版本号,例如1.7.9版本。 表 2. 容器配置参数说明 参数 描述 是否使用宿主机host模式 此处选择否。 网络端口映射 此处按如下说明,设置两条网络端口映射: - 第一条网络端口映射:
- 宿主机端口:8083
- 容器内端口:8083
- 类型:TCP
- 第二条网络端口映射:
- 宿主机端口:8086
- 容器内端口:8086
- 类型:TCP
是否启动特权模式 此处选择是。 卷映射 此处按如下说明,设置卷映射: - 源路径:/tmp/influxdb
- 目的路径:/var/lib/influxdb
- 读写权限:读写
- 第一条网络端口映射:
背景信息
物联网边缘计算提供的函数计算应用能力,可帮助您快速地将模型化的设备数据存储到时序数据库中。在此过程中,只需配置该函数计算应用的消息路由并部署应用,无需二次开发。
本文中以LightSensor传感器为例,将获取到的LightSensor传感器数据,按照时间顺序存储到InfluxDB中。
步骤一:创建应用函数
步骤二:分配函数到边缘实例
步骤三:配置消息路由
添加消息的详细步骤及各个参数的解释。详细信息,请参见设置消息路由。
步骤四:部署边缘实例
附录:数据查询
当数据存储到InfluxDB后,可通过InfluxDB API查询已存储的数据。部分数据查询示例如下所示,更多详情,请参见InfluxDB API文档。
- 以产品为维度,查询某个属性所有时间点的值,返回结果会以时间顺序列出所有已存储的属性值。
curl -G 'http://localhost:8086/query?db=example&u=root&p=root' --data-urlencode "epoch=ms" --data-urlencode 'q=SELECT * FROM "属性唯一标识符(产品下唯一)" WHERE "_productKey" = $pk and "_dataType" = $type' --data-urlencode 'params={"pk":"产品ProductKey", "type": "property"}' //响应结果 { "results": [{ "statement_id": 0, "series": [{ "name": "temp", "columns": ["time", "_dataType", "_deviceName", "_productKey", "value"], "values": [ [1570782663561, "property", "0987654321", "产品ProductKey", 100.1], [1570782688527, "property", "0987654321", "产品ProductKey", 100.2], [1570782851708, "property", "0987654321", "产品ProductKey", 104.4] ] }] }] }
- 以设备为维度,查询某个属性所有时间点的值,返回结果会以时间顺序列出所有已存储的属性值。
curl -G 'http://localhost:8086/query?db=example&u=root&p=root' --data-urlencode "epoch=ms" --data-urlencode 'q=SELECT * FROM "属性唯一标识符(产品下唯一)" WHERE "_deviceName" = $dn and "_dataType" = $type' --data-urlencode 'params={"dn":"设备名称", "type": "property"}'
- 以设备为维度,查询某个属性在一定时间范围内的值,返回结果会以时间顺序列出该时间范围内所有已存储的属性值。
curl -G 'http://localhost:8086/query?db=example&u=root&p=root' --data-urlencode "epoch=ms" --data-urlencode 'q=SELECT * FROM "属性唯一标识符(产品下唯一)" WHERE "_productKey" = $pk and "_dataType" = $type and "time" > $timestamp' --data-urlencode 'params={"pk":"产品ProductKey", "type": "property", "timestamp": "2019-10-11T09:03:15.611Z"}'
附录:数据格式定义
设备的属性或事件类型数据在InfluxDB的存储格式如下所示。
- 单值式属性
[ { "measurement": "temp", // 属性名 "tags": { // 属性的标签 "_productKey": "1234567890", // 设备证书信息productKey "_deviceName": "0987654321", // 设备证书信息deviceName "_dataType" : "property" // 类型:property表示属性,event表示事件 }, "time": 1346846400000, // 时间戳,单位:ms "fields": { "value": 123 // 属性的值 } } ... ]
- 结构体式属性
[ { "measurement": "temp", // 属性名 "tags": { // 属性的标签 "_productKey": "1234567890", // 设备证书信息productKey "_deviceName": "0987654321", // 设备证书信息deviceName "_dataType" : "property" // 类型:property表示属性,event表示事件 }, "time": 1346846400000, // 时间戳,单位:ms "fields": { "aa": 12, // 属性的值 "bb": 12, // 属性的值 "cc": 12, // 属性的值 "dd": 12, // 属性的值 } } ... ]
- 事件
[ { "measurement": "event123", // 事件名 "tags": { // 事件的标签 "_productKey": "1234567890", // 设备证书信息productKey "_deviceName": "0987654321", // 设备证书信息deviceName "_dataType" : "event" // 类型:property表示属性,event表示事件 }, "time": 1346846400000, // 时间戳,单位:ms "fields": { "speed" : 20.8, "level" : 4, "direction" : "East", } } ... ]