记录一下自己解决这个问题的方法!

一、技术原理

新建一个转发指定数据的资源接口,然后在规则引擎中设置过滤主题消息的规则,筛选出你所需要主题的消息,设置转发的http接口(URL),http请求选择POST或GET请求,要求是在编写servlet接口时与doPost()、doGet()方法对应。servlet接口中的逻辑就是实现对数据库的增删改查操作,当然servlet接口也是部署在云端的!

二、实现步骤

1、新建资源接口:

将MqttClient缓存到redis mqtt服务端数据存储_EMQX


打开EMQX的后台,新建一个资源,资源类型选择webhook,资源ID可以自己修改也可不改,填写url,这里我是用tomcat服务器部署servlet接口,端口是8080,如果使用其他的服务器部署,请填写该服务器的端口!

将MqttClient缓存到redis mqtt服务端数据存储_将MqttClient缓存到redis_02

2、设置主题消息过滤规则并配置转发的资源接口:

将MqttClient缓存到redis mqtt服务端数据存储_javaweb_03


选择规则,点击新建一条规则。在这里需要编写筛选主题消息的SQL语句。

将MqttClient缓存到redis mqtt服务端数据存储_将MqttClient缓存到redis_04


这里的payload是一个消息对象,主题收到的每一条消息都有如下这么多属性,其中我们传输的数据就在payload中,它是json格式的,所以你的数据上传时最好也是使用json格式。

{
  "username": "u_emqx",
  "topic": "smartHome",
  "timestamp": 1614515277516,
  "qos": 1,
  "publish_received_at": 1614515277516,
  "peerhost": "127.0.0.1",
  "payload": "{\"t\":\"light\",\"light\":\"20\"}",
  "node": "emqx@127.0.0.1",
  "metadata": {
    "rule_id": "test_rule4a19e8ea"
  },
  "id": "5BC64A199D064F44072000AB80000",
  "flags": {
    "sys": true,
    "event": true
  },
  "clientid": "c_emqx"
}

我的payload第一个数据是传感器类型,第二个数据是传感器采集的真实数据,大家可以根据自己情况进行设计,然后点击测试,就可以如果发送的消息符合设定SQL语句,就可以看到输出的结果。

将MqttClient缓存到redis mqtt服务端数据存储_MQTT_05


查询到符合规则的消息后,添加一个相应动作,类型选择发送数据到web服务,关联资源选择你刚才创建的资源接口,消息内容模版默认不填就好!

将MqttClient缓存到redis mqtt服务端数据存储_将MqttClient缓存到redis_06


这样就完成了MQTT服务器转发数据到指定的接口啦,接下来就是编写servlet接口程序

将MqttClient缓存到redis mqtt服务端数据存储_mysql_07

3、编写servlet接口程序

这里可能需要一点JavaWeb基础,会使用doPost()和doGet()方法差不多了,剩下的就是数据库的增删改查了。

将MqttClient缓存到redis mqtt服务端数据存储_mysql_08


如果在资源接口那里选择了POST请求,那就在doPost()方法中获取MQTT服务器转发来的数据,因为用http协议传输,数据将以参数的形式传递出去,POST请求的参数在请求体中获取,得到的是json格式的数据;如果选择了GET请求,就在doGet()方法中获取数据,数据也是以参数形式传递,不过是以明文的方式传输,所以直接在doGet()方法中调用获取请求参数的函数即可。

将MqttClient缓存到redis mqtt服务端数据存储_javaweb_09


因为有多类型传感器,需要匹配多个servlet接口程序,所以需要在web.xml下设置映射关系,比如在地址栏输入:http://ip:8080/项目名/light,它就会给你匹配LightServlet去处理你的请求,因为我已经把light和LightServlet绑定了。学过JavaWeb的这一点应该知道。

4、在云端部署servlet接口

因为没怎么学过Linux,所以建议大家可以使用宝塔面板安装tomcat服务器和MySQL数据库,关于宝塔面板的安装,百度有很多了!

将MqttClient缓存到redis mqtt服务端数据存储_EMQX_10


安装好tomcat服务器后,找到tomcat目录下的webapp目录,然后把写好的Servlet接口上传到这里,它会自动解压!

将MqttClient缓存到redis mqtt服务端数据存储_将MqttClient缓存到redis_11


在server.xml中配置一下,至于为什么这么做,百度上有三种tomcat部署项目的方法!

将MqttClient缓存到redis mqtt服务端数据存储_mysql_12

5、测试servlet接口

将MqttClient缓存到redis mqtt服务端数据存储_将MqttClient缓存到redis_13


在EMQX的后台的工具菜单里提供了测试功能,点击websocket,连接mqtt服务器后,输入模拟的消息,点击发送,可以看到mysql数据中的光照强度表里添加了两行数据,证明servlet接口是ok的。

这只是实现数据的添加操作,其他的查询,修改功能也是如此实现的。以上就是我个人对EMQX转发数据到数据库的小小见解而已啦!

我自己实现的功能如下:

将MqttClient缓存到redis mqtt服务端数据存储_EMQX_14


源码也给大家啦,有兴趣的小伙伴可以研究一下啦!

地址:https://github.com/ldcowq/smartHome