本文以高温报警(传感器温度>80度时,输出报警信息到本地文件中)的场景为例,详细说明如何使用SQL进行流数据分析作业的编写以及流数据分析作业如何运作。

流程图如下所示。
高温报警

前提条件

在开始操作本章内容前,请您确保已根据环境搭建内容创建完成边缘实例。

一、添加设备

参考设备模拟器章节中使用设备模拟器驱动部分的内容,创建一个使用设备模拟器驱动的设备,并将设备分配到边缘实例中。

说明 此处请先不要部署边缘实例,待完成其他操作后统一部署边缘实例。

二、添加流数据分析任务

  1. 参考分配流数据分析到边缘实例,创建、设置并发布数据分析任务。

    其中,任务类型选择SQL执行任务选择边缘端


    创建流数据分析任务
  2. 任务列表中,已创建的SQL任务名称右侧单击查看,进入SQL编辑器

    复制如下SQL内容到SQL编辑器编辑框中。

    -- 温度>80时,输出报警信息到本地文件中
    
    -- 定义数据源表,源表会驱动流数据分析作业的运行。
    -- 每个流数据分析作业必须提供至少一个流式数据存储。
    create table property (
        -- 定义源表输入字段
        propertyName varchar, -- 属性名
        propertyValue varchar, -- 属性值
        productKey varchar,
        deviceName varchar,
        ts varchar, -- 数据产生的时间,由设备产生,即设备属性变化发生的时间
        gmtCreate varchar -- 流引擎接收到数据的时间,大于事件时间
    ) with (
        type = 'edgebus', -- 定义了源表类型,edgebus表示从边缘消息总线获取数据(json格式的字符串)
        jsonParser = 'device_property' -- 定义了json字符串解析器,device_property表示使用设备属性json解析器解析,不符合设备属性json格式的数据会被丢弃
    );
    
    -- 定义数据结果表,用于存储流数据分析的计算结果。
    -- 每个流数据分析作业必须提供至少一个结果表。
    create table file (
        -- 定义结果表输出字段
        productKey varchar,
        deviceName varchar,
        temperature double, -- 温度值
        ts timestamp, --  数据产生的时间
        gmtCreate timestamp -- 流引擎接收到数据的时间
    ) with (
        type = 'file', -- 定义了结果表类型,edgebus表示将结果输出到文件中
        filePath = '/linkedge/run/debug/case01_high_temperature_alarm.txt' -- 定义了输出的文件路径
    );
    
    -- insert语句定义具体的执行逻辑,源表收到数据后会触发这段逻辑的执行
    insert into
        file -- 将结果输出到结果表(文件)
    select
        productKey,
        deviceName,
        cast (propertyValue as double), -- propertyValue默认类型是字符,温度值为浮点类型,需要做数据转化
        to_timestamp (cast (ts as bigint)), -- 将数据产生的utc时间转为timestamp
        to_timestamp (cast (gmtCreate as bigint)) -- 将流引擎接收到数据的时间转为timestamp
    from
        property -- 将源表接收到的设备属性数据拿出来处理
    where
        propertyName = 'temperature' -- 通过属性名过滤出包含温度值的数据
        and cast (propertyValue as double) > 80; -- 塞选出温度值>80的数据
  3. 保存任务并发布。
  4. 参考分配流数据分析到边缘实例,将该SQL任务分配到边缘实例中。

三、添加消息路由

在边缘实例的实例详情页面,选择消息路由,将温度传感器的属性变化数据路由到高温报警的流数据分析作业中。


设置消息路由

四、部署边缘实例

  1. 在边缘实例的实例详情页面,单击部署,将子设备、流数据分析作业及消息路由下发到边缘端。
  2. 实例详情 > 网关页面,单击网关名称右侧的远程连接,打开两个远程控制台,例如远程控制台1远程控制台2远程控制台1用于改变温度传感器温度值,远程控制台2用于查看计算结果。
    说明 需要您先在设置页签下打开远程调试远程连接才可以使用。
  3. 远程控制台1,进入/linkedge/gateway/build/bin目录,执行如下命令:
    ./ds_ctrl property a1WuxHrhojr temperatureSensor01 '{"temperature":70}'
  4. 远程控制台2,执行tail -f /linkedge/run/debug/case01_high_temperature_alarm.txt命令 ,查看输出结果。
    此时因为设备温度只达到了70,因此不会输出任何信息。
  5. 远程控制台1,执行如下命令。
    ./ds_ctrl property a1WuxHrhojr temperatureSensor01 '{"temperature":90}'

    此时温度已经超过了80,可在远程控制台2可看到如下信息。

    2019-01-24 18:09:48.490 -> a1WuxHrhojr,temperatureSensor01,90.0,2019-01-24 18:09:48.456,2019-01-24 18:09:48.464
说明
  • 流数据分析作业部署到边缘端后,会先解析 create table语句,即源表和结果表的定义。在本例中,源表定义解析完成之后会开始监听边缘消息总线,结果表定义解析后会尝试打开文件。
  • 流数据分析作业会一直处于运行的状态,只要接收到边缘消息路由的数据(在本例中为温度传感器的属性变化数据)就会立即执行具体的逻辑,即执行insert语句。