记录一下自己解决这个问题的方法!
一、技术原理
新建一个转发指定数据的资源接口,然后在规则引擎中设置过滤主题消息的规则,筛选出你所需要主题的消息,设置转发的http接口(URL),http请求选择POST或GET请求,要求是在编写servlet接口时与doPost()、doGet()方法对应。servlet接口中的逻辑就是实现对数据库的增删改查操作,当然servlet接口也是部署在云端的!
二、实现步骤
1、新建资源接口:
打开EMQX的后台,新建一个资源,资源类型选择webhook,资源ID可以自己修改也可不改,填写url,这里我是用tomcat服务器部署servlet接口,端口是8080,如果使用其他的服务器部署,请填写该服务器的端口!
2、设置主题消息过滤规则并配置转发的资源接口:
选择规则,点击新建一条规则。在这里需要编写筛选主题消息的SQL语句。
这里的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语句,就可以看到输出的结果。
查询到符合规则的消息后,添加一个相应动作,类型选择发送数据到web服务,关联资源选择你刚才创建的资源接口,消息内容模版默认不填就好!
这样就完成了MQTT服务器转发数据到指定的接口啦,接下来就是编写servlet接口程序
3、编写servlet接口程序
这里可能需要一点JavaWeb基础,会使用doPost()和doGet()方法差不多了,剩下的就是数据库的增删改查了。
如果在资源接口那里选择了POST请求,那就在doPost()方法中获取MQTT服务器转发来的数据,因为用http协议传输,数据将以参数的形式传递出去,POST请求的参数在请求体中获取,得到的是json格式的数据;如果选择了GET请求,就在doGet()方法中获取数据,数据也是以参数形式传递,不过是以明文的方式传输,所以直接在doGet()方法中调用获取请求参数的函数即可。
因为有多类型传感器,需要匹配多个servlet接口程序,所以需要在web.xml下设置映射关系,比如在地址栏输入:http://ip:8080/项目名/light,它就会给你匹配LightServlet去处理你的请求,因为我已经把light和LightServlet绑定了。学过JavaWeb的这一点应该知道。
4、在云端部署servlet接口
因为没怎么学过Linux,所以建议大家可以使用宝塔面板安装tomcat服务器和MySQL数据库,关于宝塔面板的安装,百度有很多了!
安装好tomcat服务器后,找到tomcat目录下的webapp目录,然后把写好的Servlet接口上传到这里,它会自动解压!
在server.xml中配置一下,至于为什么这么做,百度上有三种tomcat部署项目的方法!
5、测试servlet接口
在EMQX的后台的工具菜单里提供了测试功能,点击websocket,连接mqtt服务器后,输入模拟的消息,点击发送,可以看到mysql数据中的光照强度表里添加了两行数据,证明servlet接口是ok的。
这只是实现数据的添加操作,其他的查询,修改功能也是如此实现的。以上就是我个人对EMQX转发数据到数据库的小小见解而已啦!
我自己实现的功能如下:
源码也给大家啦,有兴趣的小伙伴可以研究一下啦!
地址:https://github.com/ldcowq/smartHome