# 设备交互模块 API 文档

本文档详细说明设备交互模块的 API 接口。所有接口基于 RESTful 设计原则。

## 接口基础信息

- **基础路径**: `/api/device/`
- **认证方式**: Token 认证（除特别说明外）
- **返回格式**: JSON

## 1. 设备类型管理

### 1.1 获取设备类型列表

获取所有设备类型的列表。

- **URL**: `/api/device/device-types/`
- **方法**: `GET`
- **认证**: 需要
- **响应**:
  ```json
  [
    {
      "id": 1,
      "name": "智能音箱",
      "code": "SP01",
      "description": "AI智能音箱设备",
      "created_at": "2023-01-01T00:00:00Z",
      "updated_at": "2023-01-01T00:00:00Z"
    }
  ]
  ```

### 1.2 创建设备类型

创建新的设备类型。

- **URL**: `/api/device/device-types/`
- **方法**: `POST`
- **认证**: 需要
- **请求体**:
  ```json
  {
    "name": "智能音箱",
    "code": "SP01",
    "description": "AI智能音箱设备"
  }
  ```
- **响应**:
  ```json
  {
    "id": 1,
    "name": "智能音箱",
    "code": "SP01",
    "description": "AI智能音箱设备",
    "created_at": "2023-01-01T00:00:00Z",
    "updated_at": "2023-01-01T00:00:00Z"
  }
  ```

### 1.3 获取设备类型详情

根据ID获取设备类型详情。

- **URL**: `/api/device/device-types/{id}/`
- **方法**: `GET`
- **参数**:
  - `id` (路径参数): 设备类型ID
- **认证**: 需要
- **响应**:
  ```json
  {
    "id": 1,
    "name": "智能音箱",
    "code": "SP01",
    "description": "AI智能音箱设备",
    "created_at": "2023-01-01T00:00:00Z",
    "updated_at": "2023-01-01T00:00:00Z"
  }
  ```

### 1.4 更新设备类型

更新现有设备类型。

- **URL**: `/api/device/device-types/{id}/`
- **方法**: `PUT`
- **参数**:
  - `id` (路径参数): 设备类型ID
- **请求体**:
  ```json
  {
    "name": "智能音箱",
    "code": "SP01",
    "description": "更新后的描述"
  }
  ```
- **认证**: 需要
- **响应**:
  ```json
  {
    "id": 1,
    "name": "智能音箱",
    "code": "SP01",
    "description": "更新后的描述",
    "created_at": "2023-01-01T00:00:00Z",
    "updated_at": "2023-01-02T00:00:00Z"
  }
  ```

### 1.5 删除设备类型

删除现有设备类型。

- **URL**: `/api/device/device-types/{id}/`
- **方法**: `DELETE`
- **参数**:
  - `id` (路径参数): 设备类型ID
- **认证**: 需要
- **响应**: 204 No Content

## 2. 设备批次管理

### 2.1 获取设备批次列表

获取所有设备批次的列表。

- **URL**: `/api/device/device-batches/`
- **方法**: `GET`
- **认证**: 需要
- **响应**:
  ```json
  [
    {
      "id": 1,
      "device_type": 1,
      "device_type_name": "智能音箱",
      "batch_number": "BSP0101",
      "production_date": "2023-01-01",
      "quantity": 500,
      "description": "第一批智能音箱",
      "created_at": "2023-01-01T00:00:00Z",
      "updated_at": "2023-01-01T00:00:00Z"
    }
  ]
  ```

### 2.2 创建设备批次

创建新的设备批次。

- **URL**: `/api/device/device-batches/`
- **方法**: `POST`
- **认证**: 需要
- **请求体**:
  ```json
  {
    "device_type": 1,
    "batch_number": "BSP0101",
    "production_date": "2023-01-01",
    "quantity": 500,
    "description": "第一批智能音箱"
  }
  ```
- **响应**:
  ```json
  {
    "id": 1,
    "device_type": 1,
    "device_type_name": "智能音箱",
    "batch_number": "BSP0101",
    "production_date": "2023-01-01",
    "quantity": 500,
    "description": "第一批智能音箱",
    "created_at": "2023-01-01T00:00:00Z",
    "updated_at": "2023-01-01T00:00:00Z"
  }
  ```

### 2.3 获取设备批次详情

根据ID获取设备批次详情。

- **URL**: `/api/device/device-batches/{id}/`
- **方法**: `GET`
- **参数**:
  - `id` (路径参数): 设备批次ID
- **认证**: 需要
- **响应**:
  ```json
  {
    "id": 1,
    "device_type": 1,
    "device_type_name": "智能音箱",
    "batch_number": "BSP0101",
    "production_date": "2023-01-01",
    "quantity": 500,
    "description": "第一批智能音箱",
    "created_at": "2023-01-01T00:00:00Z",
    "updated_at": "2023-01-01T00:00:00Z"
  }
  ```

### 2.4 更新设备批次

更新现有设备批次。

- **URL**: `/api/device/device-batches/{id}/`
- **方法**: `PUT`
- **参数**:
  - `id` (路径参数): 设备批次ID
- **请求体**:
  ```json
  {
    "device_type": 1,
    "batch_number": "BSP0101",
    "production_date": "2023-01-01",
    "quantity": 600,
    "description": "更新后的描述"
  }
  ```
- **认证**: 需要
- **响应**:
  ```json
  {
    "id": 1,
    "device_type": 1,
    "device_type_name": "智能音箱",
    "batch_number": "BSP0101",
    "production_date": "2023-01-01",
    "quantity": 600,
    "description": "更新后的描述",
    "created_at": "2023-01-01T00:00:00Z",
    "updated_at": "2023-01-02T00:00:00Z"
  }
  ```

### 2.5 删除设备批次

删除现有设备批次。

- **URL**: `/api/device/device-batches/{id}/`
- **方法**: `DELETE`
- **参数**:
  - `id` (路径参数): 设备批次ID
- **认证**: 需要
- **响应**: 204 No Content

## 3. 设备管理

### 3.1 获取设备列表

获取所有设备的列表。

- **URL**: `/api/device/devices/`
- **方法**: `GET`
- **认证**: 需要
- **响应**:
  ```json
  [
    {
      "id": 1,
      "device_type": 1,
      "device_type_name": "智能音箱",
      "batch": 1,
      "batch_number": "BSP0101",
      "serial_number": "00001",
      "device_code": "SP0100001",
      "mac_address": "00:11:22:33:44:55",
      "is_active": false,
      "activated_at": null,
      "created_at": "2023-01-01T00:00:00Z",
      "updated_at": "2023-01-01T00:00:00Z"
    }
  ]
  ```

### 3.2 创建单个设备

创建新的设备。

- **URL**: `/api/device/devices/`
- **方法**: `POST`
- **认证**: 需要
- **请求体**:
  ```json
  {
    "device_type": 1,
    "batch": 1,
    "serial_number": "00001",
    "mac_address": "00:11:22:33:44:55"
  }
  ```
- **响应**:
  ```json
  {
    "id": 1,
    "device_type": 1,
    "device_type_name": "智能音箱",
    "batch": 1,
    "batch_number": "BSP0101",
    "serial_number": "00001",
    "device_code": "SP0100001",
    "mac_address": "00:11:22:33:44:55",
    "is_active": false,
    "activated_at": null,
    "created_at": "2023-01-01T00:00:00Z",
    "updated_at": "2023-01-01T00:00:00Z"
  }
  ```

### 3.3 批量创建设备

批量创建指定数量的设备，自动生成序列号和MAC地址。

- **URL**: `/api/device/devices/batch_create/`
- **方法**: `POST`
- **认证**: 需要
- **请求体**:
  ```json
  {
    "device_type": 1,
    "batch": 1,
    "start_serial": "00001",
    "count": 100,
    "mac_prefix": "00:11:22"
  }
  ```
- **响应**:
  ```json
  {
    "status": "success",
    "message": "成功创建100个设备",
    "data": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 100]
  }
  ```

### 3.4 获取设备详情

根据ID获取设备详情。

- **URL**: `/api/device/devices/{id}/`
- **方法**: `GET`
- **参数**:
  - `id` (路径参数): 设备ID
- **认证**: 需要
- **响应**:
  ```json
  {
    "id": 1,
    "device_type": 1,
    "device_type_name": "智能音箱",
    "batch": 1,
    "batch_number": "BSP0101",
    "serial_number": "00001",
    "device_code": "SP0100001",
    "mac_address": "00:11:22:33:44:55",
    "is_active": false,
    "activated_at": null,
    "created_at": "2023-01-01T00:00:00Z",
    "updated_at": "2023-01-01T00:00:00Z"
  }
  ```

### 3.5 更新设备

更新现有设备。

- **URL**: `/api/device/devices/{id}/`
- **方法**: `PUT`
- **参数**:
  - `id` (路径参数): 设备ID
- **请求体**:
  ```json
  {
    "device_type": 1,
    "batch": 1,
    "serial_number": "00001",
    "mac_address": "00:11:22:33:44:55"
  }
  ```
- **认证**: 需要
- **响应**:
  ```json
  {
    "id": 1,
    "device_type": 1,
    "device_type_name": "智能音箱",
    "batch": 1,
    "batch_number": "BSP0101",
    "serial_number": "00001",
    "device_code": "SP0100001",
    "mac_address": "00:11:22:33:44:55",
    "is_active": false,
    "activated_at": null,
    "created_at": "2023-01-01T00:00:00Z",
    "updated_at": "2023-01-02T00:00:00Z"
  }
  ```

### 3.6 删除设备

删除现有设备。

- **URL**: `/api/device/devices/{id}/`
- **方法**: `DELETE`
- **参数**:
  - `id` (路径参数): 设备ID
- **认证**: 需要
- **响应**: 204 No Content

## 4. 用户设备管理

### 4.1 获取用户设备列表

获取当前用户绑定的所有设备列表。

- **URL**: `/api/device/user-devices/`
- **方法**: `GET`
- **认证**: 需要
- **响应**:
  ```json
  [
    {
      "id": 1,
      "user": 1,
      "device": 1,
      "device_code": "SP0100001",
      "device_type": "智能音箱",
      "nickname": "我的设备",
      "is_primary": true,
      "bound_at": "2023-01-01T00:00:00Z"
    }
  ]
  ```

### 4.2 绑定设备

将设备绑定到当前用户。

- **URL**: `/api/device/user-devices/bind/`
- **方法**: `POST`
- **认证**: 需要
- **请求体**:
  ```json
  {
    "mac_address": "00:11:22:33:44:55",
    "nickname": "我的设备",
    "is_primary": true
  }
  ```
- **响应**:
  ```json
  {
    "id": 1,
    "user": 1,
    "device": 1,
    "device_code": "SP0100001",
    "device_type": "智能音箱",
    "nickname": "我的设备",
    "is_primary": true,
    "bound_at": "2023-01-01T00:00:00Z"
  }
  ```

### 4.3 设置主要设备

将某个绑定的设备设置为主要设备。

- **URL**: `/api/device/user-devices/{id}/set_primary/`
- **方法**: `POST`
- **参数**:
  - `id` (路径参数): 用户设备关联ID
- **认证**: 需要
- **响应**:
  ```json
  {
    "status": "success",
    "message": "成功设置主要设备",
    "data": {
      "id": 1,
      "user": 1,
      "device": 1,
      "device_code": "SP0100001",
      "device_type": "智能音箱",
      "nickname": "我的设备",
      "is_primary": true,
      "bound_at": "2023-01-01T00:00:00Z"
    }
  }
  ```

### 4.4 解绑设备

解除用户与设备的绑定关系。

- **URL**: `/api/device/user-devices/{id}/`
- **方法**: `DELETE`
- **参数**:
  - `id` (路径参数): 用户设备关联ID
- **认证**: 需要
- **响应**: 204 No Content

## 5. 火山引擎Token管理

### 5.1 生成Token

为当前用户生成火山引擎Token，用于语音交互。

- **URL**: `/api/device/rtc-token/generate/`
- **方法**: `POST`
- **认证**: 需要
- **请求体**:
  ```json
  {
    "expire_time": 86400
  }
  ```
- **响应**:
  ```json
  {
    "status": "success",
    "message": "Token生成成功",
    "data": {
      "token": "示例Token字符串",
      "room_id": "12345678",
      "user_id": "1",
      "app_id": "xxxxxxxx",
      "expire_time": 86400,
      "task_id": "task-12345",
      "device_code": "SP0100001",
      "device_type": "智能音箱"
    }
  }
  ```

### 5.2 根据MAC地址获取Token

设备通过MAC地址获取Token，无需用户登录认证。

- **URL**: `/api/device/rtc-token/get_by_mac/`
- **方法**: `GET`
- **参数**:
  - `mac_address` (查询参数): 设备MAC地址
  - `expire_time` (查询参数, 可选): Token过期时间（秒）
- **认证**: 不需要
- **响应**:
  ```json
  {
    "status": "success",
    "message": "Token生成成功",
    "data": {
      "token": "示例Token字符串",
      "room_id": "12345678",
      "user_id": "1",
      "app_id": "xxxxxxxx",
      "expire_time": 86400,
      "task_id": "task-12345",
      "device_code": "SP0100001",
      "device_type": "智能音箱"
    }
  }
  ```

## 6. 消息管理

### 6.1 发送消息

发送消息到用户绑定的设备。

- **URL**: `/api/device/messages/`
- **方法**: `POST`
- **认证**: 需要
- **请求体**:
  ```json
  {
    "type": "text",
    "message": {
      "content": "你好，世界！"
    },
    "user_id": "1"
  }
  ```
- **响应**:
  ```json
  {
    "status": "success",
    "message": "消息已发送",
    "data": {
      "type": "text",
      "message": {
        "content": "你好，世界！"
      },
      "user_id": "1",
      "timestamp": "2023-01-01T00:00:00Z"
    }
  }
  ```

### 6.2 发送天气消息

发送天气查询消息到用户绑定的设备。

- **URL**: `/api/device/messages/`
- **方法**: `POST`
- **认证**: 需要
- **请求体**:
  ```json
  {
    "type": "weather",
    "message": {
      "city": "北京"
    },
    "user_id": "1"
  }
  ```
- **响应**:
  ```json
  {
    "status": "success",
    "message": "天气信息已发送",
    "data": {
      "city": "北京",
      "weather": "晴",
      "temperature": "25°C",
      "humidity": "50%",
      "wind": "东北风3级"
    }
  }
  ```

### 6.3 发送唱歌消息

发送唱歌指令到用户绑定的设备。

- **URL**: `/api/device/messages/`
- **方法**: `POST`
- **认证**: 需要
- **请求体**:
  ```json
  {
    "type": "sing",
    "message": {
      "song": "歌曲名称",
      "artist": "歌手名称"
    },
    "user_id": "1"
  }
  ```
- **响应**:
  ```json
  {
    "status": "success",
    "message": "唱歌指令已发送",
    "data": {
      "type": "sing",
      "message": {
        "song": "歌曲名称",
        "artist": "歌手名称"
      },
      "user_id": "1"
    }
  }
  ```

### 6.4 发送跳舞消息

发送跳舞指令到用户绑定的设备。

- **URL**: `/api/device/messages/`
- **方法**: `POST`
- **认证**: 需要
- **请求体**:
  ```json
  {
    "type": "dance",
    "message": {
      "dance": "舞蹈名称",
      "style": "舞蹈风格",
      "duration": "30秒"
    },
    "user_id": "1"
  }
  ```
- **响应**:
  ```json
  {
    "status": "success",
    "message": "跳舞指令已发送",
    "data": {
      "type": "dance",
      "message": {
        "dance": "舞蹈名称",
        "style": "舞蹈风格",
        "duration": "30秒"
      },
      "user_id": "1"
    }
  }
  ```

## 7. WebSocket 通信

### 7.1 WebSocket 连接

WebSocket 连接用于实时通信。

- **URL**: `ws://domain/api/device/messages/{user_id}/`
- **参数**:
  - `user_id` (路径参数): 用户ID
- **认证**: 通过查询参数 `token` 进行认证

### 7.2 WebSocket 消息格式

WebSocket 消息基本格式如下：

```json
{
  "type": "消息类型",
  "message": {
    // 消息内容，根据类型不同而不同
  },
  "user_id": "用户ID"
}
```

支持的消息类型：
- `text`: 文本消息
- `weather`: 天气查询
- `sing`: 唱歌指令
- `dance`: 跳舞指令

## 8. 错误响应

所有API在出错时会返回统一格式的错误响应：

```json
{
  "status": "error",
  "message": "错误信息",
  "code": "错误代码（可选）"
}
```

常见错误状态码：
- `400 Bad Request`: 请求参数错误
- `401 Unauthorized`: 未认证
- `403 Forbidden`: 无权限
- `404 Not Found`: 资源不存在
- `500 Internal Server Error`: 服务器内部错误

详细错误码及处理方法参见 [设备错误文档](device_errors.md) 