---
name: "createDpKit"
mode: "api"
versionRequirements:
  - { name: "@ray-js/panel-sdk", version: "1.7.0" }
title: "createDpKit - 创建 dp-kit 实例"
summary: "createDpKit 是 @ray-js/panel-sdk 提供的函数，用于创建 dp-kit 实例，通过 createDpKit 创建。核心能力包括：通过 protocols 自定义 parser/formatter，自动解析/反解析复杂类型 DP（如 colour_data→hue/saturation/value）；sendDpOption 支持 throttle 节流、debounce 防抖、delay 延迟、checkRepeat 重复过滤、ordered 顺序下发；immediate 即时更新（下发后立即刷新 UI 无需等待上报）；ignoreDpDataResponse 忽略设备上报响应（支持 whiteDpCodes 白名单、timeout 防抖超时、customRule 自定义规则）；synchronizeDevProperty 云端 DP 状态同步（支持 blackDpCodes 黑名单、defaultState 默认值）；onBeforeSendDp/onAfterSendDp 下发前后钩子。搭配 useStructuredProps/useStructuredActions 使用。typings/sdm.d.ts 提供全局 TS 类型声明。"
---

## createDpKit

> [VERSION] @ray-js/panel-sdk >= 1.7.0

> 💡 createDpKit 返回的 interceptors 需传入 SmartDeviceModel 构造选项，
> 搭配 useStructuredProps / useStructuredActions 使用时还需在设备初始化后调用 init。

### 描述

创建 DP 协议套件，提供功能点的结构化解析、下发拦截、节流/防抖等增强能力

### 参数

`Params`

| 参数 | 类型 | 必填 | 描述 |
| --- | --- | --- | --- |
| `option` | `CreateDpKitOptions` | 否 | dp-kit 配置选项 |

### 返回值

类型: `CreateDpKitResult`

dp-kit 实例，包含 init、interceptors、destroy 等方法

**`type` CreateDpKitResult**

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `init` | `(device: any) => void` | 初始化设备状态，在需要搭配 useStructuredProps 时须在设备模型初始化完毕后调用 |
| `interceptors` | `Record<string, any>` | dp-kit 默认拦截器配置 |
| `onDeviceInfoUpdated` | `(ctx: any) => (next: (data: any) => any) => (data: any) => any` | dp-kit onDeviceInfoUpdated 拦截器，如需单独搭配使用时可考虑 |
| `onDpDataChange` | `(ctx: any) => (next: (data: any) => any) => (data: any) => any` | dp-kit onDpDataChange 拦截器，如需单独搭配使用时可考虑 |
| `publishDps` | `(ctx: any) => (next: (dpState: Record<string, any>, options?: SendDpOption) => any) => (dpState: Record<string, any>, options?: SendDpOption) => any` | dp-kit publishDps 拦截器，如需单独搭配使用时可考虑 |
| `destroy` | `() => void` | 销毁 dp-kit，清理 flush 定时器、节流和防抖映射等资源。 应在 SmartDeviceModel 销毁时调用（如 SdmProvider 的 useEffect cleanup 中） |

### 引用对象

##### `type` CreateDpKitOptions

createDpKit 的配置项，统一描述协议解析、全局下发选项与前后置 hooks。

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `protocols` | `Record<string, CustomRawDpMap>` | DP 协议映射表，将复合字符串类型的 DP（如 colour_data）拆解为结构化对象。 key 为 dpCode，value 为自定义 Transformer  需实现 parser/formatter：`{ colour_data: new ColourTransformer() }`  - parser(raw: string) => T — 将设备上报的原始字符串解析为结构化对象 - formatter(data: T) => string — 将结构化对象序列化为下发给设备的字符串  注册后可通过 useStructuredProps / useStructuredActions 读写结构化数据 |
| `sendDpOption` | `SendDpOption` | DP 下发选项 |
| `onBeforeSendDp` | `(dpState: DpState) => any` | 下发 DP 前的钩子 |
| `onAfterSendDp` | `(dpState: DpState) => any` | 下发 DP 前的钩子 |

##### `type` CreateDpKitResult

createDpKit 的返回结果，包含一组可直接挂到 SmartDeviceModel 的拦截器，
以及初始化结构化 DP 状态所需的 `init` / `destroy` 生命周期方法。

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `init` | `(device: any) => void` | 初始化设备状态，在需要搭配 useStructuredProps 时须在设备模型初始化完毕后调用 |
| `interceptors` | `Record<string, any>` | dp-kit 默认拦截器配置 |
| `onDeviceInfoUpdated` | `(ctx: any) => (next: (data: any) => any) => (data: any) => any` | dp-kit onDeviceInfoUpdated 拦截器，如需单独搭配使用时可考虑 |
| `onDpDataChange` | `(ctx: any) => (next: (data: any) => any) => (data: any) => any` | dp-kit onDpDataChange 拦截器，如需单独搭配使用时可考虑 |
| `publishDps` | `(ctx: any) => (next: (dpState: Record<string, any>, options?: SendDpOption) => any) => (dpState: Record<string, any>, options?: SendDpOption) => any` | dp-kit publishDps 拦截器，如需单独搭配使用时可考虑 |
| `destroy` | `() => void` | 销毁 dp-kit，清理 flush 定时器、节流和防抖映射等资源。 应在 SmartDeviceModel 销毁时调用（如 SdmProvider 的 useEffect cleanup 中） |

##### `type` CustomRawDpMap

自定义 DP 协议转换器，用于将原始 DP 字符串与结构化对象互转。
适用于 raw/string 类型的复合 DP（如灯的 colour_data "00ff003e8"），
将单个字符串拆解为多个语义字段（如 { hue, saturation, value }）。

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `parser` | `(dpValue: string) => any` | 将设备上报的原始 DP 字符串解析为结构化对象 |
| `formatter` | `(parsedDpValue: any) => string` | 将结构化对象序列化为下发给设备的 DP 字符串 |

##### `type` SendDpOption

DP 下发选项，可作为 createDpKit 的全局默认配置，也可在单次 publishDps / action 调用时覆盖。
全局 `sendDpOption` 适合声明产品级默认行为；
单次下发传入的 options 适合临时覆盖节流、防抖、协议解析或乐观更新策略。
注：依赖 dp-kit 拦截器才可使用。

| 属性 | 类型 | 最低版本 | 描述 |
| --- | --- | --- | --- |
| `immediate` | `boolean` | - | 是否立即触发 state 更新，必须依赖 dp-kit 拦截器才可使用 |
| `ignoreDpDataResponse` | `boolean \| IgnoreDpChangeInterceptorOptions` | `1.11.0` | 是否忽略 DP 功能点上报，默认 false |
| `synchronizeDevProperty` | `boolean \| DevPropInterceptorOptions` | `1.11.0` | 是否将 dpData 和云端设备属性同步，默认 false |
| `ordered` | `boolean` | - | 多个 DP 是否按对象里的顺序下发，必须依赖 dp-kit 拦截器才可使用，默认 false |
| `checkRepeat` | `boolean` | - | 是否进行重复值判断不下发，必须依赖 dp-kit 拦截器才可使用，默认 false 与当前 `dpState` 进行比较，重复值检出不下发 |
| `delay` | `number` | - | 延迟下发，必须依赖 dp-kit 拦截器才可使用，默认 0，单位 ms |
| `throttle` | `number` | - | 下发节流 (与防抖冲突)，必须依赖 dp-kit 拦截器才可使用，默认 0，单位 ms |
| `debounce` | `number` | - | 下发防抖 (与节流冲突)，必须依赖 dp-kit 拦截器才可使用，默认 0，单位 ms |
| `protocols` | `Record<string, CustomRawDpMap>` | - | 单次下发时临时指定的 DP 协议转换器，必须依赖 dp-kit 拦截器才可使用。 key 为 dpCode，value 为 `{ parser, formatter }` 对象： - parser(dpValue: string) => any — 将原始 DP 字符串解析为结构化对象 - formatter(parsedValue: any) => string — 将结构化对象序列化为 DP 字符串 仅影响本次调用，不覆盖 createDpKit 中的全局 protocols 配置 |

##### `type` DpState

功能点状态对象，key 为功能点 code，value 为功能点值

```typescript
export type DpState = Record<string, DpValue>;
```

##### `type` SmartDeviceModelInterceptors

SmartDeviceModel 拦截器配置类型，供 dp-kit / matter-kit 组合使用。

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `onInit` | `(instance: SmartDeviceModel) => void` | 设备模型初始化完毕触发的回调 |
| `init` | `Object` | 设备模型初始化拦截器配置 |
| `request` | `Object` | 请求拦截器配置 |
| `response` | `Object` | 响应拦截器配置 |

##### `type` OnDeviceInfoUpdatedInterceptor

```typescript
export type OnDeviceInfoUpdatedInterceptor<
  S extends ReadonlyDpSchemaList = any,
  P = DeviceInfoUpdatedParams
> = Interceptor<S, P, DeviceInfoUpdatedParams>;
```

##### `type` OnDpDataChangeInterceptor

```typescript
export type OnDpDataChangeInterceptor<
  S extends ReadonlyDpSchemaList = any,
  P = DpDataChangeParams
> = Interceptor<S, P, DpDataChangeParams>;
```

##### `type` PublishDpsInterceptor

```typescript
export type PublishDpsInterceptor<
  S extends ReadonlyDpSchemaList = any,
  P extends any[] = Parameters<typeof publishDps>
> = (
  context: Context<S>
) => (next: (...params: P) => any) => (...params: Parameters<typeof publishDps>) => any;
```

##### `type` IgnoreDpChangeInterceptorOptions

忽略 DP 数据变化拦截器的配置选项

用于配置智能设备面板中 DP 上报事件的防抖机制，避免面板操作后的
即时响应干扰用户体验或业务逻辑

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `whiteDpCodes` | `string[]` | 白名单 dp，不会忽略上报 |
| `timeout` | `number` | 防抖超时检查，毫秒，默认为 5000 - 从面板下发 dp 到收到 dp 回复之间的最大时间，超过此时间才会触发 dpDataChange。 - 用于 dp 上报事件的防抖 |
| `customRule` | `(dpState: DpState, lastSendTimestamp: number) => boolean` | 自定义忽略规则 > 优先级最高，配置了自定义规则后，whiteDpCodes 和 timeout 项将无效 |

##### `type` DevPropInterceptorOptions

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `blackDpCodes` | `string[]` | 黑名单 dp，不会同步到云端 |
| `defaultState` | `DpState` | 首次进入时，默认的设备状态, 支持异步初始化 |
| `throttle` | `number` | 下发节流，毫秒，默认为 0 如果设置为 0，则不进行节流。 |

##### `type` DpValue

功能点值类型，可能为 boolean、number、string

```typescript
export type DpValue = boolean | number | string;
```

##### `type` InitDpStateInterceptor

```typescript
export type InitDpStateInterceptor<
  S extends ReadonlyDpSchemaList = any,
  P = InitDpStateInterceptorParams
> = Interceptor<S, P, InitDpStateInterceptorParams>;
```

##### `type` InitDevInfoInterceptor

```typescript
export type InitDevInfoInterceptor<
  S extends ReadonlyDpSchemaList = any,
  P = {
    devInfo: GetSmartDeviceModelDevInfo<any>;
    action: InitDevInfoInterceptorAction;
  }
> = Interceptor<
  S,
  P,
  {
    devInfo: GetSmartDeviceModelDevInfo<any>;
    action: InitDevInfoInterceptorAction;
  }
>;
```

##### `type` OnDeviceOnlineStatusUpdateInterceptor

```typescript
export type OnDeviceOnlineStatusUpdateInterceptor<
  S extends ReadonlyDpSchemaList = any,
  P = DeviceOnlineStatusUpdateParams
> = Interceptor<S, P, DeviceOnlineStatusUpdateParams>;
```

##### `type` OnNetworkStatusChangeInterceptor

```typescript
export type OnNetworkStatusChangeInterceptor<
  S extends ReadonlyDpSchemaList = any,
  P = NetworkStatusChangeParams
> = Interceptor<S, P, NetworkStatusChangeParams>;
```

##### `type` OnBluetoothAdapterStateChangeInterceptor

```typescript
export type OnBluetoothAdapterStateChangeInterceptor<
  S extends ReadonlyDpSchemaList = any,
  P = BluetoothAdapterStatusChangeParams
> = Interceptor<S, P, BluetoothAdapterStatusChangeParams>;
```

##### `type` SmartDeviceModelAbility

SmartDeviceModel 的 abilities 容器类型，仅用于泛型约束与内部组合。

```typescript
export type SmartDeviceModelAbility<A extends SmartDeviceAbility = SmartDeviceAbility> = {
  [abilityName: string]: A;
};
```

##### `type` PublishDpsOptions

publishDps 的底层选项类型，供 SDK 内部请求链复用。

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `devInfo` | `DevInfo` |  |

##### `interface` DpSchema

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `attr` | `number` | 功能点属性标位，用于扩展功能点的附加能力标识 |
| `canTrigger` | `boolean` | 是否可作为自动化触发条件 |
| `code` | `string` | 功能点标识码，如 switch |
| `defaultRecommend` | `boolean` | 是否为默认推荐的功能点 |
| `editPermission` | `boolean` | 是否具有编辑权限 |
| `executable` | `boolean` | 是否可执行下发 |
| `extContent` | `string` | 功能点扩展内容，通常为 JSON 字符串 |
| `iconname` | `string` | 功能点图标名称 |
| `id` | `string \| number` | 功能点 ID |
| `mode` | `"rw" \| "ro" \| "wr"` | 功能点模式类型 rw: 可下发可上报（可读可写） ro: 只可上报（仅可读） wr: 只可下发（仅可写） |
| `name` | `string` | 功能点名称，一般用于语音等场景 |
| `property` | `Object` | 功能点属性 |
| `type` | `"raw" \| "obj"` | 功能点数据类型大类：raw 为原始字节流，obj 为结构化对象 |

##### `type` InitDpStateInterceptorParams

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `dpState` | `DpState` | 当前设备功能点状态 |
| `newDpState` | `DpState` | 新的设备功能点状态 |
| `action` | `"init" \| "onDpDataChange" \| "onDeviceInfoUpdated" \| "dp-kit"` | 拦截器动作 |

##### `type` GetSmartDeviceModelDevInfo

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `dpCodes` | `object` |  |
| `dps` | `object` |  |
| `idCodes` | `object` |  |
| `codeIds` | `object` |  |
| `schema` | `S` |  |

##### `type` DevInfo

设备信息

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `idCodes` | `Record<string, string>` | dp id 与 dp code 的映射 |
| `codeIds` | `Record<string, string>` | dp code 与 dp id 的映射 |
| `capability` | `Capability` | 产品通讯能力标位，按二进制位运算的方式进行判断计算，如 Wi-Fi、Bluetooth、ZigBee、SigMesh 等  - Wi-Fi (bit 0, 十进制值: 1): wifi无线 - Cable (bit 1, 十进制值: 2): 有线 - GPRS (bit 2, 十进制值: 4): 类似2g网络 - NB-IoT (bit 3, 十进制值: 6): 物联网卡网络 - Bluetooth (bit 10, 十进制值: 1024): 蓝牙单点 - BLEMesh (bit 11, 十进制值: 2048): 蓝牙私有mesh - ZigBee (bit 12, 十进制值: 4096): 2.4g频段 - Infrared (bit 13, 十进制值: 8192): 红外 - 433 (subpieces) (bit 14, 十进制值: 16384): 433mhz - SigMesh (bit 15, 十进制值: 32768): 蓝牙标准Mesh - MCU (bit 16, 十进制值: 65536): mcu - SMesh (bit 17, 十进制值: 131072): 类似ZigBee - Cat1 (bit 20, 十进制值: 1048576): 通常使用3g网络 - Beacon (bit 21, 十进制值: 2097152): 蓝牙Beacon - Thread (bit 25, 十进制值: 33554432): Thread能力 |
| `devAttribute` | `DevAttribute` | 设备能力标位，由固件上报 位数含义: - 第 1 位 (bit 0): 设备是否支持免配网 - 第 2 位 (bit 1): 设备支持 dp query 31 号协议查询 - 第 3 位 (bit 2): 设备是否具有本地联动能力 - 第 4 位 (bit 3): 设备是否支持 WIFI 扫描 - 第 5 位 (bit 4): 设备是否支持 Google Local Home - 第 6 位 (bit 5): 设备是否支持闪电配网能力 - 第 7 位 (bit 6): 设备是否支持蓝牙控制 - 第 8 位 (bit 7): 设备是否支持安防能力 - 第 9 位 (bit 8): 设备是否是共享设备 - 第 10 位 (bit 9): 设备是否支持日出日落定时 - 第 11 位 (bit 10): 设备是否支持故障替换能力 - 第 12 位 (bit 11): 设备是否支持 OTA - 第 13 位 (bit 12): 设备是否支持 WIFI 备用切换 - 第 15 位 (bit 14): 设备支持涂鸦标准协议 - 第 16 位 (bit 15): 设备支持自定义透传 - 第 17 位 (bit 16): 设备是否支持行业能力 |
| `schema` | `DpSchema[]` | 产品信息，schema，功能定义都在里面 |
| `panelConfig` | `PanelConfig` | 面板云配置 |

##### `type` DpId

```typescript
type DpId = number;
```

##### `type` Capability

产品通讯能力标位，按二进制位运算的方式进行判断计算，如 Wi-Fi、Bluetooth、ZigBee、SigMesh 等

- Wi-Fi (bit 0, 十进制值: 1): wifi无线
- Cable (bit 1, 十进制值: 2): 有线
- GPRS (bit 2, 十进制值: 4): 类似2g网络
- NB-IoT (bit 3, 十进制值: 6): 物联网卡网络
- Bluetooth (bit 10, 十进制值: 1024): 蓝牙单点
- BLEMesh (bit 11, 十进制值: 2048): 蓝牙私有mesh
- ZigBee (bit 12, 十进制值: 4096): 2.4g频段
- Infrared (bit 13, 十进制值: 8192): 红外
- 433 (subpieces) (bit 14, 十进制值: 16384): 433mhz
- SigMesh (bit 15, 十进制值: 32768): 蓝牙标准Mesh
- MCU (bit 16, 十进制值: 65536): mcu
- SMesh (bit 17, 十进制值: 131072): 类似ZigBee
- Cat1 (bit 20, 十进制值: 1048576): 通常使用3g网络
- Beacon (bit 21, 十进制值: 2097152): 蓝牙Beacon
- Thread (bit 25, 十进制值: 33554432): Thread能力

```typescript
export type Capability = number;
```

##### `type` DevAttribute

设备能力标位，由固件上报

位数含义:
- 第 1 位 (bit 0): 设备是否支持免配网
- 第 2 位 (bit 1): 设备支持 dp query 31 号协议查询
- 第 3 位 (bit 2): 设备是否具有本地联动能力
- 第 4 位 (bit 3): 设备是否支持 WIFI 扫描
- 第 5 位 (bit 4): 设备是否支持 Google Local Home
- 第 6 位 (bit 5): 设备是否支持闪电配网能力
- 第 7 位 (bit 6): 设备是否支持蓝牙控制
- 第 8 位 (bit 7): 设备是否支持安防能力
- 第 9 位 (bit 8): 设备是否是共享设备
- 第 10 位 (bit 9): 设备是否支持日出日落定时
- 第 11 位 (bit 10): 设备是否支持故障替换能力
- 第 12 位 (bit 11): 设备是否支持 OTA
- 第 13 位 (bit 12): 设备是否支持 WIFI 备用切换
- 第 15 位 (bit 14): 设备支持涂鸦标准协议
- 第 16 位 (bit 15): 设备支持自定义透传
- 第 17 位 (bit 16): 设备是否支持行业能力

```typescript
export type DevAttribute = number;
```

##### `interface` PanelConfig

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `bic` | `CloudConfig[]` | 云定时和跳转链接配置 |
| `fun` | `FunConfig` | 功能配置 |

##### `interface` JumpUrlConfig

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `code` | `"jump_url"` | 跳转链接配置代码 |
| `description` | `string` | 跳转链接配置描述 |
| `name` | `string` | 跳转链接配置名称 |
| `selected` | `boolean` | 跳转链接配置是否选中 |

##### `interface` TimerConfig

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `code` | `"timer"` | 云定时配置代码 |
| `description` | `string` | 云定时配置描述 |
| `name` | `string` | 云定时配置名称 |
| `selected` | `boolean` | 云定时配置是否选中 |

##### `interface` FunConfig

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `tyabirysr4` | `string` | 背景色，当前仅涂鸦官方小程序支持 |
| `tyabirysr4_app` | `"follow" \| "--app-B1"` | 背景色跟随策略，follow 代表跟随 App，否则代表要替换的 App 变量路径，当前仅涂鸦官方小程序支持 |
| `tyabis5d9w` | `string` | 主题色，当前仅涂鸦官方小程序支持 |
| `tyabis5d9w_app` | `"follow" \| "--app-M1"` | 主题色跟随策略，follow 代表跟随 App，否则代表要替换的 App 变量路径，当前仅涂鸦官方小程序支持 |

##### `interface` CloudConfig

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `jump_url` | `JumpUrlConfig` | 跳转链接配置 |
| `timer` | `TimerConfig` | 云定时配置 |

##### `type` SmartDeviceModelInterceptors.init

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `initDpState` | `InitDpStateInterceptor[]` | DP 状态转换拦截器，在以下时机被调用： - 模型初始化时（action: 'init'） - dp 数据变化时（action: 'onDpDataChange' \| 'dp-kit'） - 设备信息更新时（action: 'onDeviceInfoUpdated'） 拦截器接收完整的 dpState 和本次变更的 newDpState，返回处理后的 dpState |
| `initDevInfo` | `InitDevInfoInterceptor[]` | 设备信息转换拦截器，在以下时机被调用： - 模型初始化时（action: 'init'） - 设备在线状态变化时（action: 'onDeviceOnlineStatusUpdate'） - 设备信息更新时（action: 'onDeviceInfoUpdated'） |

##### `type` SmartDeviceModelInterceptors.request

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `publishDps` | `PublishDpsInterceptor[]` | 下发 DP 拦截器，在以下时机被调用： - 下发 DP 时（action: 'publishDps'） 拦截器接收完整的 dpState 和本次变更的 newDpState，返回处理后的 dpState |

##### `type` SmartDeviceModelInterceptors.response

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `onDpDataChange` | `OnDpDataChangeInterceptor[]` | DP 数据变化拦截器，在以下时机被调用： - dp 数据变化时（action: 'onDpDataChange'） 拦截器接收完整的 dpState 和本次变更的 newDpState，返回处理后的 dpState |
| `onDeviceOnlineStatusUpdate` | `OnDeviceOnlineStatusUpdateInterceptor[]` | 设备在线状态变化拦截器，在以下时机被调用： - 设备在线状态变化时（action: 'onDeviceOnlineStatusUpdate'） 拦截器接收完整的 dpState 和本次变更的 newDpState，返回处理后的 dpState |
| `onDeviceInfoUpdated` | `OnDeviceInfoUpdatedInterceptor[]` | 设备信息更新拦截器，在以下时机被调用： - 设备信息更新时（action: 'onDeviceInfoUpdated'） 拦截器接收完整的 dpState 和本次变更的 newDpState，返回处理后的 dpState |
| `onNetworkStatusChange` | `OnNetworkStatusChangeInterceptor[]` | 网络状态变化拦截器，在以下时机被调用： - 网络状态变化时（action: 'onNetworkStatusChange'） 拦截器接收完整的 dpState 和本次变更的 newDpState，返回处理后的 dpState |
| `onBluetoothAdapterStateChange` | `OnBluetoothAdapterStateChangeInterceptor[]` | 蓝牙状态变化拦截器，在以下时机被调用： - 蓝牙状态变化时（action: 'onBluetoothAdapterStateChange'） 拦截器接收完整的 dpState 和本次变更的 newDpState，返回处理后的 dpState |

##### `type` DpSchema.property

| 属性 | 类型 | 描述 |
| --- | --- | --- |
| `type` | `"string" \| "bool" \| "value" \| "enum" \| "bitmap" \| "raw"` | 功能点类型 |
| `range` | `string[] \| string[]` | 枚举值范围，type = enum 时才存在 |
| `label` | `string[] \| string[]` | 故障型标签列表，type = bitmap 时才存在 |
| `maxlen` | `number` | 故障型最大长度，type = bitmap 时才存在 |
| `unit` | `string` | 数值型单位，type = value 时才存在 |
| `min` | `number` | 数值型最小值，type = value 时才存在 |
| `max` | `number` | 数值型最大值，type = value 时才存在 |
| `scale` | `number` | 数值型精度，type = value 时才存在 |
| `step` | `number` | 数值型步长，type = value 时才存在 |


### 示例代码

#### 基础用法

```ts
import { SmartDeviceModel, createDpKit } from '@ray-js/panel-sdk';

const schema = [
  { code: 'switch_1', type: 'bool' },
  { code: 'colour_data', type: 'raw' },
] as const;

const dpKit = createDpKit<typeof schema>({
  protocols: {
    colour_data: {
      parser: raw => JSON.parse(raw),
      formatter: structured => JSON.stringify(structured),
    },
  },
});

const sdm = new SmartDeviceModel<typeof schema>({
  interceptors: dpKit.interceptors,
});

await sdm.init();
dpKit.init(sdm);
```

#### 带协议解析和节流

```ts
const dpKit = createDpKit<typeof schema>({
  protocols: {
    colour_data: {
      parser: raw => JSON.parse(raw),
      formatter: value => JSON.stringify(value),
    },
  },
  sendDpOption: {
    throttle: 300,
  },
});

const device = new SmartDeviceModel<typeof schema>({
  interceptors: dpKit.interceptors,
});

await device.init();
dpKit.init(device);

// 后续所有下发都会继承 300ms 节流
await device.publishDps({
  colour_data: { hue: 240, saturation: 1000, value: 1000 },
});
```

#### 忽略设备上报响应

```ts
const dpKit = createDpKit<typeof schema>({
  sendDpOption: {
    immediate: true,
    ignoreDpDataResponse: {
      timeout: 5000,
      whiteDpCodes: ['switch_1'],
    },
  },
});

const device = new SmartDeviceModel<typeof schema>({
  interceptors: dpKit.interceptors,
});
```

#### 搭配 hooks 使用

```tsx
import { useStructuredActions, useStructuredProps } from '@ray-js/panel-sdk';

const colour = useStructuredProps(props => props.colour_data);
const actions = useStructuredActions();

actions.colour_data.set({
  hue: colour.hue,
  saturation: colour.saturation,
  value: 800,
});
```
