开发者中心

介绍

概述

使用QuarkIoE的实时事件处理,可以在IoT方案中添加自己的逻辑。这包括但不限于数据分析逻辑。要定义新的分析,需要使用QuarkIoE事件语言。该语言允许采用强大的基于模式匹配和事件窗口的查询语言分析传入的数据。它还允许实时创建,更新和删除数据。

典型的实时分析使用案例包括:

  • 远程控制:如果温度超过40度则关闭设备。
  • 确认:丢弃负读数或低于以前的读数。
  • 派生数据: 计算每台自动售货机的销售交易量。
  • 汇总:汇总每天某个客户的自动售货机销售额。
  • 通知:如果某个机器断电,发送邮件。
  • 压缩:全部汽车的位置信息每五分钟只更新一次(但仍然对正在看的用户界面中的车发送实时数据)。

在下面的章节我们描述了QuarkIoE事件语言如何工作的基本知识,你可以创建自己的分析或其他服务器端的业务逻辑和自动化程序。

事件流

在QuarkIoE事件语言中数据通过流传递。您可以在流中创建事件,并侦听流中创建的事件。

预定义流

一些预定义流可以和有些QuarkIoEAPI交互。 对于每个输入流相应的API调用时QuarkIoE自动生成事件,例如通过REST API创建一个测量值时,在MeasurementCreated流中将生成一个新事件。 为了和QuarkIoE后台交互,可以在相应的输出流创建事件,QuarkIoE将自动执行数据库查询或创建发送邮件短信所需的API调用,例如在CreateAlarm流中创建一个事件就会在数据库中生成一条警告。

API 输入流 输出流 描述
Inventory ManagedObjectCreated
ManagedObjectUpdated
ManagedObjectDeleted
CreateManagedObject
UpdateManagedObject
DeleteManagedObject
本组事件代表创建,修改或删除单个ManagedObject。
Events EventCreated
EventDeleted
CreateEvent
DeleteEvent
本组事件代表创建或删除单个事件。
Measurements MeasurementCreated
MeasurementDeleted
CreateMeasurement
DeleteMeasurement
本组事件代表创建或删除单个测量值。
Device control OperationCreated
OperationUpdated
CreateOperation
UpdateOperation
本组事件代表创建或修改单个操作。
Alarms AlarmCreated
AlarmUpdated
CreateAlarm
UpdateAlarm
本组事件代表创建或修改单个报警。
Emails (not used) SendEmail
SendDashboard
本组事件代表发送邮件。
SMS (not used) SendSms 本组事件代表发送短信。
Text-to-speech (not used) SendSpeech 本组事件代表初始化电话呼叫。

请检查数据模型,看看每个流上的事件是如何构造的。

在流中创建事件

通过 insert intoselect 创建事件。 首先需要指定 "insert into" 后面的要创建的流的名称。之后,使用 "select" 语句来指定事件参数。 参数语法: value as parameter。可以通过指定多个参数,用逗号分开。参数的顺序无所谓。请注意,流可以有强制参数,需要在 "select" 子句指定。

在流中监听事件

在流中触发创建事件的最常见的方法是另外一个流中发生事件。因此,你可以监听其他流的事件。这是由关键字 from 后面的流名称和 (可选) 后面的变量名来引用稍后语句中的事件。

条件

添加条件可以通过关键字 where 来完成,而不是为每一个传入的事件触发事件创建,仅仅为满足条件的事件创建。where 关键字后面表达式,表达式结果是 true 或 false。可以通过 andor 连结多个表达式。

例子

作为一个例子,我们现在结合本页的学习内要创建一个语句。它将监听一个流,条件适用时在另一个流中创建一个新事件。 例如,我们要为创建的每个温度测量值创建一个报警。

  1. 创建一个报警,我们需要 insert intoCreateAlarm
  2. 我们需要在 select 子句为事件指定所有参数
  3. 当有 fromMeasurementCreated 的事件收到时,我们创建报警
  4. 我们只为MeasurementCreated流中符合where子句的事件创建报警

最后产生的语句如下:


    insert into CreateAlarm
      select
      measurementEvent.measurement.time as time,
      measurementEvent.measurement.source.value as source,
      "c8y_TemperatureAlarm" as type,
      "Temperature measurement was created" as text,
      "ACTIVE" as status,
      "CRITICAL" as severity
      from MeasurementCreated measurementEvent
      where measurementEvent.measurement.type = "c8y_TemperatureMeasurement";