现实生活中,温度单次超出阈值并不会对设备造成影响,但连续多次超出阈值可能会引发机器故障等风险。本文以连续高温报警(连续3次超过80度)为例,详细说明如何使用流数据分析复杂事件处理的功能实现连续高温事件的判断,并将结果输出到文件中。

示意图如下所示。


连续高温报警

前提条件

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

一、添加设备

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

说明
  • 设备分配到边缘实例后,请先不要部署边缘实例,待完成其他操作后统一部署。
  • 若已操作过高温报警示例内容,并创建了温度传感器产品和设备,则无需重复创建。

二、添加流数据分析任务

  1. 参考分配流数据分析到边缘实例内容,创建、设置并发布连续高温报警的流数据分析任务。

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


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

    复制如下SQL内容到SQL编辑器编辑框中。若想了解更多复杂事件处理(CEP)的语法,请参见Flink CEP

    -- 连续3次温度>80时,输出报警信息到本地文件中
    
    create table property (
        propertyName varchar,
        propertyValue varchar,
        productKey varchar,
        deviceName varchar,
        ts varchar,
        tstamp as to_timestamp (cast (ts as bigint)),
        WATERMARK wk FOR tstamp as withOffset (tstamp, 0)
    ) with (
        type = 'edgebus',
        jsonParser = 'device_property'
    );
    
    create table file (
        productKey varchar,
        deviceName varchar,
        temperatureList varchar,
        startTime timestamp,
        endTime timestamp
    ) with (
        type = 'file',
        filePath = '/linkedge/run/debug/case05_continue_high_temperature_alarm.txt'
    );
    
    insert into
    file
    select
        productKey,
        deviceName,
        temperatureList, -- 每次的温度示数
        startTime, -- 开始时间
        endTime -- 结束时间
    from
        property
        MATCH_RECOGNIZE (
            PARTITION BY productKey, deviceName
            ORDER BY tstamp -- 在窗口内,对事件时间进行排序
            MEASURES -- 定义如何根据匹配成功的输入事件构造输出事件
                CONCAT(LAST(e.propertyValue, 2), '|', LAST(e.propertyValue, 1), '|', e.propertyValue) as temperatureList,
                LAST(e.tstamp, 2) as startTime,
                e.tstamp as endTime
            ONE ROW PER MATCH -- 匹配成功输出一条
            AFTER MATCH SKIP TO NEXT ROW -- 匹配跳转到下一行后继续处理
            PATTERN (e{3}) -- e连续发生3次则输出一个事件
            DEFINE -- 定义在PATTERN中出现的patternVariable的具体含义
                e as e.propertyName = 'temperature' and cast (e.propertyValue as double) > 80
        );
  3. 保存任务并发布。
  4. 参考分配流数据分析到边缘实例内容,将该SQL任务分配到边缘实例中。

三、添加消息路由

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


添加消息路由

四、部署边缘实例

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

    命令执行完成后,可在远程控制台2可看到如下信息。

    2019-02-01 14:51:23.890 -> a1WuxHrhojr,temperatureSensor01,81|82|83,2019-02-01 14:51:20.1,2019-02-01 14:51:23.723
    2019-02-01 14:51:30.472 -> a1WuxHrhojr,temperatureSensor01,82|83|84,2019-02-01 14:51:22.053,2019-02-01 14:51:30.401
    2019-02-01 14:51:32.582 -> a1WuxHrhojr,temperatureSensor01,83|84|85,2019-02-01 14:51:23.723,2019-02-01 14:51:32.509
    2019-02-01 14:51:34.494 -> a1WuxHrhojr,temperatureSensor01,84|85|86,2019-02-01 14:51:30.401,2019-02-01 14:51:34.398
    2019-02-01 14:51:36.602 -> a1WuxHrhojr,temperatureSensor01,85|86|87,2019-02-01 14:51:32.509,2019-02-01 14:51:36.559
    2019-02-01 14:51:38.817 -> a1WuxHrhojr,temperatureSensor01,86|87|88,2019-02-01 14:51:34.398,2019-02-01 14:51:38.802
    2019-02-01 14:51:41.031 -> a1WuxHrhojr,temperatureSensor01,87|88|89,2019-02-01 14:51:36.559,2019-02-01 14:51:40.967
    2019-02-01 14:51:59.790 -> a1WuxHrhojr,temperatureSensor01,81|82|83,2019-02-01 14:51:53.35,2019-02-01 14:51:59.68