轻量级边缘计算 EMQ X Kuiper 与 Azure IoT

2019-11-21  本文已影响0人  EMQ

背景

本文以一个常见的物联网使用场景为案例,介绍了如何利用边缘计算来实现对业务的快速、低成本和有效地处理。

在各类物联网项目中,比如智能楼宇项目,需要将楼宇的数据(比如电梯、燃气、水电等)进行采集和分析。一种解决方案是将所有的设备直接接入在云端的物联网平台,类似于像 Azure IoT Hub 或者 AWS IoT Hub。这种解决方案的问题在于,

为了解决以上的问题,业界提出了边缘计算的方案,边缘计算的核心就在于把数据进行就近处理,避免不必要的时延、成本和安全问题。

业务场景

假设现有一组设备,组中的每个设备有一个 id,通过 MQTT 协议往 MQTT 消息服务器上相应的主题发送数据。主题的设计如下,其中 {device_id} 为设备的 id。

devices/{device_id}/messages

每个设备发送的数据格式为 JSON,发送的通过该传感器采集的温度与湿度数据。

{
    "temperature": 30, 
    "humidity" : 20
}

现在需要实时分析数据,并提出以下的需求:对每个设备的温度数据按照每 10 秒钟计算平均值(t_av),并且记下 10 秒钟内的最大值 (t_max)、最小值(t_min) 和数据条数(t_count),计算完毕后将这 4 个结果进行保存,以下为样例结果数据:

[
    {
        "device_id" : "1", "t_av" : 25,  "t_max" : 45, "t_min" : 5, "t_count" : 2
    },
    {
        "device_id" : "2", "t_av" : 25,  "t_max" : 45, "t_min" : 5, "t_count" : 2
    },
    ...
]

方案介绍

如下图所示,采用边缘分析/流式数据处理的方式,在边缘端我们采用了 EMQ X 的方案,最后将计算结果输出到 Azure 的 IoT Hub 中。

emqx_azure.png

实现步骤

安装 EMQ X Edge & Kuiper

创建流

Kuiper 提供了一个命令用于管理流和规则,用户可以通过在命令行窗口中敲入 bin/cli 查看有哪些子命令及其帮助。cli 命令缺省连接的是本地的 Kuiper 服务器,cli 命令也可以连接到别的 Kuiper 服务器,用户可以在 etc/client.yaml配置文件中修改连接的 Kuiper 服务器。用户如果想了解更多关于命令行的信息,可以参考这里

创建流定义:创建流的目的是为了定义发送到该流上的数据格式,类似于在关系数据库中定义表的结构。 Kuiper 中所有支持的数据类型,可以参考这里

# cd kuiper
# bin/cli create stream demo '(temperature float, humidity bigint) WITH (FORMAT="JSON", DATASOURCE="devices/+/messages")'

上述语句在 Kuiper 中创建了一个名为 demo 的流定义,包含了两个字段,分别为 temperature 和 humidity,数据源为订阅 MQTT 的主题 devices/+/messages,这里请注意采用了通配符 +,用于订阅不同设备的消息。该数据源所对应的 MQTT 服务器地址在配置文件 etc/mqtt_source.yaml中,可以根据所在的服务器地址进行配置。如下图所示,配置 servers 项目。

#Global MQTT configurations
default:
  qos: 1
  sharedsubscription: true
  servers: [tcp://127.0.0.1:1883]

用户可以在命令行中敲入 describe 子命令来查看刚创建好的流定义。

# bin/cli describe stream demo
Connecting to 127.0.0.1:20498
Fields
--------------------------------------------------------------------------------
temperature float
humidity    bigint

FORMAT: JSON
DATASOURCE: devices/+/messages

数据业务逻辑处理

Kuiper 采用 SQL 实现业务逻辑,每10秒钟统计温度的平均值、最大值、最小值和次数,并根据设备 ID 进行分组,实现的 SQL 如下所示。

SELECT avg(temperature) AS t_av, max(temperature) AS t_max, min(temperature) AS t_min, COUNT(*) As t_count, split_value(mqtt(topic), "/", 1) AS device_id FROM demo GROUP BY device_id, TUMBLINGWINDOW(ss, 10)

这里的 SQL 用了四个聚合函数,用于统计在10秒钟窗口期内的相关值。

另外还使用了两个基本的函数

GROUP BY 跟的是分组的字段,分别为计算字段 device_id;时间窗口 TUMBLINGWINDOW(ss, 10),该时间窗口的含义为每10秒钟生成一批统计数据。

调试 SQL

在正式写规则之前,我们需要对规则进行调试,Kuiper 提供了 SQL 的调试工具,可以让用户非常方便地对 SQL 进行调试。

创建、提交规则

完成了 SQL 的调试之后,开始配置规则文件,将结果数据通过 Kuiper 的 MQTT Sink 发送到远程的 Azure IoT Hub 中。 在 Azure IoT Hub 中,用户需要先创建好以下内容,

如下图所示,在 Azure IoT Hub 中创建完成的相关设备。

azure_iot.jpg

编写 Kuiper 规则文件

规则文件是一个文本文件,描述了业务处理的逻辑(前面已经调试好的 SQL 语句),以及 sink 的配置(消息处理结果的发送目的地)。连接 Azure IoT Hub 的大部分信息都已经在前文中描述,需要注意是必须设置 protocol_version 的值为 3.1.1,而不能为 3.1

{
  "sql": "SELECT avg(temperature) AS t_av, max(temperature) AS t_max, min(temperature) AS t_min, COUNT(*) As t_count, split_value(mqtt(topic), \"/\", 1) AS device_id FROM demo GROUP BY device_id, TUMBLINGWINDOW(ss, 10)",
  "actions": [
    {
      "log": {}
    },
    {
      "mqtt": {
        "server": "ssl://rockydemo.azure-devices.net:8883",
        "topic": "devices/demo_001/messages/events/",
        "protocol_version": "3.1.1",
        "qos": 1,
        "clientId": "demo_001",
        "username": "rockydemo.azure-devices.net/demo_001/?api-version=2018-06-30",
        "password": "SharedAccessSignature sr=*******************"
      }
    }
  ]
}

通过 Kuiper 命令行创建规则

# bin/cli create rule rule1 -f rule1.txt
Connecting to 127.0.0.1:20498
Creating a new rule from file rule1.txt. 
Rule rule1 was created.

在日志文件中可以查看规则的运行连接情况,如果配置项都正确的话,应该可以看到到 Azure IoT Hub 的连接建立成功。

......
time="2019-11-12T14:30:34+08:00" level=info msg="The connection to server tcp://10.211.55.6:1883 was established successfully" rule=rule1
time="2019-11-12T14:30:34+08:00" level=info msg="Successfully subscribe to topic devices/+/messages" rule=rule1
time="2019-11-12T14:30:35+08:00" level=info msg="The connection to server ssl://rockydemo.azure-devices.net:8883 was established successfully" rule=rule1
......

总结

通过本文,读者可以了解到利用 EMQ X 在边缘端的解决方案可以非常快速、灵活地开发出基于边缘数据分析的系统,实现数据低时延、低成本和安全的处理。Azure IoT 也提供了 IoT Edge 方案,与 Azure 的方案相比,

如果有兴趣了解更多关于边缘流式数据分析的内容,请参考 Kuiper 开源项目

上一篇 下一篇

猜你喜欢

热点阅读