安全(P0) - 发布包签名:新增 scripts/package_keygen.php、scripts/package_verify.php、 ywxapp\service\PackageVerifier;FrameworkService::apply() 解压前强制验签 (ywxapp.framework_package_verify,默认开启) - JWT 收紧:config/jwt.php 移除公开默认密钥,JwtService::assertStrongSecret() 校验非空 / 长度≥32 / 已知弱值;.env.production.example 键名由 JWT_SECRET_KEY 修正为 JWT_SECRET - /api/v1/Article:免登录白名单收窄为只读接口,写操作字段白名单 + assertOwner() 越权校验 - 开发者令牌:查找接口不再回显明文、统一失败文案 + 限流 - TemplateInstaller:文件名白名单 + realpath 归一化 + 目录内断言,修复 Zip Slip;补 use ZipArchive - 后台登录:接入验证码、失败锁定与登录限流(config/ratelimit.php) - 缓存 / Session 驱动可由 .env 覆盖(CACHE_DRIVER / SESSION_TYPE),集群部署改 redis - paycenter 支付日志开关改为 PAY_LOG,不再跟随 APP_DEBUG 工程化 / 交付 - 新增 CHANGELOG.md 与 .env.production.example;composer.lock 入库锁定依赖版本 - 插件离线安装 CLI 增加 --uid,后台上传安装透传 uid,付费插件授权校验可通过 - 授权拒绝文案区分「未携带 uid」与「未找到有效授权」,便于排障 - .gitignore 放行 .env.production.example / .env.addon.example / .gitattributes / public/.htaccess 结构 - appmall 由 addon/appmall 迁移为独立应用 app/appmall(市场 / 开发者中心 / 审核 / 分润)
361 lines
21 KiB
SQL
361 lines
21 KiB
SQL
-- ============================================================
|
||
-- addon/iot/install.sql —— iot 插件数据表
|
||
-- 框架约定:插件安装时由 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__iot_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__iot_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__iot_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__iot_auth` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`username` varchar(191) NOT NULL DEFAULT '' COMMENT '用户名',
|
||
`password` varchar(191) NOT NULL DEFAULT '' COMMENT '密码(bcrypt哈希,兼容明文)',
|
||
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属框架会员ID(0=非会员账号;会员直通时回填对应 member_user.id)',
|
||
`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__iot_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__iot_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__iot_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__iot_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__iot_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__iot_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手动发布出站队列(跨进程内部路由)';
|
||
|
||
-- 智能设备绑定表(华为式:后台预登记SN+配对码+激活令牌 → 设备入云激活领凭证 → 用户扫码+配对码绑定)
|
||
-- 绑定与激活分离:pair_code 机身贴纸防抢绑;activate_token 出厂预置一次性,设备 activate() 领取 uuid/secret
|
||
-- 连接约定:MQTT username=clientId=uuid,密码=secret(bcrypt)
|
||
-- Topic 规范:/devices/{uuid}/state 设备上报(影子,retain) / /devices/{uuid}/cmd 下发命令
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_device` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`sn` varchar(64) NOT NULL DEFAULT '' COMMENT '设备序列号(机身二维码内容,绑定凭证)',
|
||
`mac` varchar(32) NOT NULL DEFAULT '' COMMENT '设备MAC(去冒号小写,即插即用注册身份)',
|
||
`uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备连接用户名(clientId约定同值)',
|
||
`secret` varchar(191) NOT NULL DEFAULT '' COMMENT '连接密码(bcrypt哈希,明文仅激活/重置时返回一次)',
|
||
`pair_code` varchar(16) NOT NULL DEFAULT '' COMMENT '配对码(机身贴纸,绑定时校验防抢绑)',
|
||
`activate_token` varchar(64) NOT NULL DEFAULT '' COMMENT '入云激活令牌(一次性,设备出厂预置)',
|
||
`title` varchar(128) NOT NULL DEFAULT '' COMMENT '设备名称',
|
||
`model` varchar(64) NOT NULL DEFAULT '' COMMENT '产品型号',
|
||
`dev_type` varchar(64) NOT NULL DEFAULT '' COMMENT '设备类型(esp32c3_temp等,App据此渲染面板)',
|
||
`ver` varchar(32) NOT NULL DEFAULT '' COMMENT '固件版本(OTA检测/提示)',
|
||
`pins` varchar(64) NOT NULL DEFAULT '' COMMENT '总线GPIO表(CSV如3,4,10;下标=位置序号;设备上线时上报一次)',
|
||
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '绑定会员ID(0=未绑定)',
|
||
`room` varchar(64) NOT NULL DEFAULT '' COMMENT '房间/位置',
|
||
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0禁用',
|
||
`bind_at` int DEFAULT NULL COMMENT '绑定时间',
|
||
`create_at` int DEFAULT NULL,
|
||
`update_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_sn` (`sn`),
|
||
UNIQUE KEY `uk_mac` (`mac`),
|
||
UNIQUE KEY `uk_uuid` (`uuid`),
|
||
KEY `idx_member` (`member_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT智能设备绑定表';
|
||
|
||
-- 传感器位置配置表(配置真源:位置数/别名/探头数/上下限/gap 一律由服务端下发,不进 state 报文)
|
||
-- 三方一致:服务端(本表 + iot_device.cfg_ver) → retained /devices/{uuid}/config → 设备 NVS + config_ack → App 经 HTTP 读同一份
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_sensor_cfg` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`device_uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备uuid',
|
||
`pos_index` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '位置序号(OneWire总线A/B/C,0起)',
|
||
`alias` varchar(32) NOT NULL DEFAULT '' COMMENT '位置名称(如 进水/回水)',
|
||
`probes` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '该位置探头数(1~3)',
|
||
`upper` decimal(6,2) NOT NULL DEFAULT '85.00' COMMENT '超温上限(℃)',
|
||
`lower` decimal(6,2) NOT NULL DEFAULT '0.00' COMMENT '低温下限(℃)',
|
||
`gap` decimal(6,2) NOT NULL DEFAULT '0.00' COMMENT '位置内温差告警阈值(0=关闭)',
|
||
`enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用',
|
||
`create_at` int DEFAULT NULL,
|
||
`update_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_dev_pos` (`device_uuid`,`pos_index`),
|
||
KEY `idx_device` (`device_uuid`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='传感器位置配置表(配置真源)';
|
||
|
||
-- 设备共享表(华为式家庭授权:设备主人把设备共享给其他会员,按 perm 分级)
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_share` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`device_id` int unsigned NOT NULL DEFAULT '0' COMMENT '设备ID(iot_device.id)',
|
||
`owner_id` int unsigned NOT NULL DEFAULT '0' COMMENT '设备主人会员ID',
|
||
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '被共享会员ID',
|
||
`perm` tinyint(1) NOT NULL DEFAULT '2' COMMENT '1只读 2可控制',
|
||
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1生效 0撤销',
|
||
`create_at` int DEFAULT NULL,
|
||
`update_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_dev_member` (`device_id`, `member_id`),
|
||
KEY `idx_member` (`member_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT设备共享表';
|
||
|
||
-- 设备日志表(设备维度:状态上报/事件/下发命令留痕,智慧生活诊断与审计)
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_device_log` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备uuid',
|
||
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
|
||
`payload` longtext COMMENT '消息内容',
|
||
`direction` varchar(8) NOT NULL DEFAULT 'in' COMMENT 'in=设备上报 out=服务端下发',
|
||
`create_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_uuid` (`uuid`),
|
||
KEY `idx_create_at` (`create_at`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT设备日志表';
|
||
|
||
-- 告警记录表(设备离线/场景联动/OTA失败等推送与展示)
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_alert` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属会员',
|
||
`uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '关联设备uuid(可空)',
|
||
`pos_index` tinyint unsigned NOT NULL DEFAULT '255' COMMENT '传感器位置序号(255=不适用,如离线/场景告警)',
|
||
`type` varchar(32) NOT NULL DEFAULT '' COMMENT 'offline/scene/condition/custom',
|
||
`level` tinyint(1) NOT NULL DEFAULT '2' COMMENT '1提示 2警告 3严重',
|
||
`title` varchar(128) NOT NULL DEFAULT '' COMMENT '标题',
|
||
`content` varchar(512) NOT NULL DEFAULT '' COMMENT '内容',
|
||
`is_read` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0未读 1已读',
|
||
`create_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_member` (`member_id`),
|
||
KEY `idx_create_at` (`create_at`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT设备告警记录表';
|
||
|
||
-- OTA 固件版本表
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_ota` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`model` varchar(64) NOT NULL DEFAULT '' COMMENT '适用设备型号',
|
||
`version` varchar(32) NOT NULL DEFAULT '' COMMENT '版本号',
|
||
`filename` varchar(128) NOT NULL DEFAULT '' COMMENT '固件文件名',
|
||
`file_hash` varchar(64) NOT NULL DEFAULT '' COMMENT 'SHA256',
|
||
`size` int unsigned NOT NULL DEFAULT '0' COMMENT '字节数',
|
||
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '固件下载地址',
|
||
`remark` varchar(255) DEFAULT NULL COMMENT '备注/更新说明',
|
||
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1可下发 0停用',
|
||
`create_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_model` (`model`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT OTA固件版本表';
|
||
|
||
-- 设备分组表(房间/自定义分组)
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_group` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属会员(0=后台全局分组)',
|
||
`title` varchar(64) NOT NULL DEFAULT '' COMMENT '分组名',
|
||
`type` varchar(16) NOT NULL DEFAULT 'room' COMMENT 'room=房间 custom=自定义',
|
||
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
|
||
`create_at` int DEFAULT NULL,
|
||
`update_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_member` (`member_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT设备分组表';
|
||
|
||
-- 分组-设备关联表
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_group_device` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`group_id` int unsigned NOT NULL DEFAULT '0' COMMENT '分组ID',
|
||
`device_id` int unsigned NOT NULL DEFAULT '0' COMMENT '设备ID(iot_device.id)',
|
||
`create_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_group_device` (`group_id`,`device_id`),
|
||
KEY `idx_device` (`device_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT分组设备关联表';
|
||
|
||
-- 场景表(智慧生活:设备状态/定时/手动 三类触发器 → 动作组)
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`member_id` int unsigned NOT NULL DEFAULT '0' COMMENT '归属会员(0=后台全局场景)',
|
||
`title` varchar(64) NOT NULL DEFAULT '' COMMENT '场景名',
|
||
`icon` varchar(32) NOT NULL DEFAULT '' COMMENT '图标标识',
|
||
`enabled` 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`),
|
||
KEY `idx_member` (`member_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景表';
|
||
|
||
-- 场景触发器(device_state=设备状态/事件条件,schedule=定时cron,manual=手动)
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene_trigger` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`scene_id` int unsigned NOT NULL DEFAULT '0' COMMENT '场景ID',
|
||
`type` varchar(16) NOT NULL DEFAULT 'device_state' COMMENT 'device_state/schedule/manual',
|
||
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT 'device_state: 主题过滤器',
|
||
`condition_json` text COMMENT '条件JSON',
|
||
`cron` varchar(64) NOT NULL DEFAULT '' COMMENT 'schedule: 5段cron,如 0 8 * * *',
|
||
`enabled` tinyint(1) NOT NULL DEFAULT '1',
|
||
`create_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_scene` (`scene_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景触发器';
|
||
|
||
-- 场景动作(send_cmd=下发命令 http=HTTP回调 notify=站内告警)
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene_action` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`scene_id` int unsigned NOT NULL DEFAULT '0' COMMENT '场景ID',
|
||
`sort` int NOT NULL DEFAULT '0' COMMENT '执行顺序',
|
||
`type` varchar(16) NOT NULL DEFAULT 'send_cmd' COMMENT 'send_cmd/http/notify',
|
||
`device_uuid` varchar(64) NOT NULL DEFAULT '' COMMENT 'send_cmd: 目标设备',
|
||
`payload_json` text COMMENT 'send_cmd: 命令payload / http: 请求体',
|
||
`topic` varchar(255) NOT NULL DEFAULT '' COMMENT 'http: 回调URL / notify: 通知标题',
|
||
`create_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_scene` (`scene_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景动作';
|
||
|
||
-- 场景执行日志(命中/未命中留痕)
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_scene_log` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`scene_id` int unsigned NOT NULL DEFAULT '0' COMMENT '场景ID',
|
||
`trigger_type` varchar(16) NOT NULL DEFAULT '' COMMENT 'device_state/schedule/manual',
|
||
`matched` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1命中 0未命中',
|
||
`message` text COMMENT '命中摘要/失败原因',
|
||
`create_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_scene` (`scene_id`),
|
||
KEY `idx_create_at` (`create_at`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT场景执行日志';
|
||
|
||
-- 传感器结构化时序表(一行 = 一个位置的一次上报)
|
||
-- 与 iot_device_log 的分工:log 存原始报文(longtext) 供诊断审计;本表存解析后的数值,
|
||
-- 供曲线绘制、统计、云端阈值复核 —— longtext 里加不了数值索引,画不了曲线。
|
||
-- iv 必须存:设备是「事件驱动稀疏上报」,相邻两点可能隔几十秒,画图/统计须按 ts→ts+iv 前向填充。
|
||
-- 探头身份(ROM 短码)作为 vs_json 的 key,使换探头后仍能把同一颗探头的数据串起来。
|
||
CREATE TABLE IF NOT EXISTS `__PREFIX__iot_sensor_point` (
|
||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||
`uuid` varchar(64) NOT NULL DEFAULT '' COMMENT '设备uuid',
|
||
`pos_index` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '位置序号(0起)',
|
||
`ts` int unsigned NOT NULL DEFAULT '0' COMMENT '设备NTP秒(0=未对时,已取服务端接收时间)',
|
||
`iv` smallint unsigned NOT NULL DEFAULT '0' COMMENT '本条数据覆盖秒数(前向填充用)',
|
||
`t` decimal(6,2) DEFAULT NULL COMMENT '位置温度=有效探头均值',
|
||
`df` decimal(6,2) DEFAULT NULL COMMENT '位置内极差',
|
||
`v` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1=位置有有效读数',
|
||
`vs_json` varchar(255) NOT NULL DEFAULT '' COMMENT '逐探头明细 {"A3F2":25.6}',
|
||
`ok_mask` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '探头有效位图',
|
||
`alert_mask` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '云端复核告警位图(bit7=gap)',
|
||
`cfg_ver` int unsigned NOT NULL DEFAULT '0' COMMENT '上报时的配置版本',
|
||
`create_at` int DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_dev_pos_ts` (`uuid`,`pos_index`,`ts`),
|
||
KEY `idx_create_at` (`create_at`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='传感器结构化时序(曲线/统计/云端复核)';
|