myiot.sql 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. /*
  2. Navicat Premium Dump SQL
  3. Source Server : 192.168.3.22
  4. Source Server Type : MySQL
  5. Source Server Version : 101106 (10.11.6-MariaDB-0+deb12u1)
  6. Source Host : localhost:3306
  7. Source Schema : myiot
  8. Target Server Type : MySQL
  9. Target Server Version : 101106 (10.11.6-MariaDB-0+deb12u1)
  10. File Encoding : 65001
  11. Date: 08/03/2025 03:15:55
  12. */
  13. SET NAMES utf8mb4;
  14. SET FOREIGN_KEY_CHECKS = 0;
  15. -- ----------------------------
  16. -- Table structure for authz_checks
  17. -- ----------------------------
  18. DROP TABLE IF EXISTS `authz_checks`;
  19. CREATE TABLE `authz_checks` (
  20. `id` int NOT NULL AUTO_INCREMENT,
  21. `client_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  22. `topic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  23. `action` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  24. `result` enum('allow','deny') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  25. `timestamp` datetime NOT NULL,
  26. PRIMARY KEY (`id`) USING BTREE
  27. ) ENGINE = InnoDB AUTO_INCREMENT = 55909 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  28. -- ----------------------------
  29. -- Table structure for devices
  30. -- ----------------------------
  31. DROP TABLE IF EXISTS `devices`;
  32. CREATE TABLE `devices` (
  33. `id` int NOT NULL AUTO_INCREMENT,
  34. `device_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  35. `room_id` int NULL DEFAULT NULL,
  36. `room_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '房间名称',
  37. `status` enum('online','offline') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'offline',
  38. `last_seen` datetime NULL DEFAULT NULL,
  39. `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  40. `temperature` decimal(5, 2) NULL DEFAULT NULL COMMENT '设备温度',
  41. `upload_time` datetime NULL DEFAULT NULL COMMENT '数据上传时间',
  42. `switch_status` enum('on','off') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '开关状态',
  43. `switch_status_time` datetime NULL DEFAULT NULL COMMENT '开关状态变化时间',
  44. `level_status` enum('high','low') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '高低电平状态',
  45. `level_status_time` datetime NULL DEFAULT NULL COMMENT '高低电平状态变化时间',
  46. `bound_device_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '绑定设备的ID',
  47. `bound_time` datetime NULL DEFAULT NULL COMMENT '绑定时间',
  48. `first_online_time` datetime NULL DEFAULT NULL COMMENT '第一次上线时间',
  49. `last_online_time` datetime NULL DEFAULT NULL COMMENT '最近一次上线时间',
  50. `last_offline_time` datetime NULL DEFAULT NULL COMMENT '最近一次离线时间',
  51. `ip_address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  52. `system_version` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'v1.0.0' COMMENT '系统版本',
  53. `firmware_version` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1.0.0',
  54. `last_upgrade_time` datetime NULL DEFAULT NULL,
  55. `upgrade_status` enum('pending','upgrading','completed','failed') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'pending',
  56. PRIMARY KEY (`id`) USING BTREE,
  57. UNIQUE INDEX `device_id`(`device_id` ASC) USING BTREE,
  58. INDEX `room_id`(`room_id` ASC) USING BTREE,
  59. CONSTRAINT `devices_ibfk_1` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
  60. ) ENGINE = InnoDB AUTO_INCREMENT = 2749 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  61. -- ----------------------------
  62. -- Table structure for error_logs
  63. -- ----------------------------
  64. DROP TABLE IF EXISTS `error_logs`;
  65. CREATE TABLE `error_logs` (
  66. `id` int NOT NULL AUTO_INCREMENT,
  67. `error_message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  68. `error_time` datetime NOT NULL,
  69. PRIMARY KEY (`id`) USING BTREE
  70. ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  71. -- ----------------------------
  72. -- Table structure for firmware_versions
  73. -- ----------------------------
  74. DROP TABLE IF EXISTS `firmware_versions`;
  75. CREATE TABLE `firmware_versions` (
  76. `id` int NOT NULL AUTO_INCREMENT,
  77. `version_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  78. `device_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  79. `release_date` datetime NOT NULL,
  80. `file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  81. `file_size` bigint NOT NULL,
  82. `is_signed` tinyint(1) NULL DEFAULT 0,
  83. `signature` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  84. `release_notes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
  85. `created_at` timestamp NULL DEFAULT current_timestamp,
  86. PRIMARY KEY (`id`) USING BTREE,
  87. UNIQUE INDEX `version_number`(`version_number` ASC) USING BTREE
  88. ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  89. -- ----------------------------
  90. -- Table structure for gpio_state
  91. -- ----------------------------
  92. DROP TABLE IF EXISTS `gpio_state`;
  93. CREATE TABLE `gpio_state` (
  94. `id` int NOT NULL AUTO_INCREMENT,
  95. `device_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  96. `state` enum('high','low') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  97. `timestamp` timestamp NULL DEFAULT current_timestamp,
  98. PRIMARY KEY (`id`) USING BTREE
  99. ) ENGINE = InnoDB AUTO_INCREMENT = 238 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  100. -- ----------------------------
  101. -- Table structure for heater_usage
  102. -- ----------------------------
  103. DROP TABLE IF EXISTS `heater_usage`;
  104. CREATE TABLE `heater_usage` (
  105. `id` int NOT NULL AUTO_INCREMENT,
  106. `device_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  107. `room_id` int NOT NULL COMMENT '关联房间ID',
  108. `room_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  109. `start_time` datetime NOT NULL,
  110. `end_time` datetime NULL DEFAULT NULL,
  111. `duration` int NULL DEFAULT 0 COMMENT '使用时长(秒)',
  112. `date` date NOT NULL COMMENT '统计日期',
  113. PRIMARY KEY (`id`) USING BTREE,
  114. INDEX `device_id`(`device_id` ASC) USING BTREE,
  115. INDEX `idx_room_date`(`room_id` ASC, `date` ASC) USING BTREE,
  116. CONSTRAINT `heater_usage_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `devices` (`device_id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  117. CONSTRAINT `heater_usage_ibfk_2` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
  118. ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  119. -- ----------------------------
  120. -- Table structure for relay_state
  121. -- ----------------------------
  122. DROP TABLE IF EXISTS `relay_state`;
  123. CREATE TABLE `relay_state` (
  124. `id` int NOT NULL AUTO_INCREMENT,
  125. `device_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  126. `state` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  127. `temperature` float NULL DEFAULT NULL,
  128. `room_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  129. `room_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  130. `timestamp` datetime NOT NULL,
  131. PRIMARY KEY (`id`) USING BTREE
  132. ) ENGINE = InnoDB AUTO_INCREMENT = 1002 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  133. -- ----------------------------
  134. -- Table structure for rooms
  135. -- ----------------------------
  136. DROP TABLE IF EXISTS `rooms`;
  137. CREATE TABLE `rooms` (
  138. `id` int NOT NULL AUTO_INCREMENT,
  139. `room_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  140. `floor` int NULL DEFAULT NULL,
  141. `orientation` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  142. `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
  143. PRIMARY KEY (`id`) USING BTREE,
  144. UNIQUE INDEX `room_name`(`room_name` ASC) USING BTREE
  145. ) ENGINE = InnoDB AUTO_INCREMENT = 38 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  146. -- ----------------------------
  147. -- Table structure for switch_status
  148. -- ----------------------------
  149. DROP TABLE IF EXISTS `switch_status`;
  150. CREATE TABLE `switch_status` (
  151. `id` int NOT NULL AUTO_INCREMENT,
  152. `device_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  153. `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  154. `timestamp` datetime NOT NULL,
  155. PRIMARY KEY (`id`) USING BTREE,
  156. INDEX `switch_status_ibfk_1`(`device_id` ASC) USING BTREE,
  157. CONSTRAINT `switch_status_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `devices` (`device_id`) ON DELETE CASCADE ON UPDATE CASCADE
  158. ) ENGINE = InnoDB AUTO_INCREMENT = 598 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  159. -- ----------------------------
  160. -- Table structure for users
  161. -- ----------------------------
  162. DROP TABLE IF EXISTS `users`;
  163. CREATE TABLE `users` (
  164. `id` int NOT NULL AUTO_INCREMENT,
  165. `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  166. `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  167. `created_at` timestamp NULL DEFAULT current_timestamp,
  168. PRIMARY KEY (`id`) USING BTREE,
  169. UNIQUE INDEX `username`(`username` ASC) USING BTREE
  170. ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  171. -- ----------------------------
  172. -- Procedure structure for ProcessHeaterUsage
  173. -- ----------------------------
  174. DROP PROCEDURE IF EXISTS `ProcessHeaterUsage`;
  175. delimiter ;;
  176. CREATE PROCEDURE `ProcessHeaterUsage`(IN p_device_id VARCHAR(255),
  177. IN p_event_time DATETIME,
  178. IN p_raw_id INT)
  179. BEGIN
  180. DECLARE v_room_id INT;
  181. DECLARE v_room_name VARCHAR(255);
  182. DECLARE v_device_status ENUM('online','offline');
  183. DECLARE v_switch_status ENUM('on','off');
  184. DECLARE v_temperature DECIMAL(5,2);
  185. -- 唯一的异常处理器声明
  186. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
  187. BEGIN
  188. INSERT INTO error_logs (error_message, error_time)
  189. VALUES (CONCAT('Heater usage processing failed for ', p_device_id), NOW());
  190. END;
  191. -- 获取设备最新状态
  192. SELECT
  193. d.room_id,
  194. d.room_name,
  195. d.status,
  196. d.switch_status,
  197. d.temperature
  198. INTO
  199. v_room_id,
  200. v_room_name,
  201. v_device_status,
  202. v_switch_status,
  203. v_temperature
  204. FROM devices d
  205. WHERE d.device_id = p_device_id
  206. LIMIT 1;
  207. -- 开启条件:在线、开关开启、温度>14
  208. IF v_device_status = 'online'
  209. AND v_switch_status = 'on'
  210. AND v_temperature > 14 THEN
  211. -- 检查是否存在未关闭记录
  212. IF NOT EXISTS (
  213. SELECT 1 FROM heater_usage
  214. WHERE device_id = p_device_id
  215. AND end_time IS NULL
  216. ) THEN
  217. INSERT INTO heater_usage (
  218. device_id,
  219. room_id,
  220. room_name,
  221. start_time,
  222. end_time,
  223. duration,
  224. date
  225. ) VALUES (
  226. p_device_id,
  227. v_room_id,
  228. v_room_name,
  229. p_event_time,
  230. NULL,
  231. 0,
  232. DATE(p_event_time - INTERVAL IF(HOUR(p_event_time) < 12, 1, 0) DAY)
  233. );
  234. END IF;
  235. -- 关闭条件:任意条件不满足时更新结束时间
  236. ELSE
  237. UPDATE heater_usage
  238. SET end_time = p_event_time,
  239. duration = TIMESTAMPDIFF(SECOND, start_time, p_event_time),
  240. -- 同步更新房间信息(设备可能更换房间)
  241. room_id = v_room_id,
  242. room_name = v_room_name
  243. WHERE device_id = p_device_id
  244. AND end_time IS NULL
  245. ORDER BY start_time DESC
  246. LIMIT 1;
  247. END IF;
  248. END
  249. ;;
  250. delimiter ;
  251. SET FOREIGN_KEY_CHECKS = 1;