接口1(接收事件信息)
// application/api/controller/EmqxEvent.php
namespace app\api\controller;
use think\Controller;
use think\Db;
class EmqxEvent extends Controller
{
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
public function receiveEvent()
{
$data = $this->request->post();
Db::name('emqx_events')->insert([
'event_type' => $data['action'] ?? '',
'client_id' => $data['clientid'] ?? '',
'username' => $data['username'] ?? '',
'payload' => json_encode($data),
'create_time' => time()
]);
return json(['code' => 200, 'msg' => 'success']);
}
}
接口2(接收MQTT订阅信息)
// application/api/controller/EmqxMessage.php
namespace app\api\controller;
use think\Controller;
use think\Db;
class EmqxMessage extends Controller
{
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
public function receiveMessage()
{
$data = $this->request->post();
Db::name('mqtt_messages')->insert([
'topic' => $data['topic'] ?? '',
'qos' => $data['qos'] ?? 0,
'payload' => $data['payload'] ?? '',
'client_id' => $data['clientid'] ?? '',
'create_time' => time()
]);
return json(['code' => 200, 'msg' => 'success']);
}
}
数据库表SQL语句
事件信息表
CREATE TABLE `emqx_events` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`event_type` varchar(50) NOT NULL DEFAULT '' COMMENT '事件类型',
`client_id` varchar(100) NOT NULL DEFAULT '' COMMENT '客户端ID',
`username` varchar(50) DEFAULT '' COMMENT '用户名',
`payload` text COMMENT '原始数据',
`create_time` int(11) DEFAULT '0' COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_client_id` (`client_id`),
KEY `idx_event_type` (`event_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='EMQX事件记录表';
MQTT消息表
CREATE TABLE `mqtt_messages` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
`qos` tinyint(1) DEFAULT '0' COMMENT '服务质量',
`payload` text COMMENT '消息内容',
`client_id` varchar(100) DEFAULT '' COMMENT '客户端ID',
`create_time` int(11) DEFAULT '0' COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_topic` (`topic`),
KEY `idx_client_id` (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT消息记录表';
EMQX v5.10 Webhook配置方法
- 登录EMQX Dashboard
- 导航到"管理"->"WebHook"
- 点击"创建"按钮
- 填写Webhook名称和目标URL(对应FastAPI接口地址)
- 事件类型选择需要触发的事件(如客户端连接、断开、消息发布等)
- 根据需要配置其他选项(如请求方法、内容格式等)
- 保存配置并启用Webhook
典型Webhook配置示例
- 事件信息接口URL:
http://your-domain.com/api/emqx_event/receiveEvent
- MQTT消息接口URL:
http://your-domain.com/api/emqx_message/receiveMessage
注意事项
- 确保EMQX服务器可以访问FastAPI接口
- 建议在接口中添加简单的验证机制(如IP白名单或Token验证)
- 根据实际业务需求调整数据存储逻辑
- 在FastAPI配置中确保路由正确设置
登录EMQX Dashboard,进入Management
-> WebHook
页面:
-
创建事件WebHook:
- URL:
http://your-domain.com/admin/emqx.event/receive
- 事件类型选择:
client.connected
,client.disconnected
等 - 启用认证(如果需要)
- 保存配置
- URL:
-
创建消息WebHook:
- URL:
http://your-domain.com/admin/emqx.message/receive
- 事件类型选择:
message.publish
- 配置Topic过滤器(如
#
表示所有主题) - 保存配置
- URL:
通过API配置(替代Dashboard操作):
bash复制插入
# 创建事件WebHook
curl -X POST 'http://emqx-server:18083/api/v5/web_hook' \
-H 'Content-Type: application/json' \
-d '{
"name": "fastadmin_events",
"url": "http://your-domain.com/admin/emqx.event/receive",
"request_timeout": "5s",
"enable_pipelining": 100,
"ssl": {"enable": false},
"method": "POST",
"headers": {"content-type":"application/json"},
"events": ["client.connected","client.disconnected"]
}'
# 创建消息WebHook
curl -X POST 'http://emqx-server:18083/api/v5/web_hook' \
-H 'Content-Type: application/json' \
-d '{
"name": "fastadmin_messages",
"url": "http://your-domain.com/admin/emqx.message/receive",
"request_timeout": "5s",
"enable_pipelining": 100,
"ssl": {"enable": false},
"method": "POST",
"headers": {"content-type":"application/json"},
"events": ["message.publish"],
"topic": "#"
}'
复制插入
安全配置建议
- 在FastAdmin接口中添加Token验证
- 配置EMQX WebHook的Secret(5.10版本支持)
- 限制EMQX WebHook源的IP地址
- 接口启用HTTPS加密传输
测试验证
- 使用MQTT客户端发布测试消息
- 在EMQX Dashboard查看WebHook触发状态
- 检查FastAdmin数据库表中是否成功写入数据
- 通过EMQX CLI命令查看WebHook状态:
emqx_ctl webhooks list
插入
复制
重新生成