# 设备模块开发文档

## 概述

设备模块主要负责设备的管理、用户设备绑定和设备交互功能，包括设备的批量创建、查询、绑定和解绑等操作。

## 数据模型

### 1. 设备类型 (DeviceType)

设备类型是设备的基本分类，用于区分不同种类的设备。

```python
class DeviceType(models.Model):
    name = models.CharField('类型名称', max_length=100, unique=True)
    code = models.CharField('类型代码', max_length=10, unique=True)
    description = models.TextField('类型描述', blank=True, null=True)
    created_at = models.DateTimeField('创建时间', auto_now_add=True)
    updated_at = models.DateTimeField('更新时间', auto_now=True)
```

### 2. 设备批次 (DeviceBatch)

设备批次用于管理设备的生产批次信息。

```python
class DeviceBatch(models.Model):
    device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE, verbose_name='设备类型', related_name='batches')
    batch_number = models.CharField('批次号', max_length=20, unique=True)
    production_date = models.DateField('生产日期')
    quantity = models.PositiveIntegerField('数量')
    description = models.TextField('批次描述', blank=True, null=True)
    created_at = models.DateTimeField('创建时间', auto_now_add=True)
    updated_at = models.DateTimeField('更新时间', auto_now=True)
```

### 3. 设备 (Device)

设备是核心实体，记录每台设备的详细信息。

```python
class Device(models.Model):
    device_type = models.ForeignKey(DeviceType, on_delete=models.CASCADE, verbose_name='设备类型', related_name='devices')
    batch = models.ForeignKey(DeviceBatch, on_delete=models.CASCADE, verbose_name='设备批次', related_name='devices')
    serial_number = models.CharField('序列号', max_length=50)
    device_code = models.CharField('设备码', max_length=100, unique=True)
    mac_address = models.CharField('MAC地址', max_length=17, unique=True)
    is_active = models.BooleanField('是否激活', default=False)
    activated_at = models.DateTimeField('激活时间', null=True, blank=True)
    created_at = models.DateTimeField('创建时间', auto_now_add=True)
    updated_at = models.DateTimeField('更新时间', auto_now=True)
```

### 4. 用户设备 (UserDevice)

用户设备关联表，记录用户与设备的绑定关系。

```python
class UserDevice(models.Model):
    user = models.ForeignKey(ParadiseUser, on_delete=models.CASCADE, verbose_name='用户', related_name='devices')
    device = models.ForeignKey(Device, on_delete=models.CASCADE, verbose_name='设备', related_name='users')
    nickname = models.CharField('设备昵称', max_length=100, blank=True, null=True)
    bound_at = models.DateTimeField('绑定时间', auto_now_add=True)
    is_primary = models.BooleanField('是否主要设备', default=False)
```

## API 接口

设备模块提供以下RESTful API接口：

### 1. 设备类型管理

- **获取设备类型列表**: `GET /api/device-types/`
- **创建设备类型**: `POST /api/device-types/`
- **获取设备类型详情**: `GET /api/device-types/{id}/`
- **更新设备类型**: `PUT /api/device-types/{id}/`
- **删除设备类型**: `DELETE /api/device-types/{id}/`

### 2. 设备批次管理

- **获取设备批次列表**: `GET /api/device-batches/`
- **创建设备批次**: `POST /api/device-batches/`
- **获取设备批次详情**: `GET /api/device-batches/{id}/`
- **更新设备批次**: `PUT /api/device-batches/{id}/`
- **删除设备批次**: `DELETE /api/device-batches/{id}/`

### 3. 设备管理

- **获取设备列表**: `GET /api/devices/`
- **创建单个设备**: `POST /api/devices/`
- **批量创建设备**: `POST /api/devices/batch_create/`
- **获取设备详情**: `GET /api/devices/{id}/`
- **更新设备**: `PUT /api/devices/{id}/`
- **删除设备**: `DELETE /api/devices/{id}/`

### 4. 用户设备管理

- **获取用户设备列表**: `GET /api/user-devices/`
- **绑定设备**: `POST /api/user-devices/bind/`
- **设置主要设备**: `POST /api/user-devices/{id}/set_primary/`
- **解绑设备**: `DELETE /api/user-devices/{id}/`

### 5. 火山引擎Token管理

- **生成Token**: `POST /api/rtc-token/generate/`
- **根据设备MAC地址获取Token**: `GET /api/rtc-token/get_by_mac/?mac_address=00:11:22:33:44:55`
  - 无需鉴权，设备可直接调用
  - 必须提供有效的设备MAC地址
  - 设备必须已绑定到用户
  - 可选参数 `expire_time` 指定Token过期时间（秒）

## 批量创建设备

批量创建设备支持两种方式：

### 1. 通过API接口

```http
POST /api/devices/batch_create/
Content-Type: application/json

{
  "device_type": 1,
  "batch": 1,
  "start_serial": "00001",
  "count": 100,
  "mac_prefix": "00:11:22"
}
```

### 2. 通过管理命令

详见 [设备管理命令文档](device_commands.md)

## 用户绑定设备流程

1. 用户购买设备后，通过扫描设备MAC地址或输入设备码绑定设备
2. 调用绑定API接口：

```http
POST /api/user-devices/bind/
Content-Type: application/json

{
  "mac_address": "00:11:22:33:44:55",
  "nickname": "我的设备",
  "is_primary": true
}
```

3. 绑定成功后，设备状态会被标记为激活，并记录激活时间
4. 用户可以通过设置主要设备接口将某个设备设为主要设备

## 开发示例

### 创建设备类型

```python
from device_interaction.models import DeviceType

device_type = DeviceType.objects.create(
    name="智能音箱",
    code="SP01",
    description="AI智能音箱设备"
)
```

### 创建设备批次

```python
from device_interaction.models import DeviceType, DeviceBatch
from django.utils import timezone

device_type = DeviceType.objects.get(code="SP01")
batch = DeviceBatch.objects.create(
    device_type=device_type,
    batch_number="BSP0101",
    production_date=timezone.now().date(),
    quantity=500,
    description="第一批智能音箱"
)
```

### 创建设备

```python
from device_interaction.models import DeviceType, DeviceBatch, Device

device_type = DeviceType.objects.get(code="SP01")
batch = DeviceBatch.objects.get(batch_number="BSP0101")

device = Device.objects.create(
    device_type=device_type,
    batch=batch,
    serial_number="00001",
    mac_address="00:11:22:33:44:55"
)
```

### 绑定设备到用户

```python
from device_interaction.models import Device, UserDevice
from userapp.models import ParadiseUser

user = ParadiseUser.objects.get(username="example_user")
device = Device.objects.get(mac_address="00:11:22:33:44:55")

user_device = UserDevice.objects.create(
    user=user,
    device=device,
    nickname="客厅音箱",
    is_primary=True
)
```

## 注意事项

1. 设备码格式为：类型代码-批次号-序列号，如 "SP01-BSP0101-00001"
2. MAC地址必须是有效格式，推荐使用冒号分隔的十六进制格式，如 "00:11:22:33:44:55"
3. 每个用户可以绑定多个设备，但每个设备只能被一个用户绑定
4. 设备激活时间在首次绑定时自动设置
5. 用户可以指定一个主要设备，如不指定，第一个绑定的设备将自动设为主要设备

## 相关文档

- [设备管理命令文档](device_commands.md) - 设备管理命令的使用说明
- [设备错误文档](device_errors.md) - 设备模块错误代码和处理方法 