目录
一、数据集成功能实现
官方文档:数据集成简介 | EMQX 5.0 文档
监听/sys/${productKey}/${deviceName}/status/${status}就可以收到设备上下线消息
1、配置文件实现
在emqx.conf文件中添加以下内容
rule_engine {
rules.connected {
sql ="SELECT timestamp as time,first(tokens(peername,':')) as clientIp,first(tokens(first(tokens(clientid, '|')),'.')) productKey,last(tokens(first(tokens(clientid, '|')),'.')) deviceName,'online'as status FROM \"$events/client_connected\""
actions = [
{
function = republish
args = {
topic = "/sys/${productKey}/${deviceName}/status/${status}"
qos = "2"
retain = true
payload = "{\"clientId\": \"${productKey}/${deviceName}\",\"time\": \"${time}\",\"eventType\": \"connect\",\"clientIp\": \"${clientIp}\"}"
}
}
]
}
rules.disconnected {
sql ="SELECT timestamp as time,first(tokens(peername,':')) as clientIp,first(tokens(first(tokens(clientid, '|')),'.')) productKey,last(tokens(first(tokens(clientid, '|')),'.')) deviceName,'offline'as status FROM \"$events/client_disconnected\""
actions = [
{
function = republish
args = {
topic = "/sys/${productKey}/${deviceName}/status/${status}"
qos = "2"
retain = true
payload = "{\"clientId\": \"${productKey}/${deviceName}\",\"time\": \"${time}\",\"eventType\": \"disconnect\",\"clientIp\": \"${clientIp}\"}"
}
}
]
}
}
2、
在Dashboard的“数据集成”的“规则”下新建,如下图所示新建客户端上线的规则,新建完后可以调试一下是否会得到想要的数据
sql的函数:
SQL 函数 | EMQX 5.0 文档
新建完规则后,再新建动作
主题、qos、Payload都可以用表达式如下图
Payload中表达式不需要引号包裹,主要是看想要什么数据
相同的过程可以新建客户端下线发送消息
遗留的问题:
在配置文件中的sql暂时无法换行
上下线规则可以合并在一起,合并在一起需要case条件语句,目前调试的是没有问题,但是测试的是实现不了
二、配置规则实现
可以修改规则,订阅客户端上线下线的消息,在acl.conf中添加以下内容,位置不要放错
监听$SYS/brokers/+/clients/+/connected与$SYS/brokers/+/clients/+/disconnected即可,如果不配置上面的规则,无法监听这两个主题
默认配置下以$SYS开头的配置都是无法监听的,具体系统主题查看系统主题 | EMQX 5.0 文档
配置规则具体可以查看规则下的文件授权,也是默认的授权File | EMQX 5.0 文档
三、通过钩子实现
可以查看emqx的ExHook钩子使用_wbx123wbx的博客-CSDN博客
如下有红框中的两行代码,并实现了相应的接口即可