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

示意图如下所示。

连续高温报警

前提条件

请您确保已创建边缘实例,具体操作请参见专业版环境搭建

一、添加设备

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

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

二、添加流数据分析任务

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

    其中,开发类型选择SQL运行环境选择边缘

    创建任务
  2. 系统自动进入流数据任务开发SQL工作台

    复制如下SQL内容到编辑框中。若想了解更多复杂事件处理(CEP)的语法,请参见复杂事件处理(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. 实例详情页面网关页签,单击网关名称右侧的远程SSH终端,打开两个远程控制台,例如远程控制台1远程控制台2远程控制台1用于改变温度传感器温度值,远程控制台2用于查看计算结果。
    说明 需要您先打开网关名称右侧的远程访问按钮,远程SSH终端才可以使用。
    远程调试
  3. 远程控制台1,进入/linkedge/gateway/build/bin目录,执行3次如下命令,每次更改temperature参数的值,分别改为80、81、82。
    ./ds_ctrl property a1WuxHr**** 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 a1WuxHr**** temperatureSensor01 '{"temperature":90}'

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

    2019-02-01 14:51:23.890 -> a1WuxHr****,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 -> a1WuxHr****,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 -> a1WuxHr****,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 -> a1WuxHr****,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 -> a1WuxHr****,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 -> a1WuxHr****,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 -> a1WuxHr****,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 -> a1WuxHr****,temperatureSensor01,81|82|83,2019-02-01 14:51:53.35,2019-02-01 14:51:59.68