前言
当我们接收到了客户端/终端设备发来的信息,一般都需要作相应处理然后存到数据库,再按需在前端页面展示。当然也是可以直接通过WebSocket在前端展示的。
那么,怎么把接收到的消息保存到数据库呢?有好几种方案。
- 购买EMQ X Enterprise,省心省力,减少开发难度。
- 在java后台搭建客户端,这样可以在java后台订阅和发布报文,但在非controller层保存数据库可能会显得麻烦。
- 手写EMQX插件,不推荐,难而且还容易错。
- 规则引擎,便捷快速,是我喜欢的方案,也是本文主要介绍的方案。
EMQ X Rule Engine (以下简称规则引擎) 用于配置 EMQ X 消息流与设备事件的处理、响应规则。规则引擎不仅提供了清晰、灵活的 “配置式” 的业务集成方案,简化了业务开发流程,提升用户易用性,降低业务系统与 EMQ X 的耦合度;也为 EMQ X 的私有功能定制提供了一个更优秀的基础架构。
EMQ X 在 消息发布或事件触发 时将触发规则引擎,满足触发条件的规则将执行各自的 SQL 语句筛选并处理消息和事件的上下文信息。
0.事件的上下文信息
先看看常用的三个事件吧,其他的可以自己去Dashboard测试。
a.消息发布
b.终端连接成功
c.终端连接断开
1.消息入库
下面就通过规则引擎+SpringBoot进行物联网 MQTT 设备在线状态记录、消息存储入库。
a.payload消息入库
我们最关心的大多是payload,所以先只获取payload里的内容。
规则引擎配置完了,再写一下后台代码以便测试:
用Websocket测试:
结果:
除了payload的信息,我们还经常需要获取并记录设备/客户端的信息(包括设备ID、设备状态、时间戳等)。
在这里可按自己需要修改发送的消息数据,但注意引号的使用。不然后台收到数据就会报错了。
当然,也可以什么都不填,默认全部数据都发送。到时要什么就用什么,也很好。
结果:
{"headers":{"username":"","protocol":"mqtt","proto_ver":4,"properties":{},"peerhost":"127.0.0.1"},"metadata":{"rule_id":"rule1"},"peerhost":"127.0.0.1","clientid":"mqttjs_b851e6fca8","flags":{"retain":false,"dup":false},"node":"emqx@127.0.0.1","qos":0,"payload":"{ \"userId\": \"121\" }","pub_props":{},"publish_received_at":1611929179404,"topic":"testtopic","id":"5BA0A82243AC3F44201001ED50027","event":"message.publish","username":"","timestamp":1611929179404}
然后可以通过JSON.toJavaObject()
把jsonObject转成相应的实体类对象,再调用service、dao层的方法录入数据库。
b.在线状态记录
事件:
- 客户端连接成功
- 客户端连接断开
需求:
- 获取客户端最后上线时间/下线时间
- 获取客户端是否在线