本司设备联网管理平台——整理后实施基线

本文件是 本司设备联网管理.md 的实施副本。原文件未修改,SHA-256 为 85D8501A9A36C2F04B1A168DC23F4A70259B3F95B6C6AE5DFEF6BC307D6AEC8E。

CHANGED_BRANCH=stack-migration-spring-monolith
CHANGED_FIELD=technology_stack: vanilla_js_node_json -> vue3_typescript_springboot_mysql_redis_kafka_emqx

1. 本期目标

先交付本司设备联网管理 MVP,打通以下闭环:

  1. 管理员维护产品、设备、用户、指令、告警和审计记录。
  2. 设备通过 MQTT 连接 EMQX;EMQX 与 Kafka 桥接设备上下行消息。
  3. Spring Boot 后端只订阅和发布 Kafka Topic,不直接连接 MQTT。
  4. 用户通过微信小程序登录、绑定设备、查看本人设备和下发控制指令。
  5. MySQL 保存业务数据和当前阶段遥测,Redis 保存登录会话并承担热点缓存。

2. 技术基线

层次当前选择实施说明
管理后台Vue 3、TypeScript、Vite、Pinia、Vue Router响应式单页应用,统一调用 /api
后端Java 17、Spring Boot 3先做模块化单体,按领域边界组织代码
数据访问Spring Data JPA、FlywayMySQL 表结构版本化,启动时校验迁移
业务数据库MySQL用户、产品、设备、遥测、指令、告警、审计
登录与缓存Redisiot:session:{token} 会话校验;产品等热点查询缓存
设备消息Kafka后端只消费上行/ACK Topic,只发布下行 Topic
MQTT 服务EMQX负责设备 MQTT 连接、认证/ACL及 MQTT↔Kafka 桥接
用户端原生微信小程序登录、设备绑定、设备列表、详情和控制

所有中间件地址、凭证、TLS/SASL 参数和 Topic 名均由环境变量注入。收到实际地址文档后,只补部署配置,不修改业务代码中的连接逻辑。

3. 消息拓扑

设备 --MQTT--> EMQX --规则/桥接--> Kafka 上行主题 --消费--> Spring Boot 单体
设备 <--MQTT-- EMQX <--规则/桥接-- Kafka 下行主题 <--发布-- Spring Boot 单体
Kafka Topic方向消息用途
iot.device.telemetry.upEMQX → 后端属性/遥测上报
iot.device.event.upEMQX → 后端故障、告警等设备事件
iot.device.command.down后端 → EMQX设备控制指令
iot.device.command.ackEMQX → 后端指令执行回执

Kafka 按至少一次投递设计。遥测以 (deviceId, messageId) 幂等,指令以 commandId 关联 ACK;HTTP 请求成功只表示指令已进入下行链路,设备 ACK 才决定最终成功或失败。

4. 单体模块边界

模块当前职责后续拆分触发点
IAM后台/小程序登录、Redis 会话、角色权限多租户或统一身份中心接入
产品与物模型ProductKey、品类、协议、模型版本物模型版本数量和协作团队增长
设备注册、状态、归属、属性快照、绑定设备规模需要独立伸缩
消息接入Kafka 消费、校验、幂等、落库吞吐量或消费组需独立扩缩容
控制指令创建、发布、ACK 状态机下行可靠性策略独立演进
告警设备事件转告警、处置状态规则引擎和通知渠道增加
审计关键操作留痕集中日志/合规平台接入

单体阶段共享一个部署单元和 MySQL 实例,但禁止跨模块直接依赖控制器或数据库实现细节。微服务化时优先拆消息接入与遥测,再拆控制和告警;API、Kafka 事件、表归属和版本必须明确。

5. 当前功能范围

5.1 管理后台

  • 账号登录、退出和路由/角色守卫。
  • 仪表盘:设备、在线数、用户、待处理告警、当日指令。
  • 产品、设备、用户列表及产品/设备新增。
  • 设备详情、属性、指令下发。
  • 指令、告警和审计查询;告警处置。
  • 桌面与窄屏响应式布局。

5.2 Spring Boot 后端

  • Bearer Token 认证、管理员/运维/个人用户权限边界。
  • Redis 会话写入、读取、续期边界和退出删除。
  • Redis 产品查询缓存。
  • MySQL/JPA 实体、Repository 和 Flyway 初始化脚本。
  • 产品、设备、用户、指令、告警、审计 REST API。
  • Kafka 遥测/事件/ACK 消费与命令发布。
  • Actuator 健康、信息和指标端点。
  • 测试 profile 使用 H2、内存 SessionStore 和 Noop Kafka Publisher,不访问已部署中间件。

5.3 微信小程序

  • 微信登录接口封装和 Token 保存。
  • 扫码或输入绑定码绑定设备。
  • 仅查询当前用户拥有的设备。
  • 查看状态与属性,下发本人在线设备指令。
  • 登录失效统一清理会话并返回登录页。

6. 数据和状态约束

  • 产品 product_key、设备序列号和绑定码唯一。
  • 设备所有权查询必须同时校验当前用户和 owner_id。
  • 设备状态使用 ONLINE / OFFLINE。
  • 指令状态使用 PENDING → SENT → SUCCEEDED | FAILED | TIMEOUT | CANCELED。
  • 告警状态使用 OPEN / PROCESSING / RESOLVED。
  • 当前遥测写入 MySQL device_telemetry;后续可保持 Kafka 契约不变,将遥测模块迁往专用存储。

7. 配置待补项

实际中间件地址文档到位后,填写 backend/.env.example 对应部署环境变量:

  • MYSQL_URL / MYSQL_USERNAME / MYSQL_PASSWORD
  • REDIS_HOST / REDIS_PORT / REDIS_PASSWORD / REDIS_DATABASE
  • KAFKA_BOOTSTRAP_SERVERS / KAFKA_CONSUMER_GROUP
  • KAFKA_TOPIC_TELEMETRY_UP / EVENT_UP / COMMAND_DOWN / COMMAND_ACK
  • Kafka SASL/TLS 参数和证书挂载路径(若集群启用)
  • EMQX Bridge、规则名称、MQTT Topic 映射、设备认证和 ACL

EMQX_DASHBOARD_URL 仅用于运维信息。后端不得新增 MQTT 客户端来绕过 Kafka 桥接。

8. 目录与验证入口

物联网项目文档/
├─ 00~12、物联网项目文档.md、项目规划.md   整理后的文档集
└─ iot-platform-mvp/
   ├─ admin-web/      Vue 3 + TypeScript 管理后台
   ├─ backend/        Spring Boot 模块化单体
   └─ mini-program/   原生微信小程序
cd .\物联网项目文档\iot-platform-mvp\backend
.\mvnw.cmd clean test

cd ..\admin-web
npm run build

小程序使用微信开发者工具导入 mini-program。开发环境 API 默认指向 http://127.0.0.1:8080;实际联调时通过配置改为可访问的 HTTPS 地址。

9. 文档整理结果

  • 核心文档已统一为 00~12 编号和一致命名。
  • 已合并零散概念、重复需求、提问草稿和已过时的数据库选型内容。
  • 已删除 9 个不再单独维护的冗余文档/图;物模型关系图继续保留。
  • 架构、详细设计、测试、部署、用户、验收、API 和路线图均已改为当前 Vue/Spring/MySQL/Redis/Kafka/EMQX 基线。