WebHook
WebHook 的内部实现是基于 钩子,但它更靠近顶层一些。它通过在钩子上的挂载回调函数,获取到 EMQX 中的各种事件,并转发至 emqx_web_hook 中配置的 Web 服务器。
以 客户端成功接入(client.connected) 事件为例,其事件的传递流程如下:
提示
WebHook 对于事件的处理是单向的,它仅支持将 EMQX 中的事件推送给 Web 服务,并不关心 Web 服务的返回。 借助 Webhook 可以完成设备在线、上下线记录,订阅与消息存储、消息送达确认等诸多业务。
Webhook 的配置文件位于 ,配置项的详细说明可以查看 配置项。
在 etc/plugins/emqx_web_hook.conf
可配置触发规则,其配置的格式如下:
目前支持以下事件:
同一个事件可以配置多个触发规则,配置相同的事件应当依次递增。
- action:字符串,取固定值
- topic:字符串,表示一个主题过滤器,操作的主题只有与该主题匹配才能触发事件的转发
例如,我们只将与 a/b/c
和 foo/#
主题匹配的消息转发到 Web 服务器上,其配置应该为:
这样 Webhook 仅会转发与 a/b/c
和 foo/#
主题匹配的消息,例如 foo/bar
等,而不是转发 a/b/d
或 。
事件触发时 Webhook 会按照配置将每个事件组成一个 HTTP 请求发送到 url
所配置的 Web 服务器上。其请求格式为:
对于不同的事件,请求 Body 体内容有所不同,下表列举了各个事件中 Body 的参数列表:
client.connect
Key | 类型 | 说明 |
---|---|---|
action | string | 事件名称 固定为:”client_connect” |
clientid | string | 客户端 ClientId |
username | string | 客户端 Username,不存在时该值为 “undefined” |
ipaddress | string | 客户端源 IP 地址 |
keepalive | integer | 客户端申请的心跳保活时间 |
proto_ver | integer | 协议版本号 |
client.connack
Key | 类型 | 说明 |
---|---|---|
action | string | 事件名称 固定为:”client_connack” |
clientid | string | 客户端 ClientId |
username | string | 客户端 Username,不存在时该值为 “undefined” |
ipaddress | string | 客户端源 IP 地址 |
keepalive | integer | 客户端申请的心跳保活时间 |
proto_ver | integer | 协议版本号 |
conn_ack | string | “success” 表示成功,其它表示失败的原因 |
client.connected
client.disconnected
Key | 类型 | 说明 |
---|---|---|
action | string | 事件名称 固定为:”client_disconnected” |
clientid | string | 客户端 ClientId |
username | string | 客户端 Username,不存在时该值为 “undefined” |
reason | string | 错误原因 |
Key | 类型 | 说明 |
---|---|---|
action | string | 事件名称 固定为:”client_subscribe” |
clientid | string | 客户端 ClientId |
username | string | 客户端 Username,不存在时该值为 “undefined” |
topic | string | 将订阅的主题 |
opts | json | 订阅参数 |
opts 包含
client.unsubscribe
Key | 类型 | 说明 |
---|---|---|
action | string | 事件名称 固定为:”client_unsubscribe” |
clientid | string | 客户端 ClientId |
username | string | 客户端 Username,不存在时该值为 “undefined” |
topic | string | 取消订阅的主题 |
session.subscribed:同 client.subscribe
,action 为 session_subscribed
session.unsubscribed:同 client.unsubscribe
,action 为 session_unsubscribe
session.terminated: 同 ,action 为 session_terminated
message.publish
Key | 类型 | 说明 |
---|---|---|
action | string | 事件名称 固定为:”message_publish” |
from_client_id | string | 发布端 ClientId |
from_username | string | 发布端 Username,不存在时该值为 “undefined” |
topic | string | 取消订阅的主题 |
qos | enum | QoS 等级,可取 0 1 2 |
retain | bool | 是否为 Retain 消息 |
payload | string | 消息 Payload |
ts | integer | 消息的时间戳(毫秒) |
message.delivered
message.acked
Key | 类型 | 说明 |
---|---|---|
action | string | 事件名称 固定为:”message_acked” |
clientid | string | 接收端 ClientId |
from_client_id | string | 发布端 ClientId |
from_username | string | 发布端 Username,不存在时该值为 “undefined” |
topic | string | 取消订阅的主题 |
qos | enum | QoS 等级,可取 0 2 |
retain | bool | 是否为 Retain 消息 |
payload | string | 消息 Payload |
ts | integer | 消息时间戳(毫秒) |