1. 产品概述
智能设备后台管理系统是一个面向无人机、无人船、无人车及其配套基础设施(机库、船坞、车桩)的综合性管理平台。系统通过MQTT协议与设备进行实时通信,提供设备基础信息管理、实时状态监控、事件日志记录、远程指令操控等核心功能,并对外提供标准HTTP接口供小程序等第三方系统调用。
- 主要目的:实现对多种智能设备的统一管理、实时监控和远程控制
- 目标用户:设备运维人员、系统管理员、第三方开发者(通过API)
- 市场价值:提高设备管理效率,降低运维成本,支持业务系统对接
2. 核心功能
2.1 用户角色
| 角色 | 注册方式 | 核心权限 |
|---|---|---|
| 系统管理员 | 手动创建 | 完整权限,包括用户管理、系统配置 |
| 设备管理员 | 手动创建 | 设备管理、指令下发、订单管理 |
2.2 功能模块
- 仪表盘:设备概览统计、实时状态监控、告警信息展示
- 设备管理:设备基础信息增删改查、设备分类管理、设备状态维护
- 实时监控:设备周期上报数据展示、位置追踪、传感器数据可视化
- 事件管理:设备上报事件记录、事件类型分类、事件历史查询
- 远程控制:泊点指令下发、移动设备指令下发、指令执行状态追踪
- 订单管理:订单创建、订单状态追踪、订单历史查询、视频管理
- 系统管理:用户管理、日志管理、系统配置、告警规则管理
2.3 页面详情
| 页面名称 | 模块名称 | 功能描述 |
|---|---|---|
| 登录页 | 用户登录 | 用户名、密码输入,登录验证,防止未授权访问系统 |
| 仪表盘 | 概览统计 | 设备总数、在线设备数、告警数量、今日任务数统计展示 |
| 仪表盘 | 实时监控 | 设备状态实时卡片展示(绿色在线/黄色异常/红色未连接/灰色离线),地图位置实时标记 |
| 设备管理 | 设备列表 | 设备编号、类型、名称、状态、位置等信息列表展示,支持筛选和搜索 |
| 设备管理 | 设备详情 | 设备基础信息、实时状态、传感器数据、历史事件的详细展示 |
| 设备管理 | 设备编辑 | 设备基础信息的新增和编辑表单 |
| 实时监控 | 监控大屏 | 多设备状态实时展示、地图轨迹回放、数据图表展示 |
| 事件管理 | 事件列表 | 设备上报事件记录,支持按时间、设备、类型筛选 |
| 远程控制 | 指令下发 | 泊点指令和移动设备指令的下发界面 |
| 远程控制 | 指令历史 | 已下发指令的执行状态和结果查询 |
| 订单管理 | 订单列表 | 订单信息列表,支持状态筛选和搜索 |
| 订单管理 | 订单详情 | 订单执行进度、设备指令状态、视频下载链接 |
| 系统管理 | 用户管理 | 用户列表、新增用户、权限配置 |
| 系统管理 | 操作日志 | 系统操作记录查询 |
| 系统管理 | 系统配置 | 异常阈值配置、超时时间配置、其他系统参数配置 |
| 系统管理 | 告警规则 | 告警规则配置、告警通知方式设置 |
3. 核心流程
3.1 订单执行流程
用户通过小程序调用 create_order 接口创建订单,系统根据订单参数自动执行以下流程:
flowchart TD
A[接收订单请求] --> B{设备是否在线}
B -->|否| C[返回设备离线错误]
B -->|是| D{设备是否充电中}
D -->|是| E[停止充电]
D -->|否| F{设备是否已激活}
E --> F
F -->|否| G[激活设备]
F -->|是| H{仓门是否打开}
G --> H
H -->|否| I[打开仓门]
H -->|是| J[发送启动指令]
I --> J
J --> K[执行任务中]
K --> L{电量是否充足}
L -->|否| M[自动返航]
L -->|是| N{任务是否完成}
N -->|否| K
N -->|是| O[发送返回指令]
M --> O
O --> P[返回中]
P --> Q{是否成功返回}
Q -->|否| R{重试次数<2?}
R -->|是| S[重试]
S --> O
R -->|否| T[标记任务失败]
Q -->|是| U[关闭仓门]
U --> Z[订单完成]
3.2 用户登录流程
flowchart TD
A[访问系统] --> B{是否已登录?}
B -->|是| C[进入仪表盘]
B -->|否| D[显示登录页面]
D --> E[输入用户名和密码]
E --> F[点击登录]
F --> G[验证用户名密码]
G --> H{验证成功?}
H -->|否| I[提示错误信息]
I --> E
H -->|是| J[生成登录令牌]
J --> K[存储会话信息]
K --> C
3.3 指令下发流程
flowchart TD
A[选择设备] --> B[选择指令类型]
B --> C[填写指令参数]
C --> D[确认下发]
D --> E[保存指令记录]
E --> F[发送指令到设备]
F --> G[等待设备响应]
G --> H{响应超时?}
H -->|是| I[标记指令超时]
H -->|否| J[更新指令状态]
4. 用户界面设计
4.1 设计风格
- 主色调:深蓝色系(#1a365d),搭配浅蓝色作为辅助色(#3182ce)
- 按钮样式:圆角矩形,主按钮采用渐变背景,强调按钮使用橙色(#ed8936)
- 字体:中文使用思源黑体,英文使用Roboto,标题字号18-24px,正文14px
- 布局风格:侧边栏导航 + 顶部导航栏 + 主内容区的三栏布局
- 图标风格:使用Font Awesome图标库,线条简洁清晰
4.2 页面设计概述
| 页面名称 | 模块名称 | UI元素 |
|---|---|---|
| 登录页 | 用户登录 | 居中登录表单,包含用户名输入框、密码输入框、登录按钮,支持记住密码、忘记密码功能 |
| 仪表盘 | 概览统计 | 统计卡片网格布局,数字+图标组合,支持点击跳转 |
| 仪表盘 | 实时监控 | 设备状态卡片(绿色在线/黄色异常/红色未连接/灰色离线),地图组件展示位置 |
| 设备管理 | 设备列表 | 表格形式展示,支持分页、筛选、搜索,每行包含操作按钮 |
| 设备管理 | 设备详情 | 标签页切换(基础信息/实时数据/历史事件),数据以卡片和图表展示 |
| 远程控制 | 指令下发 | 表单布局,参数输入区,实时状态反馈区 |
| 订单管理 | 订单列表 | 表格展示,状态标签(不同颜色区分),操作列 |
| 系统管理 | 系统配置 | 配置项列表,支持修改和保存,包含异常阈值、超时时间等 |
| 系统管理 | 告警规则 | 告警规则列表,支持新增、编辑、启用/禁用告警规则 |
4.3 响应式设计
- 桌面端:完整三栏布局,侧边栏展开
- 平板端:侧边栏可折叠,主内容区自适应
- 移动端:侧边栏隐藏,通过菜单按钮切换,列表转为卡片式布局
5. 对外API接口设计
5.0 接口使用场景说明
以下API接口同时服务于后台管理系统和小程序前端:
| 使用场景 | 适用前端 | 调用接口 | 说明 |
|---|---|---|---|
| 手动创建订单 | 后台管理系统 | find_nearest_device → create_order | 选择设备类型和位置,查找最近可用设备,创建订单 |
| 实时查看订单状态 | 后台管理系统/小程序 | get_order_status(轮询) | 轮询获取订单状态,实时展示进度 |
| 取消订单 | 后台管理系统/小程序 | cancel_order | 取消未执行或执行中的订单 |
| 查看媒体文件 | 后台管理系统/小程序 | get_order_media | 获取订单完成后的视频/图片下载链接 |
5.1 接口列表
| 接口名称 | HTTP方法 | 路径 | 功能描述 |
|---|---|---|---|
| login | POST | /api/v1/auth/login | 用户登录验证,获取访问令牌 |
| find_nearest_device | GET | /api/v1/device/nearest | 根据经纬度和设备类型查找最近可用的移动设备 |
| create_order | POST | /api/v1/order | 创建订单并触发设备执行任务 |
| get_order_status | GET | /api/v1/order/{order_id} | 查询订单状态和执行进度 |
| cancel_order | POST | /api/v1/order/{order_id}/cancel | 取消订单 |
| get_order_media | GET | /api/v1/order/{order_id}/media | 获取订单关联的媒体文件(视频/图片) |
5.3 接口详细定义
5.3.0 接口认证
所有对外API(除login接口外)均需进行身份认证,认证方式为Bearer Token。 认证方式:
- 在请求Header中添加
Authorization: Bearer <token> - Token有效期:2小时
- Token过期后需重新调用login接口获取
未认证响应(401):
{
"code": 401,
"message": "未授权,请重新登录"
}
5.3.1 login
请求体:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| username | string | 是 | 用户名 |
| password | string | 是 | 密码 |
| remember_me | boolean | 否 | 是否记住登录状态,默认false |
{
"username": "admin",
"password": "123456",
"remember_me": false
}
成功响应(200):
{
"code": 0,
"message": "登录成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user_info": {
"id": "USER_001",
"username": "admin",
"role": "ADMIN",
"real_name": "管理员"
}
}
}
失败响应(200):
{
"code": 1,
"message": "用户名或密码错误"
}
5.3.2 find_nearest_device
请求参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| longitude | number | 是 | 经度 |
| latitude | number | 是 | 纬度 |
| device_type | string | 是 | 设备类型(DRONE/SHIP/CAR) |
| 成功响应(200): |
{
"code": 0,
"message": "success",
"data": {
"device_id": "DRONE_001",
"device_type": "DRONE",
"infrastructure_id": "HANGAR_001"
}
}
失败响应(200):
{
"code": 1,
"message": "无设备可用"
}
5.3.3 create_order
请求体:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| order_id | string | 是 | 订单编号 |
| device_id | string | 是 | 移动设备编号(无人机/无人船/无人车) |
| device_type | string | 是 | 设备类型(DRONE/SHIP/CAR) |
| route_path | string | 是 | 航线/路径文件的URL |
| open_id | string | 是 | 下单用户ID |
| task_type | string | 否 | 任务类型,默认"拍摄" |
| task_params | object | 否 | 任务参数,如拍照间隔、录像时长等 |
{
"order_id": "ORD_202401010001",
"device_id": "DRONE_001",
"device_type": "DRONE",
"route_path": "https://storage.example.com/routes/route_001.json",
"open_id": "USER_OPEN_001",
"task_type": "拍摄",
"task_params": {
"recording_duration": 1800,
"photo_interval": 10
}
}
成功响应(200):
{
"code": 0,
"message": "订单已创建",
"data": {
"order_id": "ORD_202401010001",
"status": "未开始",
"device_type": "DRONE",
"infrastructure_id": "HANGAR_001"
}
}
5.3.4 get_order_status
请求路径参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| order_id | string | 是 | 订单编号 |
| 成功响应(200): |
{
"code": 0,
"message": "success",
"data": {
"order_id": "ORD_202401010001",
"status": "执行中",
"progress": 65
}
}
状态枚举:
- 未开始
- 开仓门
- 已启动
- 执行中
- 返回中
- 已返回
- 关仓门
- 媒体上传中
- 已完成
- 任务失败
- 已取消
5.3.5 cancel_order
请求路径参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| order_id | string | 是 | 订单编号 |
| 请求体: | |||
| 参数名 | 类型 | 必填 | 描述 |
| -------- | ------ | ------ | ------ |
| reason | string | 否 | 取消原因 |
{
"reason": "用户主动取消"
}
成功响应(200):
{
"code": 0,
"message": "订单已取消",
"data": {
"order_id": "ORD_202401010001",
"status": "已取消"
}
}
失败响应(200):
{
"code": 1,
"message": "订单已执行,无法取消"
}
取消规则:
- 订单状态为"未开始"时可取消
- 订单状态为"开仓门"时可取消,系统会发送关仓门指令
- 订单状态为"已启动"及之后不可取消
5.3.6 get_order_media
请求路径参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| order_id | string | 是 | 订单编号 |
| 成功响应(200): |
{
"code": 0,
"message": "success",
"data": {
"order_id": "ORD_202401010001",
"media": [
{
"type": "video",
"url": "https://storage.example.com/videos/ORD_202401010001.mp4",
"duration": 1800
},
{
"type": "photo",
"url": "https://storage.example.com/photos/ORD_202401010001_001.jpg"
}
]
}
}
失败响应(200):
{
"code": 1,
"message": "媒体文件尚未上传完成"
}
6. 数据模型设计
6.1 核心实体
6.1.1 用户表 (users)
| 字段名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | string | PRIMARY KEY | 用户ID |
| username | string | NOT NULL UNIQUE | 用户名 |
| password | string | NOT NULL | 密码(加密存储) |
| role | string | NOT NULL | 用户角色(ADMIN/DEVICE_ADMIN) |
| real_name | string | 真实姓名 | |
| phone | string | 手机号码 | |
| string | 邮箱地址 | ||
| status | string | NOT NULL | 用户状态(ACTIVE/INACTIVE) |
| last_login_at | timestamp | 最后登录时间 | |
| created_at | timestamp | NOT NULL | 创建时间 |
| updated_at | timestamp | NOT NULL | 更新时间 |
6.1.2 基础设施表 (infrastructures)
| 字段名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | string | PRIMARY KEY | 设备编号 |
| type | string | NOT NULL | 设备类型(HANGAR/DOCK/CHARGER) |
| name | string | NOT NULL | 设备名称 |
| status | string | NOT NULL | 设备状态(ONLINE/OFFLINE) |
| firmware_version | string | 固件版本 | |
| location_longitude | decimal | 经度 | |
| location_latitude | decimal | 纬度 | |
| battery_level | integer | 电量百分比 | |
| temperature | decimal | 内部温度 | |
| wind_speed | decimal | 风速(仅机库) | |
| rainfall | decimal | 雨量(仅机库) | |
| door_status | string | 舱门状态(打开中/已打开/关闭中/已关闭,仅机库/船坞) | |
| bound_device_id | string | FOREIGN KEY | 绑定的移动设备编号(机库绑定无人机、船坞绑定无人船、车桩绑定无人车) |
| vehicle_returned | boolean | 移动设备归位标识(机库/船坞/车桩) | |
| vehicle_activated | boolean | 移动设备激活标识(机库/船坞/车桩) | |
| vehicle_charging | boolean | 移动设备充电标识(机库/船坞/车桩) | |
| created_at | timestamp | NOT NULL | 创建时间 |
| updated_at | timestamp | NOT NULL | 更新时间 |
6.1.3 移动设备表 (mobile_devices)
| 字段名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | string | PRIMARY KEY | 设备编号 |
| type | string | NOT NULL | 设备类型(DRONE/SHIP/CAR) |
| name | string | NOT NULL | 设备名称 |
| status | string | NOT NULL | 设备状态(NOT_CONNECTED/CONNECTED/OFFLINE) |
| software_version | string | 软件版本 | |
| location_longitude | decimal | 经度 | |
| location_latitude | decimal | 纬度 | |
| location_altitude | decimal | 高度(仅无人机) | |
| battery_level | integer | 电量百分比 | |
| pitch_angle | decimal | 俯仰角(仅无人机) | |
| yaw_angle | decimal | 偏航角(仅无人机) | |
| roll_angle | decimal | 翻滚角(仅无人机) | |
| horizontal_speed | decimal | 水平速度 | |
| vertical_speed | decimal | 垂直速度(仅无人机) | |
| created_at | timestamp | NOT NULL | 创建时间 |
| updated_at | timestamp | NOT NULL | 更新时间 |
6.1.4 事件表 (events)
| 字段名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | string | PRIMARY KEY | 事件ID |
| device_id | string | FOREIGN KEY | 设备编号 |
| event_type | string | NOT NULL | 事件类型 |
| event_data | jsonb | 事件详细数据 | |
| occurred_at | timestamp | NOT NULL | 事件发生时间 |
| 事件类型枚举: |
- VEHICLE_DEPLOY(已起飞/已起航/已启动)
- VEHICLE_RETURN(已落地/已停靠/已停车)
- MEDIA_UPLOAD_START(开始上传媒体)
- MEDIA_UPLOAD_COMPLETE(媒体上传完成)
- DOOR_OPEN(舱门/船坞门/车桩门打开)
- DOOR_CLOSE(舱门/船坞门/车桩门关闭)
- BATTERY_LOW(电量低告警)
- CONNECTION_LOST(连接断开)
6.1.5 订单表 (orders)
| 字段名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | string | PRIMARY KEY | 订单编号 |
| device_id | string | FOREIGN KEY | 移动设备编号(无人机/无人船/无人车) |
| device_type | string | NOT NULL | 设备类型(DRONE/SHIP/CAR) |
| route_path | string | 航线/路径文件的URL | |
| open_id | string | 下单用户ID | |
| task_type | string | 任务类型 | |
| task_params | jsonb | 任务参数 | |
| status | string | NOT NULL | 订单状态 |
| progress | integer | 执行进度(0-100) | |
| media_data | jsonb | 媒体文件数据(视频、图片等) | |
| retry_count | integer | 重试次数(复飞/重试) | |
| created_at | timestamp | NOT NULL | 创建时间 |
| updated_at | timestamp | NOT NULL | 更新时间 |
6.1.6 指令表 (commands)
| 字段名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | string | PRIMARY KEY | 指令ID |
| device_id | string | FOREIGN KEY | 设备编号(基础设施或移动设备) |
| order_id | string | 关联订单编号 | |
| command_type | string | NOT NULL | 指令类型 |
| command_params | jsonb | 指令参数 | |
| status | string | NOT NULL | 指令状态 |
| response_data | jsonb | 设备响应数据 | |
| created_at | timestamp | NOT NULL | 创建时间 |
| executed_at | timestamp | 执行时间 | |
| 指令类型枚举: |
- OPEN_DOOR(开舱门/开船坞门/开车桩门)
- CLOSE_DOOR(关舱门/关船坞门/开车桩门)
- ACTIVATE_VEHICLE(激活移动设备)
- DEACTIVATE_VEHICLE(去激活移动设备)
- START_CHARGING(开始充电)
- STOP_CHARGING(停止充电)
- DEPLOY(起飞/起航/启动)
- HOVER(悬停/驻停)
- RETURN(降落/停靠/停车)
- RETURN_HOME(自动返航)
- EMERGENCY_STOP(紧急停止)
- TAKE_PHOTO(拍照)
- START_RECORDING(开始录像)
- STOP_RECORDING(结束录像)
- START_STREAMING(打开推流)
- STOP_STREAMING(关闭推流)
6.1.7 系统配置表 (system_config)
| 字段名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | string | PRIMARY KEY | 配置项ID |
| config_key | string | NOT NULL UNIQUE | 配置项键名 |
| config_value | jsonb | NOT NULL | 配置项值 |
| config_description | string | 配置项描述 | |
| created_at | timestamp | NOT NULL | 创建时间 |
| updated_at | timestamp | NOT NULL | 更新时间 |
| 配置项说明: | |||
| config_key | 说明 | 默认值 | |
| ------------ | ------ | -------- | |
| battery_low_threshold | 电量低告警阈值(%) | 20 | |
| battery_full_threshold | 电量充满停止充电阈值(%) | 90 | |
| wind_speed_high_threshold | 风速过大告警阈值(m/s) | 15 | |
| rainfall_high_threshold | 雨量过大告警阈值(mm/h) | 10 | |
| order_timeout_minutes | 订单执行超时时间(分钟) | 30 | |
| device_offline_timeout_minutes | 设备离线告警时间(分钟) | 5 | |
| max_retry_count | 设备返回失败最大重试次数 | 2 |
6.1.8 告警规则表 (alert_rules)
| 字段名 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | string | PRIMARY KEY | 告警规则ID |
| rule_name | string | NOT NULL | 规则名称 |
| alert_type | string | NOT NULL | 告警类型 |
| threshold | jsonb | 告警阈值配置 | |
| enabled | boolean | NOT NULL | 是否启用 |
| notify_channels | jsonb | 通知渠道(邮件/短信/钉钉等) | |
| created_at | timestamp | NOT NULL | 创建时间 |
| updated_at | timestamp | NOT NULL | 更新时间 |
| 告警类型枚举: |
- BATTERY_LOW(电量低)
- WIND_SPEED_HIGH(风速过大)
- RAINFALL_HIGH(雨量过大)
- DEVICE_OFFLINE(设备离线)
- ORDER_TIMEOUT(订单超时)
- ORDER_FAILED(订单失败)
7. 业务规则
7.1 设备管理规则
- 设备绑定关系:基础设施与移动设备采用一对一绑定方式,通过
bound_device_id字段建立关联(机库绑定无人机、船坞绑定无人船、车桩绑定无人车) - 设备类型关联:每个移动设备(无人机、无人船、无人车)必须关联到对应的基础设施(机库、船坞、车桩)
- 设备状态流转:设备状态在"离线→在线→连接中→执行任务"之间流转
- 唯一标识:设备编号全局唯一,格式为
设备类型_序号(如DRONE_001)
7.2 订单执行规则
- 订单前置检查:
- 订单执行前若设备正在充电,需先停止充电
- 订单执行前若设备未激活,需先激活设备
- 订单执行前若仓门未打开,需先打开仓门
- 安全规则:
- 设备未成功归位时尝试重试,最多两次
- 任务执行超时自动停机
- 订单完成规则:
- 设备成功返回并关闭仓门后,订单标记为完成
- 充电逻辑由设备端自行处理,不属于订单执行流程
7.3 设备管理规则补充
电池保护规则:
- 设备电量超过90%后停止充电
- 电量低于20%时触发告警并强制返航
7.4 指令下发规则
- 指令优先级:紧急指令(如返航、降落)优先级高于普通指令(如拍照、录像)
- 指令去重:同一设备同一类型指令在执行中时,不接受重复下发
- 超时机制:指令下发后30秒无响应标记为超时,可手动重试
8. 非功能需求
8.1 性能要求
- 响应时间:页面加载时间≤2秒,API响应时间≤500毫秒
- 并发能力:支持≥1000个设备同时在线,≥100个并发API请求
- 数据更新:设备实时数据更新频率≤5秒
8.2 安全要求
- 接口认证:所有对外API需进行身份认证
- 数据加密:传输层采用HTTPS加密,敏感数据存储加密
- 权限控制:基于角色的访问控制(RBAC)
8.3 可用性要求
- 系统可用性:≥99.9%
- 数据备份:每日自动备份,支持数据恢复
- 故障恢复:系统故障后恢复时间≤30分钟
8.4 可扩展性要求
- 模块化设计:各功能模块独立,便于后续扩展新设备类型
- 接口标准化:对外API遵循RESTful标准,便于第三方对接
- 配置化管理:关键参数支持配置化,无需修改代码即可调整
8.5 数据存储策略
8.5.1 历史状态数据存储分析
不建议保存所有历史状态数据,原因如下:
| 分析维度 | 说明 |
|---|---|
| 数据量巨大 | 假设1000个设备,每5秒上报一次状态,每天产生约1728万条记录,存储成本极高 |
| 数据价值递减 | 实时状态的价值随时间快速衰减,超过一定时间后仅用于趋势分析 |
| 查询性能 | 大量历史数据会影响实时查询性能,需要额外的索引和分区策略 |
8.5.2 分层存储策略
| 数据类型 | 存储方式 | 保留策略 | 使用场景 |
|---|---|---|---|
| 实时状态 | PostgreSQL(设备表) | 仅保留最新状态 | 实时监控、指令下发判断 |
| 历史状态 | InfluxDB(时序数据库) | 分钟级聚合数据保留7天 | 趋势分析、历史回放 |
| 事件数据 | PostgreSQL(事件表) | 长期保留 | 故障追溯、审计日志 |
| 指令数据 | PostgreSQL(指令表) | 长期保留 | 指令执行审计、问题排查 |
| 订单数据 | PostgreSQL(订单表) | 长期保留 | 业务统计、视频关联 |
8.5.3 历史状态数据聚合规则
| 聚合级别 | 时间间隔 | 数据内容 | 保留策略 |
|---|---|---|---|
| 原始数据 | 5秒 | 完整状态信息 | 不存储,仅用于实时更新和分钟级聚合计算 |
| 分钟级聚合 | 1分钟 | 平均值、最大值、最小值 | 保留7天 |
8.5.4 数据清理机制
- 自动清理:定时任务自动清理超过保留期限的历史数据
- 手动导出:支持按设备、时间范围导出历史数据
- 备份策略:聚合数据定期备份到冷存储
9. MQTT通信设计
9.1 协议概述
服务器与设备之间的通信采用MQTT 3.1.1协议,实现设备状态上报、事件推送和指令下发的双向实时通信。
9.2 MQTT主题设计
9.2.1 设备上报主题
| 主题路径 | 用途 | 示例 |
|---|---|---|
device/{device_id}/status | 设备周期上报实时状态信息 | device/DRONE_001/status |
device/{device_id}/event | 设备上报事件信息 | device/DRONE_001/event |
9.2.2 指令下发主题
| 主题路径 | 用途 | 示例 |
|---|---|---|
command/{device_id}/execute | 服务器向设备下发指令 | command/DRONE_001/execute |
9.2.3 指令响应主题
| 主题路径 | 用途 | 示例 |
|---|---|---|
command/{device_id}/response | 设备响应指令执行结果 | command/DRONE_001/response |
9.3 消息格式定义
9.3.1 设备状态上报消息
主题:device/{device_id}/status
{
"device_id": "DRONE_001",
"device_type": "DRONE",
"timestamp": 1704067200,
"status": "CONNECTED",
"software_version": "v2.1.0",
"location": {
"longitude": 116.4074,
"latitude": 39.9042,
"altitude": 100
},
"battery_level": 78,
"attitude": {
"pitch_angle": 5.2,
"yaw_angle": 180.5,
"roll_angle": -2.1
},
"speed": {
"horizontal_speed": 12.5,
"vertical_speed": 0
}
}
机库状态上报消息示例:
{
"device_id": "HANGAR_001",
"device_type": "HANGAR",
"timestamp": 1704067200,
"status": "ONLINE",
"firmware_version": "v1.5.0",
"location": {
"longitude": 116.4074,
"latitude": 39.9042
},
"battery_level": 95,
"temperature": 25.3,
"wind_speed": 3.5,
"rainfall": 0,
"door_status": "CLOSED",
"bound_device_id": "DRONE_001",
"vehicle_returned": true,
"vehicle_activated": false,
"vehicle_charging": true
}
9.3.2 设备事件上报消息
主题:device/{device_id}/event
{
"device_id": "DRONE_001",
"event_id": "EVT_202401010001",
"event_type": "DRONE_TAKEOFF",
"timestamp": 1704067200,
"event_data": {
"location": {
"longitude": 116.4074,
"latitude": 39.9042,
"altitude": 0
},
"battery_level": 85
}
}
9.3.3 指令下发消息
主题:command/{device_id}/execute
{
"command_id": "CMD_202401010001",
"device_id": "DRONE_001",
"order_id": "ORD_202401010001",
"command_type": "DEPLOY",
"timestamp": 1704067200,
"params": {
"route_path": "https://storage.example.com/routes/route_001.json",
"target_altitude": 100
}
}
9.3.4 指令响应消息
主题:command/{device_id}/response
{
"command_id": "CMD_202401010001",
"device_id": "DRONE_001",
"status": "SUCCESS",
"timestamp": 1704067210,
"response_data": {
"current_altitude": 100,
"battery_level": 84
}
}
响应状态枚举:
- SUCCESS(执行成功)
- FAILED(执行失败)
- TIMEOUT(超时)
- REJECTED(指令被拒绝)
9.4 连接管理
9.4.1 设备认证
- 设备连接时需提供设备编号和密钥作为客户端ID和密码
- 服务器验证设备身份,非法设备拒绝连接
9.4.2 心跳机制
- 设备需保持MQTT连接,断开后自动重连
- 心跳间隔:30秒
- 服务器检测设备离线后,更新设备状态为"离线"
9.4.3 消息QoS
- 状态上报:QoS 1(确保重要状态数据不丢失)
- 事件上报:QoS 1
- 指令下发:QoS 1
- 指令响应:QoS 1
10. 技术栈建议
10.1 前端
- 框架:React 18 + TypeScript
- UI组件:Ant Design 5.x
- 状态管理:Redux Toolkit / Zustand
- 地图组件:Leaflet / Mapbox GL JS
- 图表组件:ECharts / Recharts
- 构建工具:Vite
10.2 后端
- 框架:Node.js + Express / NestJS
- 关系型数据库:PostgreSQL(设备信息、事件、订单、指令)
- 时序数据库:InfluxDB(设备历史状态数据)
- 缓存:Redis(实时数据缓存)
- MQTT Broker:EMQX / Mosquitto(设备通信)
- 文件存储:对象存储(AWS S3 / 阿里云OSS)
- API文档:Swagger / OpenAPI
10.3 基础设施
- 部署方式:Docker + Kubernetes
- 负载均衡:Nginx
- 监控告警:Prometheus + Grafana
- 日志管理:ELK Stack
11. 里程碑规划
| 阶段 | 时间 | 交付内容 |
|---|---|---|
| 第一阶段 | 第1-2周 | 项目初始化、基础架构搭建、数据库设计 |
| 第二阶段 | 第3-4周 | 设备管理模块、实时监控模块开发 |
| 第三阶段 | 第5-6周 | 远程控制模块、事件管理模块开发 |
| 第四阶段 | 第7-8周 | 订单管理模块、对外API开发 |
| 第五阶段 | 第9-10周 | 系统管理模块、测试与优化 |
| 第六阶段 | 第11-12周 | 部署上线、文档编写、培训 |
