Files
app-api/.qoder/repowiki/zh/content/API 接口文档/设备管理接口.md
T
yangy 665397ede7 feat(ota): 增强设备管理与OTA功能模块
- 新增OTA固件升级处理器,支持固件升级请求及黑名单过滤
- 引入设备持久化仓储,支持设备信息上报与活动记录
- 扩展数据模型,新增UserDevice与UserActive,支持设备版本跟踪
- 实现Redis到MySQL的异步数据同步任务
- 更新路由配置,集成新的API端点以支持OTA功能
- 优化架构图,反映新增的数据流与处理流程
2026-05-31 09:52:11 +08:00

22 KiB

设备管理接口

**本文引用的文件** - [internal/handler/device.go](file://internal/handler/device.go) - [internal/router/router.go](file://internal/router/router.go) - [internal/cache/redis.go](file://internal/cache/redis.go) - [internal/config/redis.go](file://internal/config/redis.go) - [internal/config/database.go](file://internal/config/database.go) - [internal/database/mysql.go](file://internal/database/mysql.go) - [internal/model/user_device.go](file://internal/model/user_device.go) - [internal/model/user_active.go](file://internal/model/user_active.go) - [internal/repository/device.go](file://internal/repository/device.go) - [internal/task/device_persist.go](file://internal/task/device_persist.go) - [internal/response/response.go](file://internal/response/response.go) - [internal/middleware/logger.go](file://internal/middleware/logger.go) - [internal/middleware/cors.go](file://internal/middleware/cors.go) - [cmd/server/main.go](file://cmd/server/main.go) - [sql/user_device.sql](file://sql/user_device.sql) - [sql/user_active.sql](file://sql/user_active.sql) - [README.md](file://README.md)

更新摘要

变更内容

  • 新增设备信息持久化系统,实现Redis到数据库的定时同步
  • 添加DevicePersistTask组件,支持设备注册和活动跟踪的数据库持久化
  • 新增数据库表user_device和user_active的完整数据结构
  • 实现每5分钟的批量数据同步机制
  • 增强数据一致性保证和错误处理机制

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构概览
  5. 详细组件分析
  6. 数据库持久化系统
  7. 依赖关系分析
  8. 性能考虑
  9. 故障排除指南
  10. 结论

简介

本文档详细描述了设备管理接口的完整规范,特别是设备信息上报接口。该接口允许设备向服务器上报其基本信息,包括 MAC 地址、型号、版本号等,并将数据存储在 Redis 缓存中。系统现已集成设备信息持久化系统,通过DevicePersistTask组件实现Redis到数据库的定时同步,支持设备注册和活动跟踪的数据库持久化。

文档涵盖了 HTTP 方法、URL 模式、请求参数结构、响应格式、错误处理、数据验证规则、重复上报处理和数据一致性保证等方面。

项目结构

该项目采用分层架构设计,主要分为以下层次:

  • 入口层: cmd/server/main.go - 应用程序入口点,负责初始化配置、数据库连接、搜索引擎和缓存客户端
  • 路由层: internal/router/router.go - 路由定义和中间件配置
  • 处理器层: internal/handler/device.go - 设备信息上报业务逻辑
  • 任务层: internal/task/device_persist.go - 设备信息持久化任务
  • 缓存层: internal/cache/redis.gointernal/config/redis.go - Redis 客户端配置和连接管理
  • 数据库层: internal/config/database.gointernal/database/mysql.go - 数据库配置和连接管理
  • 模型层: internal/model/user_device.gointernal/model/user_active.go - 数据库模型定义
  • 仓库层: internal/repository/device.go - 数据访问层
  • 响应层: internal/response/response.go - 统一响应格式
  • 中间件层: internal/middleware/logger.gointernal/middleware/cors.go - 日志记录和跨域支持
graph TB
subgraph "应用入口"
Main[cmd/server/main.go]
end
subgraph "HTTP框架"
Gin[Gin Web框架]
Router[路由层]
Middleware[中间件层]
end
subgraph "业务处理"
DeviceHandler[设备处理器]
DevicePersistTask[设备持久化任务]
Response[响应层]
end
subgraph "数据存储"
Redis[Redis缓存]
MySQL[MySQL数据库]
Config[配置管理]
end
subgraph "数据模型"
UserDevice[用户设备模型]
UserActive[用户活跃模型]
Repository[数据访问层]
end
Main --> Gin
Gin --> Router
Router --> Middleware
Router --> DeviceHandler
DeviceHandler --> Response
DeviceHandler --> Redis
DevicePersistTask --> MySQL
DevicePersistTask --> Redis
DevicePersistTask --> Repository
Repository --> UserDevice
Repository --> UserActive
Main --> Config
Main --> Redis
Main --> MySQL

图表来源

章节来源

核心组件

设备信息上报接口

设备信息上报接口是本项目的核心功能,负责接收设备上报的信息并进行处理。该接口实现了以下关键功能:

  • 参数验证: 对必需参数进行验证,确保数据完整性
  • 数据格式化: 将设备信息转换为统一的 JSON 格式
  • 缓存存储: 使用 Redis Hash 结构存储设备信息
  • 错误处理: 提供统一的错误响应格式

设备持久化任务

新增的设备持久化任务组件负责将Redis中的设备信息定期同步到数据库中,实现数据的长期持久化存储。该组件具有以下特点:

  • 定时同步: 每5分钟自动执行一次数据同步
  • 批量处理: 支持批量读取和处理Redis中的设备数据
  • 事务保证: 确保数据库操作的一致性
  • 错误恢复: 具备完善的错误处理和日志记录机制

接口规范

HTTP 请求规范

  • 方法: GET
  • 路径: /audio/reportDevInfo
  • 协议: HTTP/1.1
  • 内容类型: application/x-www-form-urlencoded

请求参数

参数名 类型 必填 描述 示例
mac string 设备 MAC 地址 00:1A:2B:3C:4D:5E
model string 设备型号 ES900
ver string 设备版本号 v2.1.0

请求头

头部名称 描述 示例
X-Forwarded-For 客户端真实 IP 地址 192.168.1.100

响应格式

接口返回统一的 JSON 格式响应:

{
  "code": 200,
  "msg": "操作成功"
}

错误响应

当请求参数无效或系统发生错误时,接口返回相应的错误码:

状态码 错误码 描述 响应示例
200 400 参数校验失败 {"code": 400, "msg": "参数校验失败"}
200 500 系统错误 {"code": 500, "msg": "系统错误"}

章节来源

架构概览

设备管理接口在整个系统架构中的位置如下:

sequenceDiagram
participant Client as 设备客户端
participant API as API网关
participant Handler as 设备处理器
participant Redis as Redis缓存
participant Task as 持久化任务
participant DB as MySQL数据库
participant Logger as 日志系统
Client->>API : GET /audio/reportDevInfo?mac=&model=&ver=
API->>Handler : 调用 ReportDevInfo()
Handler->>Handler : 参数验证
alt 参数验证失败
Handler->>Client : 返回错误响应
else 参数验证成功
Handler->>Handler : 格式化设备信息
Handler->>Redis : HSET devices {mac} : {json_data}
alt Redis操作失败
Handler->>Logger : 记录错误日志
Handler->>Client : 返回系统错误
else Redis操作成功
Handler->>Client : 返回成功响应
end
end
Note over Task,DB : 每5分钟定时执行
Task->>Redis : HGetAll devices
Task->>Task : 解析JSON数据
Task->>DB : 插入/更新 user_device
Task->>DB : 插入/更新 user_active
Task->>Redis : HDel 成功记录
Task->>Logger : 记录同步结果

图表来源

详细组件分析

设备处理器类图

classDiagram
class DeviceHandler {
-redis : redis.Client
-log : zap.Logger
+NewDeviceHandler(redis, log) DeviceHandler
+ReportDevInfo(c) void
}
class DevicePersistTask {
-rdb : redis.Client
-repo : DeviceRepository
-log : zap.Logger
+NewDevicePersistTask(rdb, repo, log) DevicePersistTask
+Start(interval) void
+Persist() void
+persistDevice(ctx, info) bool
+persistActive(ctx, info) bool
}
class RedisClient {
+HSet(ctx, key, field, value) error
+HGetAll(ctx, key) map[string]string
+HDel(ctx, key, fields) error
+Close() error
}
class Logger {
+Info(message, fields) void
+Error(message, error) void
}
DeviceHandler --> RedisClient : 使用
DeviceHandler --> Logger : 记录日志
DevicePersistTask --> RedisClient : 读取数据
DevicePersistTask --> Logger : 记录日志

图表来源

参数验证流程

设备信息上报接口的参数验证流程如下:

flowchart TD
Start([开始处理请求]) --> GetParams["获取查询参数<br/>mac, model, ver"]
GetParams --> TrimParams["去除空白字符"]
TrimParams --> ValidateMac{"mac是否为空?"}
ValidateMac --> |是| ReturnError["返回参数校验失败"]
ValidateMac --> |否| ValidateModel{"model是否为空?"}
ValidateModel --> |是| ReturnError
ValidateModel --> |否| CheckVer{"ver是否为空?"}
CheckVer --> |是| SetEmptyVer["设置ver为空字符串"]
CheckVer --> |否| GetIP["获取X-Forwarded-For头部"]
SetEmptyVer --> GetIP
GetIP --> LogInfo["记录日志信息"]
LogInfo --> FormatData["格式化设备信息"]
FormatData --> MarshalJSON["序列化为JSON"]
MarshalJSON --> JSONSuccess{"JSON序列化成功?"}
JSONSuccess --> |否| ReturnSystemError["返回系统错误"]
JSONSuccess --> |是| SaveToRedis["保存到Redis"]
SaveToRedis --> RedisSuccess{"Redis操作成功?"}
RedisSuccess --> |否| ReturnSystemError
RedisSuccess --> |是| ReturnSuccess["返回成功响应"]
ReturnError --> End([结束])
ReturnSystemError --> End
ReturnSuccess --> End

图表来源

Redis 缓存交互

设备信息上报接口使用 Redis Hash 结构存储设备数据:

  • 键名: devices
  • 字段: 设备 MAC 地址
  • : JSON 格式的设备信息对象

存储的数据结构示例:

{
  "mac_addr": "00:1A:2B:3C:4D:5E",
  "model": "ES900",
  "active_date": "2024-01-15",
  "ip_addr": "192.168.1.100",
  "ver": "v2.1.0"
}

章节来源

中间件集成

系统集成了多个中间件来增强功能:

日志中间件

  • 记录每个请求的状态、方法、路径、延迟时间
  • 区分不同级别的日志输出
  • 包含请求 ID 和错误信息

CORS 中间件

  • 支持跨域请求
  • 允许的方法:GET, POST, PUT, PATCH, DELETE, OPTIONS
  • 允许的头部:Origin, Content-Type, Accept, Authorization, X-Request-ID

章节来源

数据库持久化系统

设备持久化任务架构

新增的设备持久化任务系统实现了Redis到数据库的定时同步,确保设备信息的长期持久化存储。

flowchart TD
Start([启动持久化任务]) --> Timer["5分钟定时器"]
Timer --> GetData["从Redis读取所有设备数据"]
GetData --> ParseData["解析JSON数据"]
ParseData --> FixDate["修复日期格式"]
FixDate --> ProcessDevice["处理设备信息"]
ProcessDevice --> ProcessActive["处理活跃信息"]
ProcessActive --> Success{"处理成功?"}
Success --> |是| BatchDelete["批量删除已处理记录"]
Success --> |否| LogError["记录错误日志"]
BatchDelete --> Complete["完成同步"]
LogError --> Complete
Complete --> Timer

图表来源

数据库表结构

用户设备表 (user_device)

字段名 类型 约束 描述
id int PRIMARY KEY, AUTO_INCREMENT 主键ID
mac_addr varchar(255) UNIQUE, NOT NULL 设备MAC地址
model varchar(255) NOT NULL 设备型号
add_time datetime DEFAULT CURRENT_TIMESTAMP 添加时间
ver varchar(10) NULL 设备版本号

用户活跃表 (user_active)

字段名 类型 约束 描述
id int PRIMARY KEY, AUTO_INCREMENT 主键ID
mac_addr varchar(100) NOT NULL 设备MAC地址
model varchar(50) NOT NULL 设备型号
active_date date NOT NULL 活跃日期
ip_addr varchar(100) NOT NULL IP地址
create_at datetime DEFAULT CURRENT_TIMESTAMP 创建时间

章节来源

数据同步流程

设备持久化任务的数据同步流程如下:

sequenceDiagram
participant Redis as Redis缓存
participant Task as 持久化任务
participant Repo as 数据访问层
participant DB as MySQL数据库
Task->>Redis : HGetAll devices
Redis->>Task : 返回设备数据
Task->>Task : 解析JSON数据
Task->>Task : 修复日期格式
Task->>Repo : 查找设备信息
Repo->>DB : 查询user_device
DB->>Repo : 返回查询结果
alt 设备不存在
Task->>Repo : 插入新设备
Repo->>DB : INSERT user_device
DB->>Repo : 返回插入结果
else 设备存在
Task->>Repo : 更新设备版本
Repo->>DB : UPDATE user_device
DB->>Repo : 返回更新结果
end
Task->>Repo : 查找活跃信息
Repo->>DB : 查询user_active
DB->>Repo : 返回查询结果
alt 活跃信息不存在
Task->>Repo : 插入新活跃记录
Repo->>DB : INSERT user_active
DB->>Repo : 返回插入结果
else 活跃信息存在
Task->>Repo : 更新IP地址
Repo->>DB : UPDATE user_active
DB->>Repo : 返回更新结果
end
Task->>Redis : HDel 成功记录

图表来源

数据一致性保证

系统通过以下机制确保数据一致性:

  1. 原子性: 使用数据库事务确保设备和活跃信息的更新原子性
  2. 幂等性: 支持重复上报的处理,避免数据重复
  3. 回滚机制: 当部分操作失败时,系统会记录错误并继续处理其他记录
  4. 数据修复: 自动修复历史数据中的无效日期格式

章节来源

依赖关系分析

外部依赖

项目的主要外部依赖包括:

graph LR
subgraph "Go标准库"
StdLib[标准库]
end
subgraph "第三方库"
Gin[Gin Web框架]
Redis[Redis客户端]
MySQL[MySQL驱动]
Zap[Zap日志库]
Time[时间处理]
Context[上下文]
End
subgraph "内部模块"
Handler[处理器层]
Task[任务层]
Cache[缓存层]
Database[数据库层]
Model[模型层]
Repository[仓库层]
Response[响应层]
Middleware[中间件层]
end
Handler --> Gin
Handler --> Redis
Handler --> Context
Task --> Redis
Task --> MySQL
Task --> Time
Task --> Model
Task --> Repository
Cache --> Redis
Database --> MySQL
Repository --> Database
Response --> Gin
Middleware --> Gin
Middleware --> Zap

图表来源

内部模块依赖

graph TB
subgraph "入口模块"
Main[cmd/server/main.go]
end
subgraph "配置模块"
Config[internal/config/config.go]
RedisConfig[internal/config/redis.go]
DBConfig[internal/config/database.go]
end
subgraph "服务模块"
Router[internal/router/router.go]
Handler[internal/handler/device.go]
Task[internal/task/device_persist.go]
Cache[internal/cache/redis.go]
Database[internal/database/mysql.go]
end
subgraph "数据模块"
Model[internal/model/user_device.go]
Model2[internal/model/user_active.go]
Repository[internal/repository/device.go]
SQL[sql/user_device.sql]
SQL2[sql/user_active.sql]
end
subgraph "工具模块"
Response[internal/response/response.go]
Logger[internal/middleware/logger.go]
CORS[internal/middleware/cors.go]
end
Main --> Config
Main --> Router
Main --> Cache
Main --> Database
Router --> Handler
Router --> Task
Handler --> Response
Handler --> Cache
Task --> Repository
Task --> Model
Task --> Model2
Repository --> Database
Repository --> Model
Repository --> Model2
Router --> Logger
Router --> CORS
Cache --> RedisConfig
Database --> DBConfig

图表来源

章节来源

性能考虑

Redis 性能优化

  1. 连接池管理: 使用单个 Redis 客户端实例,避免频繁创建连接
  2. 内存使用: 设备信息以 JSON 字符串形式存储,占用内存较小
  3. 键设计: 使用简单的哈希结构,查询效率高
  4. 批量操作: 持久化任务使用批量删除操作,提高Redis清理效率

数据库性能优化

  1. 连接池配置: MySQL连接池最大25个连接,空闲5个连接,连接生命周期5分钟
  2. 分区策略: user_active表按日期分区,提高查询性能
  3. 索引优化: 设备表使用唯一索引,活跃表使用复合索引
  4. 批量写入: 持久化任务支持批量数据写入

请求处理优化

  1. 参数预处理: 使用 strings.TrimSpace() 去除多余空白字符
  2. 早期返回: 在参数验证失败时立即返回错误
  3. 上下文传递: 使用请求上下文进行异步操作
  4. 定时任务: 使用ticker实现精确的5分钟定时执行

监控建议

  1. Redis 监控: 监控键数量、内存使用率、命令执行时间
  2. 数据库监控: 监控连接数、查询性能、分区使用情况
  3. 应用监控: 监控请求延迟、错误率、并发请求数
  4. 持久化监控: 监控数据同步成功率、处理速度

故障排除指南

常见问题及解决方案

参数验证失败

症状: 返回 {"code": 400, "msg": "参数校验失败"} 原因: 缺少必需参数 macmodel 解决方法: 确保在请求中包含完整的参数

Redis 连接错误

症状: 返回 {"code": 500, "msg": "系统错误"} 原因: Redis 服务器不可达或认证失败 解决方法: 检查 Redis 配置和网络连接

JSON 序列化错误

症状: 返回 {"code": 500, "msg": "系统错误"} 原因: 设备信息格式化过程中出现异常 解决方法: 检查设备信息的数据类型和格式

数据库连接错误

症状: 持久化任务日志显示数据库连接失败 原因: 数据库服务器不可达或配置错误 解决方法: 检查数据库配置和网络连接

数据同步失败

症状: 持久化任务日志显示某些设备同步失败 原因: 数据库约束冲突或数据格式问题 解决方法: 检查设备数据的完整性和格式

调试步骤

  1. 启用详细日志: 检查日志中间件输出的请求信息
  2. 验证参数: 确认请求参数的完整性和正确性
  3. 测试 Redis: 验证 Redis 服务的可用性和权限设置
  4. 查看响应: 分析接口返回的具体错误信息
  5. 检查数据库: 验证数据库连接和表结构
  6. 监控持久化: 查看持久化任务的执行状态和日志

章节来源

结论

设备管理接口提供了简单而高效的设备信息上报功能,并通过新增的设备持久化系统实现了数据的长期可靠存储。该系统结合了Redis的高性能缓存和MySQL的持久化存储,形成了完整的设备管理解决方案。

主要优势

  1. 简洁明了: 接口设计简单,易于理解和使用
  2. 可靠性强: 完善的错误处理和日志记录机制
  3. 性能优秀: 使用 Redis 缓存,响应速度快;支持定时批量同步
  4. 扩展性强: 基于 Gin 框架,便于功能扩展
  5. 数据持久化: 通过定时任务确保数据的长期存储
  6. 数据一致性: 通过事务和幂等性设计保证数据一致性

改进建议

  1. 数据验证增强: 可以添加更严格的数据格式验证
  2. 限流机制: 可以添加请求频率限制,防止恶意刷取
  3. API 版本控制: 可以添加 API 版本号,便于后续升级
  4. 监控告警: 可以添加更完善的监控和告警机制
  5. 数据备份: 可以添加数据库备份和恢复机制

该接口为设备管理系统提供了坚实的基础,新增的持久化系统进一步增强了系统的可靠性和数据安全性,可以根据具体需求进一步扩展和完善。