使用EMQX中的规则引擎将消息写入TDengine 时序数据库

转载:https://blog.csdn.net/emqx_broker/article/details/102785401 (消息写入TDengine)

注:实际操作过程中进行操作补充

EMQ X  Broker版本:4.2.3    文档 :  https://docs.emqx.cn/broker/latest/

TDengine 版本 : 2.0.16.0     文档:   https://www.taosdata.com/cn/documentation/

前提对 EMQ X 与TDEngine 已有初步学习使用

场景介绍

本文以通过 MQTT 协议接入 EMQ X 的智能门锁为例进行说明。

智能门锁已经成为了智能家居的重点关注产品,为了保证用户更安全的开锁体验,智能门锁通常可以实现指纹开锁、密码开锁、IC卡开锁、钥匙开锁、远程开锁等功能。智能门锁每个业务环节都涉及到操作敏感指令和状态数据的发送、传输,这些数据在应当存储起来以备后续审计使用。
 

采集流程

智能门锁下发指令与上报数据通过 MQTT 协议经 EMQ X 传输,可选在 EMQ X 上使用规则引擎筛选或设置消费客户端处理,将满足条件的数据写入 TDEngine 数据平台,整个数据流转流程如下:

 

该场景中拟设智能门锁通过 lock/:id/control_receipt 主题( id 为门锁连接客户端的 clientid,同门锁 id) 上报操作回执与状态信息,数据格式为如下 JSON 消息:

{
  "id": "51dc0c50f55d11e9a4fec59e26b058d5", // 门锁 id
  "longitude": 102.8622543, // 当前位置经度
  "latitude": 24.8614503, // 当前位置纬度
  "command": "unlock", // 指令
  "LockState": 0, // 门锁状态
  "LockType": 0, // 开锁方式
  "KeyNickName": "", // 钥匙昵称
  "KeyID": "c944c8d0f55e11e9a4fec59e26b058d5", // 钥匙 ID
  "ErrorCode": 0, // 执行故障代码
  "pid": "84a2e10f55d11e9a4fec59e26b058d5", // 下发的指令 ID
  "alarm": "", // 当前告警信息
  "ts": 1570838400000 // 执行时间
}

准备

尽管 TDEngine 是关系型数据库模型,但要求每个采集设备单独建表,因此我们按照门锁 id 每个门锁建表一张,同时浮点数据压缩比相对整型数据压缩比很差,经度纬度通常精确到小数点后 7 位,因此将经度纬度增大 1E7 倍转为长整型存储

创建数据库的语句为:

create database db cache 8192 ablocks 2 tblocks 1000 tables 10000;
use db;

创建超级表的SQL语句为:

create table lock(
  ts timestamp,
  id nchar(50),
  pid nchar(50),
  longitude bigint,
  latitude bigint,
  command nchar(50),
  LockState smallint,
  LockType smallint,
  KeyNickName nchar(255),
  KeyID nchar(255),
  ErrorCode smallint,
  alarm nchar(255)
) tags(card nchar(255), model binary(10));

注:emqx 的建表语句card 类型错误

TDEngine 是关系型数据库模型,但要求每个采集设备单独建表,以门锁 id 作为采集表表名,例如 id 为 51dc0c50f55d11e9a4fec59e26b058d5,那么创建数据表的语句为:

-- 使用 using 指定其所属 超级表
create table "v_51dc0c50f55d11e9a4fec59e26b058d5" using lock tags('51dc0c50f55d11e9a4fec59e26b058d5', 0);

在该数据模型下,以门锁 id 51dc0c50f55d11e9a4fec59e26b058d5 为例,写入一条记录到表 v_51dc0c50f55d11e9a4fec59e26b058d5 的 SQL 语句为:

insert into v_51dc0c50f55d11e9a4fec59e26b058d5 values(
  1570838400000,
  '51dc0c50f55d11e9a4fec59e26b058d5',
  'e84a2e10f55d11e9a4fec59e26b058d5',
  1028622543,
  248614503,
  'unlock',
  0,
  0,
  '',
  'c944c8d0f55e11e9a4fec59e26b058d5',
  0,
  '[]',
);

 

实际使用中请先依次给每个智能门锁建表 ,可使用程序批量初始化建表

数据写入方式

目前 EMQ X 消息数据直接写入 TDEngine 的功能还在规划中,但得益于 TDEngine 提供了诸多连接器,我们选用以下两种方式完成数据写入:

使用 TDEngine 的 RESTful Connector:通过 REST API 调用,将数据拼接为 SQL 语句发送到 TDEngine 执行写入,规则引擎内置表达式与函数可以预处理数据;
通过 TDEngine 提供的客户端库/连接器,编写代码通过订阅/消费的方式获取 EMQ X 消息,处理后转发写入到 TDEngine 中。

使用规则引擎写入数据

资源准备

EMQ X Dashboard 中点击 规则 主菜单,在 资源 页面新建一个 WebHook 资源,用于向 TDEngine RESTful Connector 发送数据,新增请求头:

Authorization:值为 TDEngine 请求 TOKEN 用于连接认证,为 {username}:{password} 经过 Base64 编码之后的字符串。
有关 RESTful Connector 使用教程详见:TDEngine RESTful Connector

TDengine 默认账号密码  的Base64为    Basic cm9vdDp0YW9zZGF0YQ==

 

规则引擎-资源-新建

资源创建成功

 

创建规则

资源创建完毕后我们可以进行规则创建,规则引擎 --> 规则 页面中点击 新建 按钮进入规则创建页面。

选择 消息发布 事件,处理传感器消息上报(发布)时的数据。根据 可用字段 提示,传感器等信息可以从 payload 中选取。

由于需要将浮点值处理为整型,我们使用简单计算功能,请留意 SQL 中的注释项,最终整个 SQL 语句如下:

SELECT
  json_decode(payload) as p, -- JSON 数据解码
  p.longitude * 10000000 as p.longitude,    -- 经纬度放大 10E7 倍存储
  p.latitude * 10000000 as p.latitude
FROM
  "lock/+/control_receipt"  -- 主题筛选

 

 

消息体  JSON串,使用时去掉 注释

{
  "id": "51dc0c50f55d11e9a4fec59e26b058d5", // 门锁 id
  "longitude": 102.8622543, // 当前位置经度
  "latitude": 24.8614503, // 当前位置纬度
  "command": "unlock", // 指令
  "LockState": 0, // 门锁状态
  "LockType": 0, // 开锁方式
  "KeyNickName": "", // 钥匙昵称
  "KeyID": "c944c8d0f55e11e9a4fec59e26b058d5", // 钥匙 ID
  "ErrorCode": 0, // 执行故障代码
  "pid": "84a2e10f55d11e9a4fec59e26b058d5", // 下发的指令 ID
  "alarm": "", // 当前告警信息
  "ts": 1570838400000 // 执行时间
}
响应结果
{
  "p": {
    "ErrorCode": 0,
    "KeyID": "c944c8d0f55e11e9a4fec59e26b058d5",
    "KeyNickName": "",
    "LockState": 0,
    "LockType": 0,
    "alarm": "",
    "command": "unlock",
    "id": "51dc0c50f55d11e9a4fec59e26b058d5",
    "latitude": 248614503,
    "longitude": 1028622543,
    "pid": "84a2e10f55d11e9a4fec59e26b058d5",
    "ts": 1570838400000
  }
}

从输出结果看,经纬度浮点值已经转为整型,说明该步操作正确,可以进行后续操作。

响应动作

点击创建页面下方 添加动作 按钮,在弹出的 新增动作 弹框里动作类型选择 发送数据到 Web 服务使用资源 选择上一步中创建的资源,消息内容模板 内容模板里面,使用 ${} 语法提取 条件 SQL 筛选出来的数据,拼接写入 SQL 语句如下:

insert into db.v_${p.id} values(
  ${p.ts},
  '${p.id}',
  '${p.pid}',
  ${p.longitude},
  ${p.latitude},
  '${p.command}',
  ${p.LockState},
  ${p.LockType},
  '${p.KeyNickName}',
  '${p.KeyID}',
  ${p.ErrorCode},
  '${p.alarm}',
);

点击 创建 完成规则的创建,智能门锁上报数据时数据将写入到 DBEngine,整个工作和业务流程如下:

智能门锁上报数据至 EMQ X
规则命中后触发响应动作列表,按照响应动作中的消息内容模板拼接出该动作所需请求参数,在这个规则中请求参数是一个 SQL 语句,包含有智能门锁的上报数据信息
按照动作类型和使用的资源发起请求, 调用 RESTful API 将指令发送到 TDEngine 执行,完成数据写入。
 

规则创建完成

 

使用工具Websocket 模拟消息

 

  • 发布主题:lock/${id}/control_receipt

  • Payload:

 

 

 

此处我使用了2张表  ,设置的qos=1  手动创建了1条,全部命中

 

 

 

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值