# 设备接入服务 (Device Access Service) ## 项目简介 设备接入服务(DAS) 是一个基于 Java Spring Boot 技术栈构建的雷达设备接入平台,采用领域驱动设计(DDD)思想,旨在为不同类型的雷达设备提供统一的、可扩展的接入方案。服务通过 MQTT 协议与设备进行通信,实现设备信息上报、状态监控、跌倒检测、点云数据处理等功能。 ## 项目架构 本项目遵循领域驱动设计(DDD)的分层架构,具体划分为: - **应用层** (device-service-application): 负责协调领域服务,处理应用级别的业务逻辑,如设备命令处理、事件协调和数据转换。 - **领域层** (device-service-domain): 项目的核心,包含了所有业务核心逻辑,如设备实体、点云处理、姿态识别、领域服务和仓储接口。 - **基础设施层** (device-service-infrastructure): 提供技术实现,如数据库访问、MQTT消息处理、第三方服务接口的实现。 - **通用层** (device-service-common): 包含跨模块的通用类,如常量定义、DTO对象、工具类和配置。 - **客户端启动器** (device-service-client-starter): 为其他服务提供与本服务交互的Feign客户端。 - **服务启动** (device-service-server): Spring Boot应用的入口,负责组装和启动整个服务。 - **Python参考服务** (das): 用于对比和验证的Python版本实现,提供与Java服务等价的功能逻辑。 ### 架构依赖图 ```mermaid graph TD; subgraph "应用层 Application" A["device-service-application"] A1["controller
Web/WAP控制器"] A2["service
应用服务层"] A21["DeviceCommandService"] A22["DeviceEventService"] A3["convert
数据转换器"] A4["dto
数据传输对象"] A5["task
定时任务"] A -- 包含 --> A1 & A2 & A3 & A4 & A5 A2 -- 包含 --> A21 & A22 end subgraph "领域层 Domain" B["device-service-domain"] B1["entity
领域实体"] B11["Device
设备实体"] B12["AlarmPlan
告警计划"] B13["BehaviorPattern
行为模式"] B2["service
领域服务"] B21["PointCloudProcessService
点云处理服务"] B22["AlarmService
告警服务"] B23["DeviceService
设备服务"] B3["port/gateway
端口接口"] B31["DeviceEventPort
设备事件端口"] B32["DeviceGateway
设备网关"] B33["MqttGateway
MQTT网关"] B4["event
领域事件"] B41["DeviceEvent
设备事件"] B42["FallEvent
跌倒事件"] B5["vo
值对象"] B51["PoseAnalysisResult
姿态分析结果"] B52["TargetPoint
目标点"] B -- 包含 --> B1 & B2 & B3 & B4 & B5 B1 -- 包含 --> B11 & B12 & B13 B2 -- 包含 --> B21 & B22 & B23 B3 -- 包含 --> B31 & B32 & B33 B4 -- 包含 --> B41 & B42 B5 -- 包含 --> B51 & B52 end subgraph "基础设施层 Infrastructure" C["device-service-infrastructure"] C1["gateway/impl
网关实现"] C11["DeviceGatewayImpl"] C12["MqttGatewayImpl"] C2["mqtt
MQTT消息处理"] C21["DeviceMessageHandler
设备消息处理器"] C22["AppMessageHandler
应用消息处理器"] C23["MpsMessageHandler
小程序消息处理器"] C24["OpcMessageHandler
运维消息处理器"] C25["MqttHandlerImpl
统一消息路由"] C3["config
配置管理"] C31["MqttConfig
MQTT配置"] C32["RedisConfig
Redis配置"] C4["mapper
数据映射"] C5["service
基础服务"] C -- 包含 --> C1 & C2 & C3 & C4 & C5 C1 -- 包含 --> C11 & C12 C2 -- 包含 --> C21 & C22 & C23 & C24 & C25 C3 -- 包含 --> C31 & C32 end subgraph "通用层 Common" D["device-service-common"] D1["constant
常量定义"] D11["MqttTopics
MQTT主题"] D12["DeviceErrorCode
设备错误码"] D2["dto
数据传输对象"] D21["DeviceDTO
设备DTO"] D22["EventDTO
事件DTO"] D3["util
工具类"] D31["PointCloudUtil
点云工具"] D32["JsonUtil
JSON工具"] D4["enums
枚举"] D41["ModelType
模型类型"] D42["PoseType
姿态类型"] D5["annotation
注解"] D51["MqttSubscriber
MQTT订阅注解"] D -- 包含 --> D1 & D2 & D3 & D4 & D5 D1 -- 包含 --> D11 & D12 D2 -- 包含 --> D21 & D22 D3 -- 包含 --> D31 & D32 D4 -- 包含 --> D41 & D42 D5 -- 包含 --> D51 end subgraph "客户端启动器 Client" E["device-service-client-starter"] E1["feign
Feign客户端"] E11["TokenFacadeFeign
令牌服务客户端"] E12["LogLoginFacadeFeign
登录日志客户端"] end subgraph "Python参考服务" P["das"] P1["mqtt_recv.py
消息接收处理"] P2["mqtt_send.py
消息发送处理"] P3["dev_mng.py
设备管理"] P4["mydef.py
核心定义和工具"] P -- 包含 --> P1 & P2 & P3 & P4 end %% 模块间依赖关系 A --> B & D C --> B & D B --> D E --> D %% 接口与实现关系 C11 --. 实现 .-> B32 C12 --. 实现 .-> B33 A21 --. 实现 .-> B31 %% 业务调用流 C2 --. 调用 .-> A2 A2 --. 调用 .-> B2 A2 --. 调用 .-> B3 %% Python与Java功能映射 P1 --. 功能映射 .-> C2 P2 --. 功能映射 .-> C12 P3 --. 功能映射 .-> C11 P4 --. 功能映射 .-> D3 ``` ### 核心组件详解 #### 1. 领域层核心组件 - **设备实体 (Device)**: 领域层的核心实体,封装了设备的所有属性和行为,包括设备状态、位置信息、参数配置等。 - **点云处理服务 (PointCloudProcessService)**: 负责处理雷达设备上报的点云数据,实现目标检测、姿态识别等核心算法。 - **领域服务/端口**: `DeviceEventPort` 定义了设备事件处理的核心业务逻辑接口,确保业务逻辑的纯粹性。 - **网关接口**: `DeviceGateway` 与 `MqttGateway` 定义了与外部系统(如数据库、MQTT Broker)交互的抽象接口。 #### 2. MQTT消息处理架构 - **消息路由 (MqttHandlerImpl)**: 统一的MQTT消息入口,根据主题将消息分发给对应的处理器。 - **专用消息处理器**: - `DeviceMessageHandler`: 处理设备上行消息(设备信息上报、心跳、状态等) - `AppMessageHandler`: 处理应用下行消息(设备绑定、参数设置等) - `MpsMessageHandler`: 处理小程序服务消息 - `OpcMessageHandler`: 处理运维客户端消息 - **Spring Integration集成**: 通过`MqttConfig`配置实现与MQTT Broker的连接和消息订阅。 #### 3. 点云数据处理流程 1. **数据接收**: 设备通过MQTT上报点云数据到`/dev/{deviceId}/cloudpoint`主题 2. **数据解析**: `DeviceMessageHandler`解析消息并提取点云坐标信息 3. **目标检测**: `PointCloudProcessService.getTrackerTargets()`计算目标位置 4. **姿态识别**: 基于点云高度分布和空间特征识别人员姿态 5. **事件处理**: 检测跌倒等异常事件并触发告警 ### 模块依赖关系 遵循DDD的依赖原则,模块间的依赖关系清晰明确: - **应用层**依赖领域层和通用层,负责协调业务流程 - **基础设施层**依赖领域层和通用层,提供技术实现 - **领域层**仅依赖通用层,保持业务逻辑的纯粹性 - **客户端启动器**依赖通用层,提供对外服务接口 这种单向依赖关系保证了领域模型的独立性,使其不受技术实现细节的污染。 ### MQTT消息处理流程 1. **消息接收**: 基础设施层的 `MqttConfig` 配置了Spring Integration的 `MqttPahoMessageDrivenChannelAdapter`,负责订阅MQTT主题并将消息推送到指定的 `MessageChannel`。 2. **消息路由**: `MqttHandlerImpl` 作为统一的入口,根据消息主题模式匹配将其分发给对应的 `MessageHandler`。 3. **业务处理**: 各个 `MessageHandler` 调用应用层的服务(如 `DeviceEventService`)来执行具体的业务逻辑。 4. **领域执行**: 应用层服务委托领域对象和领域服务完成核心业务,并通过网关接口与外部系统交互。 这个流程实现了技术关注点(MQTT通信)与业务关注点(设备事件处理)的完全分离。 ## 项目结构说明 ``` hfln-device-service/ ├── device-service-application/ # 应用层 │ ├── controller/ # Web控制器 │ │ ├── web/ # Web端控制器 │ │ └── wap/ # 移动端控制器 │ ├── service/ # 应用服务 │ │ └── impl/ # 服务实现 │ ├── convert/ # 数据转换器 │ ├── dto/ # 数据传输对象 │ └── task/ # 定时任务 ├── device-service-domain/ # 领域层 │ ├── entity/ # 领域实体 │ ├── service/ # 领域服务 │ │ └── impl/ # 服务实现 │ ├── port/ # 端口接口 │ ├── gateway/ # 网关接口 │ ├── event/ # 领域事件 │ ├── vo/ # 值对象 │ ├── constant/ # 领域常量 │ └── exception/ # 领域异常 ├── device-service-infrastructure/ # 基础设施层 │ ├── gateway/impl/ # 网关实现 │ ├── mqtt/ # MQTT消息处理 │ │ ├── handler/ # 消息处理器 │ │ └── MqttHandlerImpl.java # 消息路由实现 │ ├── config/ # 配置管理 │ ├── mapper/ # 数据映射 │ ├── po/ # 持久化对象 │ └── service/ # 基础服务 ├── device-service-common/ # 通用模块 │ ├── constant/ # 常量定义 │ ├── dto/ # 通用DTO │ ├── util/ # 工具类 │ ├── enums/ # 枚举类型 │ ├── annotation/ # 自定义注解 │ ├── request/ # 请求对象 │ └── vo/ # 值对象 ├── device-service-client-starter/ # 客户端启动器 │ └── api/feign/ # Feign客户端 ├── device-service-server/ # 服务启动模块 │ ├── config/ # 启动配置 │ ├── controller/ # 监控控制器 │ └── DeviceApplication.java # 主启动类 ├── das/ # Python参考服务 │ ├── mqtt_recv.py # 消息接收处理 │ ├── mqtt_send.py # 消息发送处理 │ ├── dev_mng.py # 设备管理 │ └── mydef.py # 核心定义 ├── .gitignore # Git忽略配置 ├── Dockerfile # Docker构建文件 ├── Jenkinsfile # Jenkins CI/CD 流水线 ├── pom.xml # Maven项目根配置 └── README.md # 项目说明文档 ``` ## 核心功能特性 ### 1. 设备接入管理 - 支持多种类型雷达设备的统一接入 - 设备注册、认证和状态管理 - 设备参数配置和远程控制 ### 2. 点云数据处理 - 实时点云数据接收和解析 - 目标检测和跟踪算法 - 基于numpy算法等价的Java实现 ### 3. 姿态识别 - 基于点云数据的人员姿态识别 - 支持站立、坐下、躺下、跌倒等多种姿态 - 实时姿态状态监控和历史记录 ### 4. 跌倒检测告警 - 实时跌倒事件检测 - 告警计划配置和管理 - 多渠道告警通知(MQTT、短信等) ### 5. 多端接口支持 - Web端管理界面接口 - 移动端WAP接口 - 小程序服务接口 - 运维客户端接口 ## MQTT通信协议 ### MQTT配置 MQTT服务的连接配置信息位于 `device-service-server` 模块的 `application.yml` 文件中: ```yaml mqtt: server: uri: tcp://8.130.28.21:1883 client: id: device-service- username: admin password: public connect: timeout: 30 keep: alive: interval: 60 clean: session: true ``` ### MQTT主题规范 项目采用层次化的MQTT主题设计: #### 设备上行主题 (Device → Server) - **设备信息上报**: `/dev/{deviceId}/report_device_info` - **设备心跳**: `/dev/{deviceId}/keepalive` - **设备状态上报**: `/dev/{deviceId}/report_status` - **设备参数上报**: `/dev/{deviceId}/report_param` - **点云数据上报**: `/dev/{deviceId}/cloudpoint` - **跌倒事件上报**: `/dev/{deviceId}/report_fall` - **实时数据上报**: `/dev/{deviceId}/dsp_data` #### 应用下行主题 (Server → Device) - **DAS服务消息**: `/das/{messageType}` - **小程序服务消息**: `/mps/{messageType}` - **运维客户端消息**: `/opc/{messageType}` #### 具体消息主题 - **设备状态变更**: `/das/dev_status` - **实时位置姿态**: `/das/realtime_pos` - **跌倒事件通知**: `/das/event` - **告警事件**: `/das/alarm_event` - **设备绑定**: `/mps/bind_device` - **设备解绑**: `/mps/unbind_device` - **参数设置**: `/mps/set_device_param` ### 消息格式规范 #### 点云数据消息格式 ```json { "device_id": "设备ID", "timestamp": 1234567890000, "cloud_points": [ [x1, y1, z1], [x2, y2, z2], ... ], "tracker_targets": [ [x, y, z] ] } ``` #### 跌倒事件消息格式 ```json { "device_id": "设备ID", "timestamp": 1234567890000, "event_type": "fall_detected", "target_position": [x, y, z], "confidence": 0.95 } ``` ## 开发和测试 ### 开发环境要求 - Java 8+ - Maven 3.6+ - Spring Boot 2.x - Redis (用于缓存) - MySQL (用于数据持久化) - MQTT Broker (Eclipse Mosquitto 推荐) ### 运行测试 ```bash # 运行所有测试 mvn test # 运行指定的测试类 mvn test -Dtest="com.hfln.device.infrastructure.config.MqttConfigTest" # 运行MQTT集成测试 mvn test -Dtest="com.hfln.device.infrastructure.mqtt.*Test" ``` ### 代码质量检查 ```bash # 编译检查 mvn clean compile # 依赖分析 mvn dependency:analyze # 代码覆盖率 mvn jacoco:report ``` ## 部署指南 ### 本地开发部署 ```bash # 编译打包 mvn clean package # 运行服务 java -jar device-service-server/target/device-service-server-1.0.0-SNAPSHOT.jar ``` ### Docker部署 ```bash # 构建镜像 docker build -t device-service:latest . # 运行容器 docker run -d -p 8080:8080 --name device-service device-service:latest ``` ### 生产环境部署 1. **环境配置**: 修改 `application-prod.yml` 配置文件 2. **数据库初始化**: 执行 `src/main/resources/db/migration/` 下的SQL脚本 3. **服务启动**: 使用 `systemd` 或 `supervisor` 管理服务进程 4. **监控配置**: 配置 Prometheus + Grafana 监控告警 ## 性能优化 ### 点云数据处理优化 - 采用流式处理减少内存占用 - 使用对象池技术复用临时对象 - 异步处理非关键路径逻辑 ### MQTT消息处理优化 - 消息处理器并行化处理 - 基于主题的消息路由优化 - 连接池和会话管理 ### 数据库访问优化 - 使用MyBatis Plus提升开发效率 - 合理使用缓存策略 - 数据库连接池调优 ## 监控和运维 ### 应用监控 - Spring Boot Actuator健康检查 - 自定义业务指标收集 - JVM性能监控 ### 日志管理 - 结构化日志输出 - 分级别日志配置 - 日志轮转和归档策略 ### 告警配置 - 服务可用性告警 - 业务异常告警 - 性能指标告警 --- ## 贡献指南 ### 代码规范 - 遵循阿里巴巴Java开发手册 - 使用统一的代码格式化配置 - 编写完整的单元测试 ### 提交规范 - 使用语义化提交信息 - 分支命名规范:`feature/功能名称`、`bugfix/问题描述` - Pull Request必须通过代码审查 ### 文档维护 - 及时更新API文档 - 维护架构设计文档 - 记录重要变更日志 如有问题或建议,请提交Issue或联系开发团队。