EMQ X 规则引擎系列(二)存储消息到 MySQL 数据库
来源:SegmentFault
时间:2023-02-24 21:45:26 190浏览 收藏
编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《EMQ X 规则引擎系列(二)存储消息到 MySQL 数据库》,文章讲解的知识点主要包括MySQL、mqtt、物联网、iot、发布订阅模式,如果你对数据库方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。
场景介绍
该场景需要将 EMQ X 指定主题下且满足条件的消息存储到 MySQL 数据库。为了便于后续分析检索,消息内容需要进行拆分存储。
该场景下设备端上报信息如下:
- 上报主题:cmd/state/:id,主题中 id 代表车辆客户端识别码
-
消息体:
{ "id": "NXP-058659730253-963945118132721-22", // 客户端识别码 "speed": 32.12, // 车辆速度 "direction": 198.33212, // 行驶方向 "tachometer": 3211, // 发动机转速,数值大于 8000 时才需存储 "dynamical": 8.93, // 瞬时油耗 "location": { // GPS 经纬度数据 "lng": 116.296011, "lat": 40.005091 }, "ts": 1563268202 // 上报时间 }
当上报数据发动机转速数值大于
CREATE DATABASE `emqx_rule_engine_output` CHARACTER SET utf8mb4;
创建数据表
根据场景需求,创建数据表
CREATE TABLE `use_statistics` ( `id` int(11) NOT NULL AUTO_INCREMENT, `client_id` varchar(100) DEFAULT NULL COMMENT '客户端识别码', `speed` float unsigned DEFAULT '0.00' COMMENT '当前车速', `tachometer` int(11) unsigned DEFAULT '0' COMMENT '发动机转速', `ts` int(11) unsigned DEFAULT '0' COMMENT '上报时间戳', `msg_id` varchar(50) DEFAULT NULL COMMENT 'MQTT 消息 ID', PRIMARY KEY (`id`), KEY `client_id_index` (`client_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
创建成功后通过 MySQL 命令确认数据表是否存在:
Database changed mysql> desc use_statistics; +------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | client_id | varchar(100) | YES | MUL | NULL | | | speed | float unsigned | YES | | 0 | | | tachometer | int(11) unsigned | YES | | 0 | | | ts | int(11) unsigned | YES | | 0 | | | msg_id | varchar(50) | YES | | NULL | | +------------+------------------+------+-----+---------+----------------+ 6 rows in set (0.01 sec)
配置说明
创建资源
打开 EMQ X Dashboard,进入左侧菜单的 资源 页面,点击 新建 按钮,键入 MySQL 服务器信息进行资源创建。
EMQ X 集群中节点所在网络环境可能互不相同,资源创建成功后点击列表中 状态按钮,查看各个节点资源连接状况,如果节点上资源不可用,请检查配置是否正确、网络连通性,并点击 重连 按钮手动重连。
创建规则
进入左侧菜单的 规则 页面,点击 新建 按钮,进行规则创建。这里选择触发事件 消息发布,在消息发布时触发该规则进行数据处理。
选定触发事件后,我们可在界面上看到可选字段及示例 SQL:
筛选所需字段
规则引擎使用 SQL 语句处理规则条件,该业务中我们需要将
SELECT payload.id as client_id, payload.speed as speed, payload.tachometer as tachometer, payload.ts as ts, id FROM "message.publish" WHERE topic =~ 't/#'
确立筛选条件
使用 SQL 语句 WHERE 字句进行条件筛选,该业务中我们需要定义两个条件:
- 仅处理
SELECT payload.id as client_id, payload.speed as speed, payload.tachometer as tachometer, payload.ts as ts, id FROM "message.publish" WHERE topic =~ 'cmd/state/+' AND payload.tachometer > 8000
使用 SQL 测试功能进行输出测试
借助 SQL 测试功能,我们可以实时查看当前 SQL 处理后的数据输出,该功能需要我们指定 payload 等模拟原始数据。
payload 数据如下,注意更改
{ "id": "NXP-058659730253-963945118132721-22", "speed": 32.12, "direction": 198.33212, "tachometer": 9001, "dynamical": 8.93, "location": { "lng": 116.296011, "lat": 40.005091 }, "ts": 1563268202 }
点击 SQL 测试 切换按钮,更改
{ "client_id": "NXP-058659730253-963945118132721-22", "id": "589A429E9572FB44B0000057C0001", "speed": 32.12, "tachometer": 9001, "ts": 1563268202 }
测试输出与预期相符,我们可以进行后续步骤。
添加响应动作,存储消息到 MySQL
SQL 条件输入输出无误后,我们继续添加相应动作,配置写入 SQL 语句,将筛选结果存储到 MySQL。
点击响应动作中的 添加 按钮,选择 保存数据到 MySQL 动作,选取刚刚选定的资源,我们使用
INSERT INTO `use_statistics` (`client_id`, `speed`, `tachometer`, `ts`, `msg_id`) VALUES (${client_id}, ${speed}, ${tachometer}, ${ts}, ${id});
测试
预期结果
我们成功创建了一条规则,包含一个处理动作,动作期望效果如下:
- 设备向
{ "id": "NXP-058659730253-963945118132721-22", "speed": 32.12, "direction": 198.33212, "tachometer": 9002, "dynamical": 8.93, "location": { "lng": 116.296011, "lat": 40.005091 }, "ts": 1563268202 }
- 设备向
点击 发送 按钮,发送成功后查看规则统计 已命中 数据统计值为 1 表明规则已成功命中,MySQL 命令行中查看数据表记录得到数据如下:
至此,我们通过规则引擎实现了使用规则引擎存储消息到 MySQL 数据库的业务开发。
版权声明: 本文为 EMQ 原创,转载请注明出处。
理论要掌握,实操不能落!以上关于《EMQ X 规则引擎系列(二)存储消息到 MySQL 数据库》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
-
499 收藏
-
244 收藏
-
235 收藏
-
157 收藏
-
101 收藏
-
334 收藏
-
420 收藏
-
165 收藏
-
397 收藏
-
489 收藏
-
209 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习