EMQ-WebHook简介和使用

WebHook官网详细说明,阅读此博文时,一定要同时看官网,因为有很多固定的名称,每个事件的参数也不一样
https://docs.emqx.cn/broker/latest/advanced/webhook.html#%E9%85%8D%E7%BD%AE%E9%A1%B9

WebHook 是由 emqx_web_hook (opens new window)插件提供的 将 EMQ X 中的钩子事件通知到某个 Web 服务的功能

WebHook 的内部实现是基于 钩子,但它更靠近顶层一些。它通过在钩子上的挂载回调函数,获取到 EMQ X 中的各种事件,并转发至 emqx_web_hook 中配置的 Web 服务器

WebHook 对于事件的处理是单向的,仅支持将 EMQ X 中的事件推送给 Web 服务,并不关心 Web 服务的返回。 借助 Webhook 可以完成设备在线、上下线记录,订阅与消息存储、消息送达确认等诸多业务


触发规则

在 etc/plugins/emqx_web_hooks.conf 可配置触发规则,其配置的格式如下:

## 格式示例
web.hook.rule.<Event>.<Number> = <Rule>

## 以下是系统默认项
#web.hook.rule.client.connect.1       = {"action": "on_client_connect"}
#web.hook.rule.client.connack.1       = {"action": "on_client_connack"}
#web.hook.rule.client.connected.1     = {"action": "on_client_connected"}
#web.hook.rule.client.disconnected.1  = {"action": "on_client_disconnected"}
#web.hook.rule.client.subscribe.1     = {"action": "on_client_subscribe"}
#web.hook.rule.client.unsubscribe.1   = {"action": "on_client_unsubscribe"}
#web.hook.rule.session.subscribed.1   = {"action": "on_session_subscribed"}
#web.hook.rule.session.unsubscribed.1 = {"action": "on_session_unsubscribed"}
#web.hook.rule.session.terminated.1   = {"action": "on_session_terminated"}
#web.hook.rule.message.publish.1      = {"action": "on_message_publish"}
#web.hook.rule.message.delivered.1    = {"action": "on_message_delivered"}
#web.hook.rule.message.acked.1        = {"action": "on_message_acked"}

## 示例值
web.hook.rule.message.publish.1 = {"action": "on_message_publish", "topic": "a/b/c"}
web.hook.rule.message.publish.2 = {"action": "on_message_publish", "topic": "foo/#"}

Number

同一个事件可以配置多个触发规则,配置相同的事件应当依次递增。

Rule

触发规则,其值为一个 JSON 字符串,其中可用的 Key 有:

  • action:字符串,取固定值
  • topic:字符串,表示一个主题过滤器,操作的主题只有与该主题匹配才能触发事件的转发

例如,我们只将与 a/b/c 和 foo/# 主题匹配的消息转发到 Web 服务器上,其配置应该为:

web.hook.rule.message.publish.1 = {"action": "on_message_publish", "topic": "a/b/c"}
web.hook.rule.message.publish.2 = {"action": "on_message_publish", "topic": "foo/#"}

这样 Webhook 仅会转发与 a/b/c 和 foo/# 主题匹配的消息,例如 foo/bar 等,而不是转发 a/b/d 或 fo/bar


案例:设备上线和下线时,能够在第三方系统中查询

1 修改 etc/plugins/emqx_web_hook.conf 文件,设置事件转发的url和地址和触发规则

# 事件需要转发的目的服务器地址
web.hook.api.url = http://127.0.0.1:8991/mqtt/webhook

# 触发规则
web.hook.rule.client.connected.1     = {"action": "on_client_connected"}
web.hook.rule.client.disconnected.1  = {"action": "on_client_disconnected"}
# 以下可以不开启,测试用用
web.hook.rule.client.subscribe.1     = {"action": "on_client_subscribe"}
web.hook.rule.message.publish.2      = {"action": "on_message_publish","topic":"img/#"}

2 在EMQ的控制台开启emqx_web_hook 插件
3 编写springboot应用

package cn.huawei.emq_http_authority.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;

@RequestMapping("/mqtt")
@RestController
public class Controller_5 {

    private final static Logger logger = LoggerFactory.getLogger(Controller_5.class);

    private Map<String,Boolean> ztList=new HashMap<>();

    @PostMapping("/webhook")
    public void webhook(@RequestBody() Map<String,Object> params)
    {
        logger.info("参数列表 {}",params);
        /**
         * 注意 action,clientid,事件名 的名称不能修改,否则匹配不上
         */
        String action = (String)params.get("action");
        String clientid = (String)params.get("clientid");
        if(action.equals("client_connected"))
        {
            logger.info("client:{} 上线",clientid);
            ztList.put(clientid,true);
        }
        if(action.equals("client_disconnected"))
        {
            logger.info("client:{} 下线",clientid);
            ztList.put(clientid,false);
        }
    }

    @RequestMapping("/ztList")
    public Map<String,Boolean> getZtList()
    {
        return ztList;
    }

}

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值