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;
}
}