# EZOpenSDK HarmonyOS 设备管理

## 设备管理模块 import 参考

```typescript
import {
  EZOpenSDK,
  EZDeviceInfo,
  EZCameraInfo,
  EZSubDeviceInfo,
  EZError,
  EzvizSupportKit
} from '@ohos/EZOpenSDK'

// 注意：EZBusinessTool 不是 SDK 中的类，而是 Demo 工程中的辅助工具类。
// 它的核心作用是兼容子设备（EZSubDeviceInfo）的能力集查询。
// 使用时需将源码复制到自己的工程中。
import EZBusinessTool from '../businesstool/EZBusinessTool'
```

### EZBusinessTool 工具类核心逻辑

`EZBusinessTool` 在多个模块中被引用（设备管理、播放器、对讲、配网），需要开发者自行集成。核心逻辑：网关子设备的能力集挂载在 `EZSubDeviceInfo` 自身，而非父设备 `EZDeviceInfo`，因此需要做类型判断。

```typescript
import { EZCameraInfo, EZDeviceInfo, EZSubDeviceInfo, EzvizSupportKit } from '@ohos/EZOpenSDK'

export default class EZBusinessTool {
  /** 是否支持对讲（兼容子设备） */
  static isSupportTalk(deviceInfo: EZDeviceInfo | null, cameraInfo: EZCameraInfo | null): number {
    if (cameraInfo && cameraInfo instanceof EZSubDeviceInfo) {
      return EzvizSupportKit.isSupportTalk(cameraInfo.abilities)
    }
    if (!deviceInfo) return 0
    return EzvizSupportKit.isSupportTalk(deviceInfo.abilities)
  }

  /** 是否支持云台（兼容子设备） */
  static isSupportPTZ(deviceInfo: EZDeviceInfo | null, cameraInfo: EZCameraInfo | null): boolean {
    if (!deviceInfo) return false
    return EzvizSupportKit.isSupportPTZ(deviceInfo.abilities)
  }

  /** 是否支持回放倍率（兼容子设备） */
  static isSupportPlaybackRate(deviceInfo: EZDeviceInfo | null, cameraInfo: EZCameraInfo | null): boolean {
    if (!deviceInfo) return false
    return EzvizSupportKit.isSupportPlaybackRate(deviceInfo.abilities)
  }

  /** 是否支持SD卡录像下载（兼容子设备） */
  static isSupportSDRecordDownload(deviceInfo: EZDeviceInfo | null, cameraInfo: EZCameraInfo | null): boolean {
    if (!deviceInfo) return false
    return EzvizSupportKit.isSupportSDRecordDownload(deviceInfo.abilities)
  }

  /** 是否支持SD卡录像封面（兼容子设备） */
  static isSupportSdCover(deviceInfo: EZDeviceInfo | null, cameraInfo: EZCameraInfo | null): boolean {
    if (!deviceInfo) return false
    return EzvizSupportKit.isSupportSdCover(deviceInfo.abilities)
  }

  /** 是否支持双目多通道（兼容子设备） */
  static isSupportMultiChannel(deviceInfo: EZDeviceInfo | null, cameraInfo: EZCameraInfo | null): boolean {
    if (!deviceInfo) return false
    return EzvizSupportKit.isSupportMultiChannel(deviceInfo.abilities)
  }

  /** 是否支持内网直连倍速（兼容子设备） */
  static isSupportDirectInnerRelaySpeed(deviceInfo: EZDeviceInfo | null, cameraInfo: EZCameraInfo | null): boolean {
    if (!deviceInfo) return false
    return EzvizSupportKit.isSupportDirectInnerRelaySpeed(deviceInfo.abilities)
  }

  /** 获取设备热点前缀 */
  static getWiFiConfigPrefix(deviceHotSpot: number): string {
    switch (deviceHotSpot) {
      case 1: return 'SoftAP'
      case 2: return 'CAMGO'
      default: return 'EZVIZ'
    }
  }
}
```

## 一、获取设备列表

```typescript
// 基础设备列表
EZOpenSDK.getDeviceList(pageIndex, pageSize, (deviceList, totalCount, error) => {
  // deviceList 为 EZDeviceInfo 数组
})

// 包含子设备的设备列表
EZOpenSDK.getDeviceListEx(pageIndex, pageSize, (deviceList, totalCount, error) => {
})
```
- pageIndex 从 0 开始，pageSize 建议 20 以内

## 二、获取单个设备信息

```typescript
EZOpenSDK.getDeviceInfo(deviceSerial, (deviceInfo, error) => {
})

// 包含子设备
EZOpenSDK.getDeviceInfoEx(deviceSerial, (deviceInfo, error) => {
})
```

## 三、EZDeviceInfo 属性详解

### 基础属性
| 属性 | 类型 | 说明 |
|------|------|------|
| deviceSerial | string | 设备 9 位序列号，唯一标识 |
| deviceName | string | 设备名称 |
| deviceType | string | 设备型号 |
| category | string | 设备大类 |
| status | number | 在线状态：1-在线，2-不在线 |
| isEncrypt | number | 是否加密：0-不加密，1-加密 |
| defence | number | 布撤防状态 |
| deviceVersion | string | 设备固件版本号 |
| deviceCover | string | 设备封面图片 URL |
| cameraNum | number | 通道数量 |
| detectorNum | number | 探测器数量 |
| devProtoEnum | number | 设备协议版本号类型：0-非国标，6-国标 |
| supportExtShort | string | 设备短能力集原始字符串 |
| abilities | Array\<string\> | 设备能力集数组 |

### 关联对象
| 属性 | 类型 | 说明 |
|------|------|------|
| cameraInfo | Array\<EZCameraInfo\> | 通道列表 |
| detectorInfo | Array\<EZDetectorInfo\> | 探测器列表 |
| subDeviceInfo | Array\<EZSubDeviceInfo\> | 子设备列表（仅 Ex 接口返回） |

### 能力集查询

鸿蒙 SDK 通过 `EzvizSupportKit` 工具类查询设备能力集：

```typescript
import { EzvizSupportKit } from '@ohos/EZOpenSDK'

let supportPTZ = EzvizSupportKit.isSupportPTZ(deviceInfo.abilities)
let supportTalk = EzvizSupportKit.isSupportTalk(deviceInfo.abilities)
// 通用查询
let value = EzvizSupportKit.getSupportInt(index, deviceInfo.abilities)
```

| 方法 | 返回类型 | 说明 |
|------|---------|------|
| `isSupportTalk(abilities)` | number | 0-不支持，1-全双工，3-半双工，4-都支持 |
| `isSupportPTZ(abilities)` | boolean | 是否支持云台控制 |
| `isSupportZoom(abilities)` | boolean | 是否支持光学缩放 |
| `isSupportPlaybackRate(abilities)` | boolean | 是否支持倍数回放 |
| `isSupportDirectInnerRelaySpeed(abilities)` | boolean | 内网直连是否支持倍速 |
| `isSupportSDRecordDownload(abilities)` | boolean | 是否支持 SD 卡录像下载 |
| `isSupportSdCover(abilities)` | boolean | 是否支持 SD 卡视频封面 |
| `isSupportMultiChannel(abilities)` | boolean | 是否支持多通道（双目） |
| `getSupportInt(index, abilities)` | number | 通用能力集查询 |
| `getSupportValue(index, abilities)` | string | 通用能力集字符串查询 |

## 四、设备添加与删除

### 添加设备
```typescript
EZOpenSDK.addDevice(deviceSerial, verifyCode, (error) => {
  if (!error) {
    // 添加成功
  }
})
```

### 删除设备
```typescript
EZOpenSDK.deleteDevice(deviceSerial, (error) => {
})
```

## 五、设备信息修改

### 修改设备名称
```typescript
// 注意参数顺序：先 deviceName 后 deviceSerial
EZOpenSDK.setDeviceName(newName, deviceSerial, (error) => {
})
```

### 设备加密开关
```typescript
// 开启加密：verifyCode 传空字符串
EZOpenSDK.setDeviceEncryptStatus(deviceSerial, '', true, (error) => {
})

// 关闭加密：需要传入设备验证码
EZOpenSDK.setDeviceEncryptStatus(deviceSerial, verifyCode, false, (error) => {
})
```

### 布防状态设置
```typescript
EZOpenSDK.setDefence(true, deviceSerial, (error) => {
})
```

## 六、设备探测

用于添加设备之前查询设备信息：
```typescript
EZOpenSDK.probeDeviceInfo(deviceSerial, deviceType, (deviceInfo, error) => {
  if (error) {
    // 根据错误码处理
  } else {
    // 设备在线，可直接添加
  }
})
```

错误码处理：
| 错误码 | 含义 | 处理 |
|--------|------|------|
| 120020 | 设备在线，已被自己添加 | 提示用户 |
| 120021 | 设备在线，未被添加 | 可直接添加 |
| 120022 | 设备在线，已被别人添加 | 提示用户 |
| 120023 | 设备不在线，未被添加 | 需要配网 |
| 120024 | 设备不在线，已被别人添加 | 提示用户 |
| 120029 | 设备不在线，已被自己添加 | 需要配网 |
| 120002 | 设备不存在 | 需要配网 |

## 七、设备存储管理

### 获取存储状态
```typescript
EZOpenSDK.getStorageStatus(deviceSerial, (storageStatus, error) => {
  // storageStatus 为 EZStorageInfo 数组
})
```

### 格式化存储
```typescript
EZOpenSDK.formatStorage(deviceSerial, diskIndex, (error) => {
})
```

## 八、设备升级

### 获取版本信息
```typescript
EZOpenSDK.getDeviceVersion(deviceSerial, (version, error) => {
})
```

### 发起升级
```typescript
EZOpenSDK.upgradeDevice(deviceSerial, (error) => {
})
```

### 获取升级进度
```typescript
EZOpenSDK.getDeviceUpgradeStatus(deviceSerial, (status, error) => {
})
```

## 九、抓图（设备端）

给在线设备下发信令，让设备上传当前图片到云端（保留 2 小时），不要求在取流过程中：
```typescript
EZOpenSDK.captureCamera(deviceSerial, cameraNo, (url, error) => {
  // url 为图片地址
})
```

## 十、分享设备列表

```typescript
EZOpenSDK.getSharedDeviceList(pageIndex, pageSize, (deviceList, totalCount, error) => {
})
```
