-- ============================================================ -- addon/mqttbroker/install.sql —— mqttbroker 插件数据表 -- 框架约定:插件安装时由 ywxapp\service\AddonService 执行本文件 -- (仅允许 CREATE TABLE / INSERT,见 importsql 白名单)。 -- 表名须为 __PREFIX__<插件名>_*,与 __PREFIX__addon 等核心表命名一致。 -- 时间字段统一约定:create_at / update_at / delete_at -- ============================================================ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_connection` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `client_id` varchar(191) NOT NULL DEFAULT '' COMMENT 'MQTT客户端标识', `username` varchar(191) DEFAULT NULL COMMENT '用户名', `ip` varchar(64) DEFAULT NULL COMMENT '客户端IP', `status` tinyint(1) DEFAULT '1' COMMENT '1在线 0离线', `create_at` int DEFAULT NULL COMMENT '连接时间', `update_at` int DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_client_id` (`client_id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT客户端连接表'; CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_message` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `client_id` varchar(191) DEFAULT NULL COMMENT '发布者client_id', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题', `payload` longtext COMMENT '消息内容', `qos` tinyint(1) DEFAULT '0' COMMENT 'QoS等级', `retain` tinyint(1) DEFAULT '0' COMMENT '是否保留消息', `source` varchar(32) DEFAULT 'client' COMMENT '来源:client 客户端 / manual 后台手动', `create_at` int DEFAULT NULL COMMENT '时间', PRIMARY KEY (`id`), KEY `idx_topic` (`topic`), KEY `idx_create_at` (`create_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT消息日志表'; CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_topic` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `client_id` varchar(191) NOT NULL DEFAULT '' COMMENT '订阅者client_id', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '订阅主题(支持通配符)', `qos` tinyint(1) DEFAULT '0' COMMENT 'QoS等级', `create_at` int DEFAULT NULL COMMENT '订阅时间', PRIMARY KEY (`id`), KEY `idx_client_id` (`client_id`), KEY `idx_topic` (`topic`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT订阅关系表'; -- 认证账号表(allow_anonymous=0 或提供用户名时校验密码) CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_auth` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `username` varchar(191) NOT NULL DEFAULT '' COMMENT '用户名', `password` varchar(191) NOT NULL DEFAULT '' COMMENT '密码(bcrypt哈希,兼容明文)', `is_superuser` tinyint(1) NOT NULL DEFAULT '0' COMMENT '超级用户跳过ACL', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0禁用', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `create_at` int DEFAULT NULL, `update_at` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT认证账号表'; -- ACL 主题权限表(按 sort 顺序匹配,命中即决定 allow/deny) CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_acl` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `target_type` varchar(16) NOT NULL DEFAULT 'all' COMMENT 'all/user/client', `target` varchar(191) NOT NULL DEFAULT '' COMMENT '匹配值:用户名/clientid,all时忽略', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题过滤器,支持通配符与占位符%u %c', `access` tinyint(1) NOT NULL DEFAULT '3' COMMENT '1订阅 2发布 3两者', `allow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1允许 0拒绝', `sort` int NOT NULL DEFAULT '0' COMMENT '匹配优先级,越小越先', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_sort` (`sort`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT ACL权限表'; -- 保留消息持久化表(重启后恢复 retained) CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_retain` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题', `payload` longblob COMMENT '消息内容(二进制安全)', `qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级', `update_at` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_topic` (`topic`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT保留消息表'; -- 离线消息队列表(clean=false 会话离线期间的 QoS1/2 消息) CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_offline` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `client_id` varchar(191) NOT NULL DEFAULT '' COMMENT '目标订阅者client_id', `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题', `payload` longblob COMMENT '消息内容(二进制安全)', `qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_client_id` (`client_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT离线消息队列表'; -- 实时运行指标快照(Broker 周期写入单行 id=1,后台仪表盘轮询读取,跨进程安全) CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_stats` ( `id` int unsigned NOT NULL, `uptime` int DEFAULT '0' COMMENT '运行时长(秒)', `clients_online` int DEFAULT '0' COMMENT '在线连接数', `clients_total` int DEFAULT '0' COMMENT '累计会话数', `subscriptions` int DEFAULT '0' COMMENT '订阅关系数', `messages_received` int DEFAULT '0' COMMENT '累计接收消息数', `messages_sent` int DEFAULT '0' COMMENT '累计发送消息数', `retained` int DEFAULT '0' COMMENT '保留消息数', `timestamp` int DEFAULT '0' COMMENT '快照时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT实时运行指标快照'; -- 转发规则表(规则引擎:匹配源主题后转发到外部 Broker,如 EMQX) CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_rule` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `name` varchar(191) NOT NULL DEFAULT '' COMMENT '规则名称', `source_filter` varchar(255) NOT NULL DEFAULT '' COMMENT '源主题过滤器(支持通配符 + #)', `target_type` varchar(16) NOT NULL DEFAULT 'mqtt' COMMENT '转发目标类型:mqtt', `target_broker` varchar(255) NOT NULL DEFAULT '' COMMENT '外部Broker地址 host:port', `target_clientid` varchar(191) DEFAULT '' COMMENT '连接外部Broker的clientId(可选)', `target_username` varchar(191) DEFAULT '' COMMENT '外部Broker用户名(可选)', `target_password` varchar(191) DEFAULT '' COMMENT '外部Broker密码(可选)', `target_topic` varchar(255) NOT NULL DEFAULT '' COMMENT '转发目标主题,支持 ${topic} 变量', `target_qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT '转发QoS', `enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `create_at` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_enabled` (`enabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT转发规则(规则引擎)'; -- 手动发布出站队列(后台/API 发布经 DB 出栈,Broker 消费后内部路由,零外部依赖) CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_outbox` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题', `payload` longblob COMMENT '消息内容(二进制安全)', `qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级', `retain` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否保留', `source` varchar(32) DEFAULT 'manual' COMMENT '来源: manual/api/admin', `create_at` int DEFAULT NULL, `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0待投递 1已投递', PRIMARY KEY (`id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT手动发布出站队列(跨进程内部路由)';