Files
web-Iot/docs/控制会话状态机.md

99 lines
4.7 KiB
Markdown
Raw Permalink Normal View History

2026-08-10 13:33:06 +08:00
# 控制会话状态机
| 项目 | 内容 |
|------|------|
| 文档编号 | DES-04 |
| 文档名称 | 控制会话状态机 |
| 版本 | V1.0 |
| 状态 | 已评审(Reviewed) |
| 适用系统 | 机器人智慧服务系统(控制链路:WebSocket 控制通道) |
| 编写日期 | 2026-08-10 |
| 关联文档 | DOC-09 控制命令字典、命令状态机、越权-冲突-超时测试记录 |
---
## 1. 概述
控制会话(Control Session)描述 **操作员 ↔ 设备** 之间的实时控制连接生命周期。会话是"命令下发"的前置条件:只有会话处于 `ESTABLISHED` 状态时,才允许下发互斥类控制命令(move/rotate/task_start 等)。
## 2. 会话状态定义(CS-STATE)
| 状态 | 编码 | 说明 |
|------|------|------|
| 空闲 | `IDLE` | 无会话,设备未被任何操作员控制 |
| 连接中 | `CONNECTING` | 客户端发起 AUTH 握手,等待设备确认 |
| 已建立 | `ESTABLISHED` | 握手完成,操作员持有控制权,可下发命令 |
| 忙 | `BUSY` | 会话建立但设备正在执行互斥命令(命令状态机 EXECUTING) |
| 挂起 | `SUSPENDED` | 网络抖动/设备暂时不可控,会话保留待恢复 |
| 已关闭 | `CLOSED` | 会话终止(超时/主动断开/被抢占),控制权释放 |
## 3. 状态迁移图
```
AUTH 握手成功
IDLE ────────────────→ ESTABLISHED
↑ │ │
│ 释放/超时 │ │ 下发互斥命令
│ │ ▼
CLOSED ←── 超时/抢占 ── BUSY
↑ │
│ 主动断开/设备离线 │ 命令完成(SUCCEEDED/FAILED/TIMEOUT)
└──────────────────────┴──────────────→ ESTABLISHED
ESTABLISHED ── 网络抖动/设备忙 ──→ SUSPENDED ── 恢复/超时 ──→ ESTABLISHED / CLOSED
```
## 4. 状态迁移表(CS-TRANSITION)
| 当前状态 | 事件 | 目标状态 | 条件 / 动作 |
|----------|------|----------|-------------|
| `IDLE` | `AUTH_REQ` | `CONNECTING` | 客户端发送 AUTH 包 `{type:'AUTH', token, userName, deviceId}` |
| `CONNECTING` | `AUTH_OK` | `ESTABLISHED` | 设备确认;记录 owner、sessionId,启动保活计时 |
| `CONNECTING` | `AUTH_FAIL` | `IDLE` | token 无效/越权 → 拒绝连接,记审计日志 |
| `CONNECTING` | `TIMEOUT` | `IDLE` | 握手超时(5s 无 AUTH_OK) |
| `ESTABLISHED` | `CMD_DISPATCH` | `BUSY` | 下发互斥命令成功(move/rotate/task_start) |
| `BUSY` | `CMD_FINISH` | `ESTABLISHED` | 命令进入终态(SUCCEEDED/FAILED/TIMEOUT) |
| `ESTABLISHED`/`BUSY` | `LINK_DEGRADE` | `SUSPENDED` | 网络 RTT 超阈值/设备无响应;暂停命令下发 |
| `SUSPENDED` | `LINK_RECOVER` | `ESTABLISHED` | 链路恢复,继续未完成任务 |
| `SUSPENDED` | `RESUME_TIMEOUT` | `CLOSED` | 挂起超时(30s)未恢复 → 释放控制权 |
| 任意非终态 | `CLOSE` | `CLOSED` | 操作员主动释放 / 设备离线 / 被抢占 |
| `CLOSED` | `REOPEN` | `CONNECTING` | 重新申请控制权 |
## 5. 会话互斥与抢占(CS-MUTEX)
| 规则编号 | 规则 | 说明 |
|----------|------|------|
| CS-M1 | 一机一会话 | 同一设备同时仅允许 1 个 ESTABLISHED 会话 |
| CS-M2 | 抢占需授权 | 新操作员申请控制权时,若已有会话:仅 `admin` 可强制抢占,原会话收到 `PRECEDED` 后关闭;普通用户收到 `403 设备被占用` |
| CS-M3 | 会话与命令联动 | 会话 CLOSED 时,该设备 PENDING/SENT 命令自动取消(CANCELLED) |
| CS-M4 | 会话保活 | 客户端每 10s 发送保活帧;30s 无帧 → 判定链路断开,SUSPENDED→CLOSED |
## 6. 会话对象字段(CS-OBJECT)
| 字段 | 类型 | 说明 |
|------|------|------|
| `sessionId` | string | UUID,会话唯一标识 |
| `deviceId` | string | 目标设备 |
| `owner` | string | 持有控制权的操作员账号 |
| `role` | enum | `admin` / `operator` / `viewer` |
| `state` | enum | 见 §2 |
| `currentCommandId` | string | 当前执行中命令(BUSY 时非空) |
| `createdAt` / `updatedAt` | datetime | 会话时间戳 |
| `closedReason` | enum | `user_close` / `timeout` / `preempted` / `device_offline` / `auth_fail` |
## 7. 与命令状态机的衔接
```
会话 ESTABLISHED + 下发 move ──→ 命令状态机: SENT → ACKED → EXECUTING(会话→BUSY)
命令 SUCCEEDED/FAILED/TIMEOUT ──→ 会话 BUSY→ESTABLISHED
会话 CLOSED ──→ 未终态命令 → CANCELLED
```
---
**变更记录**
| 版本 | 日期 | 变更内容 | 作者 |
|------|------|----------|------|
| V1.0 | 2026-08-10 | 初稿:会话状态/迁移表/互斥抢占规则 | 系统组 |