{"version":3,"sources":["../src/manager/bluetoothManager.ts","../src/utils/errorUtils.ts","../src/handler/connectHandler.ts","../src/handler/dataHandler.ts","../src/handler/scanHandler.ts","../src/extension/utils/index.js","../src/extension/utils/sm4.js","../src/extension/index.js","../src/handler/auth/modules/cat1LockAuthHandler.ts","../src/handler/auth/utils/bluetoothSdk.js","../src/index.ts"],"names":["dataConversion","permisson","SDKLogger","SDKLogLevel","errorUtils_default","error","_error","_tipMsg","ConnectHandler","communication","device","isOTA","res","mtu","deviceInfo","that","deviceId","resolve","isExecCallback","callback","__async","resFun","date","services","e","serviceId","characteristics","hasNotifyUUID","bleDeviceCharacteristicsMap","characteristicItem","obj","err","DataHandler","protocolComponent","_a","_b","processedData","index","c","characteristicId","data","realData","realMTU","dataLen","blockCount","i","mBlockData","noBlockData","sendDataTask","SendDataTask","handleCallback","dataInfoArray","dataInfo","ScanHandler","scanTime","enableSearchUnnamedBle","interval","devices","deviceAddress","item","BluetoothManager","BluetoothCallbackManager","scanCallback","logLevel","connectCallback","isNeedAuth","isAutoConnectDevices","isHasAuth","cat1LockAuthHandler","locationAuthorized","bluetoothAuthorized","locationEnabled","bluetoothEnabled","message","code","canScan","reject","_c","_d","_e","onConnectDeviceBefore","connectedDevice","communicationService","communicationWriteCharacteristic","communicationReadCharacteristic","_f","_devices","dev","acceptDataCallback","cat1LockAuthCallback","hexStr","utils_exports","__export","Chinese","Dispense","HighLowConversion","ab2hex","ab2hex2","abToA","advertisData","binaryReverse","binaryToHex","checkSum","checkSumValue","dateTime2unixHex","dealMAC","decimalToBinary","decimalToHex","getRandomNum","getSm4Value","hex2Array","hex2Buff","hexReverse","hexToDecimal","highLowBitCV","openKeyEctopicOr","padEndHex","padStartHex","passTo8DBC","setSm4Value","sliceHex","Sbox","CK","hexToArray","str","arr","len","ArrayToHex","utf8ToArray","point","rotl","x","y","byteSub","a","l1","b","l2","sms4Crypt","input","output","roundKey","tmp","r","mid","j","sms4KeyExt","key","cryptFlag","sm4","inArray","padding","mode","iv","paddingCount","outArray","lastVector","restLen","sm4_default","options","context","next","_fn","value","from","to","_toHex","radix","old","hexArr","bit","hex2","typedArray","h","hash","start","end","result","temp","prev","cur","newArr","num","mac","manufacturer","model","byteArr","GenerationRule","common","formulas","combination","comfun","compose","_0","config","_mergeOptions","__spreadValues","_promiseParcel","option","runCommon","combine","use","dispatch","fn","deviceBind","deviceBindNew","syncKeyList","passwordDbc","setSm4Auth","setSm4AuthCon","deviceOperate","firmwareContent","getSm4Auth","getSm4AuthOperate","getadvertisData","getHighLow","getOpenHushKey","getDeviceSerialId","getUserProperty","getCycleEnd","updateUser","deleteUser","getLockDataSum","getLockDataSm4","createKeySm4","getNoSm4Data","getNoSm4Butter","setBuletVolume","setBuleStay","setBuleClose","deleteKeySm4","voiceMessageSm4","voicePgVsSm4","issuceVoicePgSm4","issuceAnySm4","getLogSm4Data","firmwareUpReady","getLockState","setBuleLocked","BluetoothSdk","bluetoothSdk_default","ONBRIGHT_AUTH_BLUE_UUID_SERVICE","ONBRIGHT_AUTH_BLUE_WRITE_UUID","ONBRIGHT_AUTH_BLUE_NOTIFY_UUID","ONBRIGHT_AUTH_BLUE_READ_UUID","Cat1LockAuthHandler","authObject","userId","notifyValue","grade","timeUnix","receivedData","OBBLE","random","hex","numStr","timeStamp","timeStampDate","s","week","w","wHex","userIdHex","number","buffer","bytes","src_default"],"mappings":"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","sourcesContent":["import { dataConversion, permisson, SDKLogger, SDKLogLevel } from '@onbright/common-sdk';\n\nimport {\n  Cat1LockAuthCallback,\n  Cat1LockAuthHandler,\n} from '../handler/auth/modules/cat1LockAuthHandler';\nimport { ConnectCallback, ConnectHandler } from '../handler/connectHandler';\nimport { AcceptDataCallback, DataHandler } from '../handler/dataHandler';\nimport { ScanCallback, ScanHandler } from '../handler/scanHandler';\nimport { Communication } from '../interface/Communication';\nimport { ProtocolComponent } from '../interface/ProtocolComponent';\n\nlet that: BluetoothManager;\nexport class BluetoothManager {\n  _ConnectHandler: ConnectHandler | null = null;\n  _ScanHandler: ScanHandler | null = null;\n  _DataHandler: DataHandler | null = null;\n  _BluetoothCallbackManager: BluetoothCallbackManager;\n  _Cat1LockAuthHandler: Cat1LockAuthHandler | null = null;\n\n  /**\n   * 是否需要鉴权\n   */\n  _isNeedAuth: Boolean = false;\n\n  /**\n   * 是否已经鉴权\n   */\n  _isHasAuth: Boolean = false;\n\n  /**\n   * 是否自动连接\n   */\n  _isAutoConnectDevices: Boolean = false;\n\n  constructor() {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    that = this;\n    this._BluetoothCallbackManager = new BluetoothCallbackManager();\n    that._ScanHandler = new ScanHandler();\n    that.init();\n    SDKLogger.init({\n      logPrefix: 'onbright',\n      enableLogs: true,\n      logLevel: SDKLogLevel.Debug,\n    });\n  }\n\n  init() {\n    const scanCallback: ScanCallback = {\n      onFound: that._onScanFound,\n      onAdapter: that._onScanAdapter,\n      onSuccess: that._onScanSuccess,\n      onFailed: that._onScanFailed,\n      onStop: that._onScanStop,\n    };\n    that._ScanHandler?.setCallback(scanCallback);\n  }\n\n  /**\n   * 禁用日志\n   */\n  public disableLogs() {\n    SDKLogger.disableLogs();\n  }\n\n  /**\n   * 启用日志\n   */\n  public enableLogs() {\n    SDKLogger.enableLogs();\n  }\n\n  /**\n   * 设置日志级别\n   * @param logLevel\n   */\n  public setLogLevel(logLevel: SDKLogLevel) {\n    SDKLogger.setLogLevel(logLevel);\n  }\n\n  public setConnectHandler(communication: Communication) {\n    const connectCallback: ConnectCallback = {\n      onDisconnect: that._onConnectStateDisconnect,\n      onFailed: that._onConnectStateFailed,\n      onSuccess: that._onConnectStateSuccess,\n      onMTUChange: that._onConnectStateMTUChange,\n    };\n    that._ConnectHandler = new ConnectHandler(communication);\n    that._ConnectHandler.setCallback(connectCallback);\n  }\n\n  /**\n   * 切换handler，需要同步\n   * @param communication\n   */\n  public async changeCommunicationCharacteristics(communication: Communication) {\n    await that._ConnectHandler?.setCommunication(communication);\n  }\n\n  public setDataHandler(protocolComponent: ProtocolComponent) {\n    that._DataHandler = new DataHandler(protocolComponent);\n  }\n\n  public setNeedAuth(isNeedAuth: Boolean) {\n    that._isNeedAuth = isNeedAuth;\n  }\n\n  public setAutoConnectDevices(isAutoConnectDevices: Boolean) {\n    that._isAutoConnectDevices = isAutoConnectDevices;\n  }\n\n  public setHasAuth(isHasAuth: Boolean) {\n    that._isHasAuth = isHasAuth;\n  }\n\n  public hasAuth() {\n    return that._isHasAuth;\n  }\n\n  public setCat1LockAuthHandler(cat1LockAuthHandler: Cat1LockAuthHandler) {\n    that._Cat1LockAuthHandler = cat1LockAuthHandler;\n  }\n\n  public setInterval(interval: number) {\n    that._ScanHandler?.setInterval(interval);\n  }\n\n  /**\n   * 添加事件回调，会重置之前的监听。\n   */\n  public addBluetoothEventCallback(callback: BluetoothEventCallback) {\n    // that._BluetoothCallbackManager.addCallbacks(callback);\n    // 2024年10月24日 重置之前的监听\n    that._BluetoothCallbackManager.resetCallbacks(callback);\n  }\n  /**\n   * 移除事件回调\n   */\n  public removeBluetoothEventCallback(callback: BluetoothEventCallback) {\n    that._BluetoothCallbackManager.removeCallbacks(callback);\n  }\n\n  /**\n   * 检查是否能正常使用蓝牙\n   * @returns\n   */\n  public async checkPermissionDenied() {\n    const { locationAuthorized, bluetoothAuthorized } = uni.getAppAuthorizeSetting();\n    const { locationEnabled, bluetoothEnabled } = uni.getSystemSetting();\n\n    let message = '';\n    let code = 0;\n\n    if (!locationEnabled) {\n      message = '请打开系统的位置开关';\n      code = PermissionDeniedValue.LOCATION_ENABLED;\n    } else if (locationAuthorized !== 'authorized') {\n      message = '请允许微信使用定位功能';\n      code = PermissionDeniedValue.LOCATION_AUTHORIZED;\n    } else if (!bluetoothEnabled) {\n      message = '请打开系统的蓝牙开关';\n      code = PermissionDeniedValue.BLUETOOTH_ENABLED;\n    } else if (bluetoothAuthorized !== 'authorized') {\n      message = '请允许微信使用蓝牙功能';\n      code = PermissionDeniedValue.BLUETOOTH_AUTHORIZED;\n    }\n    // 默认是可以扫描的\n    let canScan = true;\n    // 校验定位权限\n    await permisson.checkLocationPermissions(false).catch(() => {\n      canScan = false;\n      that._BluetoothCallbackManager.onPermissionDenied({\n        code: code,\n        describe: message,\n      });\n    });\n    if (canScan || locationAuthorized !== 'authorized') {\n      // 手动拉取一次定位授权\n      await that\n        ._handleCheckLocation()\n        .then(() => {\n          canScan = true;\n        })\n        .catch(() => {\n          canScan = false;\n        });\n    }\n    // 校验蓝牙权限\n    await permisson.checkBluetoothPermissions(false).catch(() => {\n      that._BluetoothCallbackManager.onPermissionDenied({\n        code: code,\n        describe: message,\n      });\n      canScan = false;\n    });\n    return canScan;\n  }\n\n  /**\n   * 开始扫描设备\n   */\n  public async startDeviceScan() {\n    const canScan = await that.checkPermissionDenied();\n    if (canScan) {\n      that._ScanHandler?.startScan();\n    }\n  }\n\n  /**\n   * 权限校验（插件专用）\n   */\n  public async checkPermissionDeniedForMiniProgram() {\n    const { locationAuthorized, bluetoothAuthorized } = uni.getAppAuthorizeSetting();\n    const { locationEnabled, bluetoothEnabled } = uni.getSystemSetting();\n\n    let message = '';\n    let code = 0;\n\n    if (!locationEnabled) {\n      message = '请打开系统的位置开关';\n      code = PermissionDeniedValue.LOCATION_ENABLED;\n    } else if (locationAuthorized !== 'authorized') {\n      message = '请允许微信使用定位功能';\n      code = PermissionDeniedValue.LOCATION_AUTHORIZED;\n    } else if (!bluetoothEnabled) {\n      message = '请打开系统的蓝牙开关';\n      code = PermissionDeniedValue.BLUETOOTH_ENABLED;\n    } else if (bluetoothAuthorized !== 'authorized') {\n      message = '请允许微信使用蓝牙功能';\n      code = PermissionDeniedValue.BLUETOOTH_AUTHORIZED;\n    }\n    // 默认是可以扫描的\n    let canScan = true;\n    if (canScan || locationAuthorized !== 'authorized') {\n      // 手动拉取一次定位授权\n      await that\n        ._handleCheckLocation()\n        .then(() => {\n          canScan = true;\n        })\n        .catch(() => {\n          canScan = false;\n        });\n    }\n    // 校验蓝牙权限\n    await permisson.checkBluetoothPermissionsForMiniProgram(false).catch(() => {\n      that._BluetoothCallbackManager.onPermissionDenied({\n        code: code,\n        describe: message,\n      });\n      canScan = false;\n    });\n    return canScan;\n  }\n\n  /**\n   * 开始扫描设备（插件专用）\n   */\n  public async startDeviceScanForMiniProgram() {\n    const canScan = await that.checkPermissionDeniedForMiniProgram();\n    if (canScan) {\n      that._ScanHandler?.startScan();\n    }\n  }\n\n  /**\n   * 有可能是设置了每次使用时询问 手动调用一下位置权限\n   */\n  _handleCheckLocation() {\n    return new Promise<void>((resolve, reject) => {\n      uni.getLocation({\n        type: 'wgs84',\n        success(res) {\n          SDKLogger.log('获取位置权限成功', res);\n          resolve();\n        },\n        fail(error) {\n          SDKLogger.log('获取位置权限失败', error);\n          that._BluetoothCallbackManager.onPermissionDenied({\n            code: PermissionDeniedValue.LOCATION_AUTHORIZED,\n            describe: '请允许微信使用定位的开关',\n          });\n          reject();\n        },\n      });\n    });\n  }\n\n  /**\n   * 停止扫描设备\n   */\n  public stopDeviceScan() {\n    that._ScanHandler?.stopScan();\n  }\n\n  /**\n   * 是否已连接\n   */\n  public isConnected(): boolean | null {\n    return that._ConnectHandler && that._ConnectHandler.isConnected();\n  }\n\n  /**\n   * 判断是否处于连接中或连接成功状态\n   * @returns\n   */\n  public isConnectedOrConnecting(): boolean | null {\n    return that._ConnectHandler && that._ConnectHandler.isConnectedOrConnecting();\n  }\n\n  /**\n   * 已连接设备\n   */\n  public getConnectedDevice(): WechatMiniprogram.BlueToothDevice | null {\n    return that._ConnectHandler && that._ConnectHandler.getConnectedDevice();\n  }\n\n  /**\n   * 连接设备\n   * @param device 需要连接的设备\n   * @param isOTA 是否是OTA\n   * @returns 是否连接成功\n   */\n  public connectDevice(device: WechatMiniprogram.BlueToothDevice, isOTA: boolean): boolean {\n    const onConnectDeviceBefore =\n      this._ConnectHandler?.getCommunication()?.onConnectDeviceBefore ??\n      (() => {\n        return false;\n      });\n    SDKLogger.log('onConnectDeviceBefore', onConnectDeviceBefore);\n    SDKLogger.log('device', device);\n    SDKLogger.log('onConnectDeviceBefore(device)', onConnectDeviceBefore(device));\n    if (onConnectDeviceBefore(device)) {\n      return this._ConnectHandler?.connect(device, isOTA) ?? false;\n    } else {\n      return false;\n    }\n  }\n\n  /**\n   * 断开设备\n   */\n  public disconnectDevice() {\n    try {\n      if (that._ConnectHandler) {\n        that._ConnectHandler.disconnect();\n        that.setHasAuth(false);\n      }\n    } catch (e) {\n      SDKLogger.error('disconnectDevice error', e);\n    }\n  }\n\n  /**\n   * 设置搜索时长\n   * @param scanTime\n   */\n  public setScanTime(scanTime: number = 30000) {\n    that._ScanHandler?.setScanTime(scanTime);\n  }\n\n  /**\n   * 设置要搜索的蓝牙设备主服务\n   * @param services\n   */\n  public setServices(services: Array<string>) {\n    that._ScanHandler?.setServices(services);\n  }\n\n  /**\n   * 设置是否需要搜索没有名称的蓝牙\n   * @param enableSearchUnnamedBle\n   */\n  public setEnableSearchUnnamedBle(enableSearchUnnamedBle: Boolean) {\n    this._ScanHandler?.setEnableSearchUnnamedBle(enableSearchUnnamedBle);\n  }\n\n  /**\n   * 发送蓝牙数据\n   * @param deviceId\n   * @param data 源数据/待处理的数据\n   * @returns\n   */\n  public sendData(deviceId: string, data: Uint8Array): boolean {\n    return that._SendData(deviceId, data);\n  }\n\n  /**\n   * 发送数据的内部实现\n   * @param deviceId - 目标设备ID\n   * @param data - 要发送的数据\n   * @returns 发送是否成功\n   * @\n   * @description\n   * 处理数据发送的具体逻辑：\n   * - 验证设备连接状态\n   * - 获取通信服务\n   * - 获取写特征值\n   * - 执行数据发送\n   */\n  _SendData(deviceId: string, data: Uint8Array): boolean {\n    try {\n      if (that._ConnectHandler && that._ConnectHandler.isConnected() && that._DataHandler) {\n        const connectedDevice = that._ConnectHandler.getConnectedDevice();\n        SDKLogger.debug('发送数据连接的蓝牙', connectedDevice, connectedDevice?.deviceId);\n        if (connectedDevice && connectedDevice.deviceId == deviceId) {\n          const communicationService = that._ConnectHandler.getCommunicationService();\n          if (communicationService) {\n            const communicationWriteCharacteristic =\n              that._ConnectHandler.getCommunicationWriteCharacteristic();\n            if (communicationWriteCharacteristic) {\n              that._DataHandler.sendData(\n                deviceId,\n                communicationService.uuid,\n                communicationWriteCharacteristic.uuid,\n                data,\n              );\n              return true;\n            }\n          }\n        }\n      }\n    } catch (e) {\n      SDKLogger.error('_SendData error', e);\n    }\n    return false;\n  }\n\n  public readData(deviceId: string): void {\n    if (that._ConnectHandler && that._ConnectHandler.isConnected() && that._DataHandler) {\n      const connectedDevice = that._ConnectHandler.getConnectedDevice();\n      if (connectedDevice && connectedDevice.deviceId == deviceId) {\n        const communicationService = that._ConnectHandler.getCommunicationService();\n\n        if (communicationService) {\n          const communicationReadCharacteristic =\n            that._ConnectHandler.getCommunicationReadCharacteristic();\n          if (communicationReadCharacteristic) {\n            that._DataHandler.readData(\n              deviceId,\n              communicationService.uuid,\n              communicationReadCharacteristic.uuid,\n            );\n          }\n        }\n      }\n    } else {\n      SDKLogger.error('readData error, _DataHandler is null');\n    }\n  }\n\n  /***************************扫描回调ScanCallback*******************************/\n  /**\n   * 设备发现回调处理\n   * @param devices - 发现的设备列表\n   * @\n   * @description\n   * 处理新发现的设备：\n   * - 执行自动连接逻辑\n   * - 过滤匹配设备\n   * - 触发设备发现回调\n   */\n  _onScanFound(devices: WechatMiniprogram.BlueToothDevice[]) {\n    if (devices && devices.length > 0 && that._isAutoConnectDevices) {\n      const device: WechatMiniprogram.BlueToothDevice | null | undefined = that._ConnectHandler\n        ?.getCommunication()\n        .onMatchingConnectDevice(devices);\n      if (device) {\n        that._ConnectHandler?.connect(device, false);\n        // 连接成功之后，停止扫描设备\n        that._ScanHandler?.stopScan();\n      }\n    }\n    const onMatchingScanFound =\n      that._ConnectHandler?.getCommunication()?.onMatchingScanFound ?? (() => {});\n    const _devices = onMatchingScanFound(devices);\n    if (_devices) {\n      devices = _devices;\n    }\n    that._BluetoothCallbackManager.onFoundDev(devices);\n  }\n\n  /**\n   * 适配器状态变化回调\n   * @param res - 适配器状态信息\n   * @\n   * @description\n   * 处理蓝牙适配器状态变化：\n   * - 更新适配器状态\n   * - 触发相应的回调\n   */\n  _onScanAdapter(res: WechatMiniprogram.OnBluetoothAdapterStateChangeListenerResult) {\n    that._BluetoothCallbackManager.onAdapter(res);\n  }\n\n  /**\n   * 扫描成功回调\n   * @\n   * @description\n   * 处理扫描开始成功的情况\n   */\n  _onScanSuccess() {\n    that._BluetoothCallbackManager.onScanSuccess();\n  }\n\n  /**\n   * 扫描失败回调\n   * @param res - 错误信息\n   * @\n   * @description\n   * 处理扫描失败的情况：\n   * - 记录错误信息\n   * - 触发失败回调\n   */\n  _onScanFailed(res: WechatMiniprogram.BluetoothError) {\n    that._BluetoothCallbackManager.onScanFailed(res);\n  }\n\n  /**\n   * 扫描停止回调\n   * @\n   * @description\n   * 处理扫描停止事件：\n   * - 检查设备连接状态\n   * - 触发相应的回调\n   */\n  _onScanStop() {\n    // 蓝牙只要不是已连接或者连接中都触发没有找到回调\n    if (!that._ConnectHandler?.isConnectedOrConnecting()) {\n      that._BluetoothCallbackManager.onScanNotFound();\n    }\n    that._BluetoothCallbackManager.onScanStop();\n  }\n\n  /***************************连接回调ConnectCallback*******************************/\n  /**\n   * 设备断开连接回调\n   * @param dev - 断开连接的设备\n   * @\n   * @description\n   * 处理设备断开连接：\n   * - 重置认证状态\n   * - 触发断开连接回调\n   * - 清理连接资源\n   */\n  _onConnectStateDisconnect(dev: WechatMiniprogram.BlueToothDevice) {\n    that._isHasAuth = false;\n    that._BluetoothCallbackManager.onDevStatusDisconnect(dev);\n  }\n  /**\n   * 设备连接失败回调\n   * @param dev - 连接失败的设备\n   * @\n   * @description\n   * 处理连接失败：\n   * - 重置认证状态\n   * - 重新开始扫描\n   * - 触发连接失败回调\n   * - 清理连接资源\n   */\n  _onConnectStateFailed(dev: WechatMiniprogram.BlueToothDevice) {\n    that._isHasAuth = false;\n    //正在回连\n    // that._ScanHandler?.startScan();\n    that._BluetoothCallbackManager.onDevStatusFailed(dev);\n  }\n\n  /**\n   * 设备连接成功回调\n   * @param dev - 连接成功的设备\n   * @\n   * @description\n   * 处理连接成功：\n   * - 初始化数据处理器\n   * - 设置数据接收回调\n   * - 处理设备认证\n   * - 触发连接成功回调\n   * @returns Promise<void>\n   */\n  async _onConnectStateSuccess(dev: WechatMiniprogram.BlueToothDevice) {\n    if (dev && that._DataHandler) {\n      that._DataHandler?.init();\n      const acceptDataCallback: AcceptDataCallback = {\n        onReceiveData(res: any) {\n          that._onTransmitDeviceData(res);\n        },\n      };\n      if (that._isNeedAuth && !that._isHasAuth && that._Cat1LockAuthHandler) {\n        const cat1LockAuthCallback: Cat1LockAuthCallback = {\n          onAuthSuccess() {\n            if (that._ConnectHandler && that._ConnectHandler.getCommunicationService()) {\n              const communicationService = that._ConnectHandler.getCommunicationService();\n              that._resetNotifyBLECharacteristicValueChange({\n                deviceId: dev.deviceId,\n                serviceId: communicationService ? communicationService.uuid : '',\n                characteristicId: that._ConnectHandler\n                  ?.getCommunication()\n                  .onMatchingServiceCharacteristic().notify,\n              });\n            }\n            that._BluetoothCallbackManager.onAuthSuccess();\n            that._isHasAuth = true;\n          },\n          onAuthFailed() {\n            SDKLogger.log('Cat1LockAuthCallback onAuthFailed');\n            that._BluetoothCallbackManager.onAuthFailed();\n            that._isHasAuth = false;\n          },\n        };\n        that._Cat1LockAuthHandler.setCallback(cat1LockAuthCallback);\n        const hexStr = dataConversion.ab2hex(dev.advertisData);\n        that._Cat1LockAuthHandler.handleSendData(dev.deviceId, hexStr);\n      }\n      that._DataHandler?.addCallbacks(acceptDataCallback);\n      // SDKLogger.log('onDevStatusSuccess 连接成功');\n      that._BluetoothCallbackManager.onDevStatusSuccess(dev);\n    } else {\n      SDKLogger.error('_onConnectStateSuccess error, dev or _DataHandler is null');\n    }\n  }\n  /**\n   * 设备MTU变化回调\n   * @param dev - 设备信息\n   * @param mtu - 新的MTU值\n   * @\n   * @description\n   * 处理MTU变化：\n   * - 更新MTU值\n   * - 触发MTU变化回调\n   */\n  _onConnectStateMTUChange(dev: WechatMiniprogram.BlueToothDevice, mtu: number) {\n    if (dev && that._DataHandler) {\n      that._DataHandler?.setMtu(dev.deviceId, mtu);\n      that._BluetoothCallbackManager.onDevStatusMTUChange(dev, mtu);\n    } else {\n      SDKLogger.error('_onConnectStateMTUChange error, dev or _DataHandler is null');\n    }\n  }\n\n  /**\n   * 重置蓝牙特征值通知\n   * @param obj - 通知配置对象\n   * @param obj.deviceId - 设备ID\n   * @param obj.serviceId - 服务ID\n   * @param obj.characteristicId - 特征值ID\n   * @\n   * @description\n   * 重新启用特征值变化通知：\n   * - 设置通知状态为开启\n   * - 配置设备、服务和特征值ID\n   * - 成功时重新初始化数据处理器\n   * - 失败时记录错误日志\n   */\n  _resetNotifyBLECharacteristicValueChange(obj: {\n    deviceId: string;\n    serviceId: string;\n    characteristicId: string;\n  }) {\n    uni.notifyBLECharacteristicValueChange({\n      state: true,\n      deviceId: obj.deviceId,\n      serviceId: obj.serviceId,\n      characteristicId: obj.characteristicId,\n      success: (res) => {\n        SDKLogger.log('重置通知成功：' + JSON.stringify(res));\n        that._DataHandler?.init();\n      },\n      fail: (err) => {\n        SDKLogger.log('重置通知失败' + JSON.stringify(err));\n      },\n    });\n  }\n\n  /***************************蓝牙发送/接受数据回调*******************************/\n  /**\n   * 接收设备数据回调处理\n   * @param res - 接收到的数据，支持多种类型：\n   * - ArrayBuffer: 二进制数据\n   * - Uint8Array: 无符号8位整数数组\n   * - Object: 对象类型数据\n   * @\n   * @description\n   * 处理从设备接收到的数据：\n   * - 通过回调管理器转发数据\n   * - 支持多种数据格式的处理\n   */\n  _onTransmitDeviceData(res: any) {\n    that._BluetoothCallbackManager.onTransmitDeviceData(res);\n  }\n\n  public getMTU() {\n    return this._ConnectHandler?.getMTU();\n  }\n\n  /*************************** 蓝牙重置 *******************************/\n  /**\n   * 重置蓝牙状态\n   * @description\n   * 完全重置蓝牙状态：\n   * - 关闭所有监听\n   * - 重置认证状态\n   * - 清理连接资源\n   * - 重置内部状态\n   */\n  public resetBluetoothData() {\n    that._handleCloseMonitoring();\n    that.setHasAuth(false);\n  }\n\n  /**\n   * 关闭蓝牙监听\n   * @\n   * @description\n   * 按顺序执行以下操作：\n   * 1. 停止设备扫描\n   * 2. 移除所有事件监听\n   * 3. 关闭蓝牙适配器\n   * 4. 断开设备连接\n   */\n  _handleCloseMonitoring() {\n    // 先停止搜索，再移除监听事件，最后再关闭蓝牙连接\n    that._ScanHandler?.stopScan(false);\n    uni.offBluetoothDeviceFound();\n    uni.offBluetoothAdapterStateChange();\n    uni.offBLEMTUChange();\n    uni.offBLEConnectionStateChange();\n    uni.offBLECharacteristicValueChange();\n    that._ConnectHandler?.disconnect(false);\n  }\n}\n\n/**\n * 蓝牙回调管理器类\n * @class BluetoothCallbackManager\n * @description\n * 负责管理所有蓝牙相关的事件回调，包括：\n * - 设备发现\n * - 连接状态变化\n * - 数据传输\n * - 认证状态\n * - 权限变更\n */\nexport class BluetoothCallbackManager {\n  callbacks = Array<BluetoothEventCallback>();\n\n  /**\n   * 重置回调列表\n   * @param callback - 新的回调函数\n   * @description\n   * 清除之前的回调函数，仅保留新的回调函数\n   */\n  public resetCallbacks(callback: BluetoothEventCallback) {\n    this.callbacks = [callback];\n  }\n\n  /**\n   * 添加回调函数\n   * @param callback - 需要添加的回调函数\n   * @description\n   * 将新的回调函数添加到回调列表中\n   */\n  public addCallbacks(callback: BluetoothEventCallback) {\n    if (this.callbacks.indexOf(callback) == -1) {\n      this.callbacks.push(callback);\n    }\n  }\n  /**\n   * 移除回调函数\n   * @param callback - 需要移除的回调函数\n   * @description\n   * 从回调列表中移除指定的回调函数\n   */\n  public removeCallbacks(callback: BluetoothEventCallback) {\n    const index = this.callbacks.indexOf(callback);\n    if (index != -1) {\n      this.callbacks.splice(index, 1);\n    }\n  }\n\n  /**\n   * 蓝牙权限失败回调\n   * @param error - 权限错误信息\n   * @description\n   * 处理蓝牙权限失败事件：\n   * - 通知外部权限获取失败\n   * - 可用于显示权限请求提示\n   * - 可触发权限重试逻辑\n   */\n  public onPermissionDenied(error: PermissionDeniedError) {\n    this._doAction({\n      action: function (c) {\n        if (c.onPermissionDenied) {\n          c.onPermissionDenied(error);\n        }\n      },\n    });\n  }\n\n  /**\n   * 蓝牙适配器状态变化回调\n   * @param res - 适配器状态信息\n   * @description\n   * 处理蓝牙适配器状态变化：\n   * - 通知外部适配器状态更新\n   * - 可用于更新UI状态\n   * - 可触发相应的业务逻辑\n   * @remarks 如果外部实现了uni.onBluetoothAdapterStateChange，则该回调无效\n   */\n  public onAdapter(res: WechatMiniprogram.OnBluetoothAdapterStateChangeListenerResult) {\n    this._doAction({\n      action: function (c) {\n        if (c.onAdapter) {\n          c.onAdapter(res);\n        }\n      },\n    });\n  }\n  /**\n   * 发现设备回调\n   * @param devices - 发现的设备列表\n   * @description\n   * 处理发现新设备事件：\n   * - 通知外部发现新设备\n   * - 可用于更新设备列表\n   * - 可触发自动连接逻辑\n   */\n  public onFoundDev(devices: WechatMiniprogram.BlueToothDevice[]) {\n    this._doAction({\n      action: function (c) {\n        if (c.onFoundDev) {\n          c.onFoundDev(devices);\n        }\n      },\n    });\n  }\n  /**\n   * 扫描成功回调\n   * @description\n   * 处理扫描开始成功事件：\n   * - 通知外部扫描已开始\n   * - 可用于更新UI状态\n   * - 可开始计时等待扫描结果\n   */\n  public onScanSuccess() {\n    this._doAction({\n      action: function (c) {\n        if (c.onScanSuccess) {\n          c.onScanSuccess();\n        }\n      },\n    });\n  }\n  /**\n   * 扫描停止回调\n   * @description\n   * 处理扫描停止事件：\n   * - 通知外部扫描已停止\n   * - 可用于更新UI状态\n   * - 可触发扫描完成逻辑\n   */\n  public onScanStop() {\n    this._doAction({\n      action: function (c) {\n        if (c.onScanStop) {\n          c.onScanStop();\n        }\n      },\n    });\n  }\n  /**\n   * 扫描未找到设备回调\n   * @description\n   * 处理未找到设备事件：\n   * - 通知外部未找到设备\n   * - 可用于显示提示信息\n   * - 可触发重试扫描逻辑\n   */\n  public onScanNotFound() {\n    this._doAction({\n      action: function (c) {\n        if (c.onScanNotFound) {\n          c.onScanNotFound();\n        }\n      },\n    });\n  }\n  /**\n   * 扫描失败回调\n   * @param err - 扫描错误信息\n   * @description\n   * 处理扫描失败事件：\n   * - 通知外部扫描失败\n   * - 可用于显示错误信息\n   * - 可触发错误恢复逻辑\n   */\n  public onScanFailed(err: WechatMiniprogram.BluetoothError) {\n    this._doAction({\n      action: function (c) {\n        if (c.onScanFailed) {\n          c.onScanFailed(err);\n        }\n      },\n    });\n  }\n  /**\n   * 设备断开连接回调\n   * @param dev - 断开连接的设备信息\n   * @description\n   * 处理设备断开连接：\n   * - 通知外部设备已断开\n   * - 可用于更新连接状态\n   * - 可触发重连逻辑\n   */\n  public onDevStatusDisconnect(dev: WechatMiniprogram.BlueToothDevice) {\n    this._doAction({\n      action: function (c) {\n        if (c.onDevStatusDisconnect) {\n          c.onDevStatusDisconnect(dev);\n        }\n      },\n    });\n  }\n  /**\n   * 设备连接失败回调\n   * @param dev - 连接失败的设备信息\n   * @description\n   * 处理连接失败：\n   * - 通知外部连接失败\n   * - 可用于显示错误信息\n   * - 可触发重试连接\n   */\n  public onDevStatusFailed(dev: WechatMiniprogram.BlueToothDevice) {\n    this._doAction({\n      action: function (c) {\n        if (c.onDevStatusFailed) {\n          c.onDevStatusFailed(dev);\n        }\n      },\n    });\n  }\n  /**\n   * 设备连接成功回调\n   * @param dev - 连接成功的设备信息\n   * @description\n   * 处理设备连接成功：\n   * - 通知外部连接已建立\n   * - 可用于更新连接状态\n   * - 可开始设备初始化\n   */\n  public onDevStatusSuccess(dev: WechatMiniprogram.BlueToothDevice) {\n    this._doAction({\n      action: function (c) {\n        if (c.onDevStatusSuccess) {\n          c.onDevStatusSuccess(dev);\n        }\n      },\n    });\n  }\n  /**\n   * 设备MTU变化回调\n   * @param dev - 设备信息\n   * @param mtu - 新的MTU值\n   * @description\n   * 处理设备MTU变化：\n   * - 通知外部MTU已更新\n   * - 可调整数据包大小\n   * - 可优化传输策略\n   */\n  public onDevStatusMTUChange(dev: WechatMiniprogram.BlueToothDevice, mtu: number) {\n    this._doAction({\n      action: function (c) {\n        if (c.onDevStatusMTUChange) {\n          c.onDevStatusMTUChange(dev, mtu);\n        }\n      },\n    });\n  }\n  /**\n   * 设备数据接收回调\n   * @param res - 接收到的数据\n   * @description\n   * 处理接收到的设备数据：\n   * - 通知外部收到新数据\n   * - 可进行数据解析\n   * - 可触发业务处理逻辑\n   */\n  public onTransmitDeviceData(res: any) {\n    this._doAction({\n      action: function (c) {\n        if (c.onTransmitDeviceData) {\n          c.onTransmitDeviceData(res);\n        }\n      },\n    });\n  }\n  /**\n   * 设备认证成功回调\n   * @description\n   * 处理设备认证成功：\n   * - 通知外部认证成功\n   * - 可开始正常通信\n   * - 可执行后续业务逻辑\n   */\n  public onAuthSuccess() {\n    this._doAction({\n      action: function (c) {\n        if (c.onAuthSuccess) {\n          c.onAuthSuccess();\n        }\n      },\n    });\n  }\n  /**\n   * 设备认证失败回调\n   * @description\n   * 处理设备认证失败：\n   * - 通知外部认证失败\n   * - 可显示错误信息\n   * - 可触发重试认证\n   */\n  public onAuthFailed() {\n    this._doAction({\n      action: function (c) {\n        if (c.onAuthFailed) {\n          c.onAuthFailed();\n        }\n      },\n    });\n  }\n\n  /**\n   * 执行回调动作\n   * @param obj - 包含回调动作的对象\n   * @\n   * @description\n   * 内部方法，用于执行回调：\n   * - 遍历所有注册的回调\n   * - 执行指定的回调动作\n   * - 处理执行异常\n   */\n  _doAction(obj: { action: (c: BluetoothEventCallback) => void }) {\n    this.callbacks.forEach((c) => {\n      obj.action(c);\n    });\n  }\n}\n\n/**\n * 蓝牙事件回调基类\n * @class BluetoothEventCallback\n * @description\n * 定义了所有可能的蓝牙事件回调方法，包括：\n * - 权限相关回调\n * - 设备扫描回调\n * - 连接状态回调\n * - 数据传输回调\n * - 认证状态\n * @category 蓝牙事件回调\n */\nexport class BluetoothEventCallback {\n  /**\n   * 蓝牙权限失败\n   * @param error\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onPermissionDenied(error: PermissionDeniedError) {}\n  /**\n   * 蓝牙适配器发生变化，外部实现uni.onBluetoothAdapterStateChange，则该回调无效\n   * @param res\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onAdapter(res: WechatMiniprogram.OnBluetoothAdapterStateChangeListenerResult) {}\n  /**\n   * 发现设备\n   * @param devices\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onFoundDev(devices: WechatMiniprogram.BlueToothDevice[]) {}\n  /**\n   * 扫描设备成功\n   */\n  onScanSuccess() {}\n  /**\n   * 蓝牙扫描停止\n   */\n  onScanStop() {}\n  /**\n   * 蓝牙没有找到设备\n   */\n  onScanNotFound() {}\n  /**\n   * 扫描设备失败\n   * @param err\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onScanFailed(err: WechatMiniprogram.BluetoothError) {}\n  /** 设备断开  */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onDevStatusDisconnect(dev: WechatMiniprogram.BlueToothDevice) {}\n  /** 设备连接失败 */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onDevStatusFailed(dev: WechatMiniprogram.BlueToothDevice) {}\n  /** 设备连接成功*/\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onDevStatusSuccess(dev: WechatMiniprogram.BlueToothDevice) {}\n  /** 设备MTU改变 */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onDevStatusMTUChange(dev: WechatMiniprogram.BlueToothDevice, mtu: number) {}\n  /**\n   * 设备信息回调\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onTransmitDeviceData(res: any): void {}\n  /**\n   * 鉴权成功回调\n   */\n  onAuthSuccess() {}\n  /**\n   * 鉴权失败回调\n   */\n  onAuthFailed() {}\n}\n\nexport enum PermissionDeniedValue {\n  LOCATION_AUTHORIZED = 1000,\n  LOCATION_ENABLED = 1001,\n  BLUETOOTH_ENABLED = 1002,\n  BLUETOOTH_AUTHORIZED = 1003,\n  // 1000 | 1001 | 1002 | 1003\n}\n\nexport interface PermissionDeniedError {\n  /**\n   * 状态码\n   */\n  code: PermissionDeniedValue;\n  /**\n   * 状态描述\n   */\n  describe: string;\n}\n","export default function (error: WechatMiniprogram.BluetoothError) {\n  if (error) {\n    const _error = {\n      tipMsg: '',\n      errCode: error.errCode,\n      errMsg: error.errMsg,\n    };\n    let _tipMsg = _error.tipMsg;\n    switch (error.errCode) {\n      case 0:\n        _tipMsg = '蓝牙正常使用';\n        break;\n      case -1:\n        _tipMsg = '蓝牙已连接';\n        break;\n      case 10000:\n        _tipMsg = '未初始化蓝牙';\n        break;\n      case 10001:\n        _tipMsg = '请打开手机蓝牙';\n        break;\n      case 10002:\n        _tipMsg = '没有找到指定设备';\n        break;\n      case 10003:\n        _tipMsg = '蓝牙连接失败';\n        break;\n      case 10004:\n        _tipMsg = '蓝牙没有找到指定服务';\n        break;\n      case 10005:\n        _tipMsg = '蓝牙没有找到指定特征';\n        break;\n      case 10006:\n        _tipMsg = '当前蓝牙连接已断开';\n        break;\n      case 10007:\n        _tipMsg = '当前蓝牙特征不支持此操作';\n        break;\n      case 10008:\n        if (error.errMsg.indexOf('scanning too frequently') > -1) {\n          _tipMsg = '请勿频繁扫描设备';\n        } else {\n          _tipMsg = '其他所有系统上报的异常';\n        }\n        break;\n      case 10009:\n        _tipMsg = 'Android 系统特有，系统版本低于 4.3 不支持 BLE';\n        break;\n      case 10012:\n        _tipMsg = '当前蓝牙连接超时';\n        break;\n      case 10013:\n        _tipMsg = '连接 deviceId 为空或者是格式不正确';\n        break;\n      default:\n        _tipMsg = '蓝牙功能暂不支持';\n        break;\n    }\n    _error.tipMsg = _tipMsg;\n    return _error;\n  } else {\n    return {\n      errCode: -1000,\n      errMsg: 'error',\n      tipMsg: '蓝牙功能暂不支持',\n    };\n  }\n}\n","import { Communication, BLEDeviceCharacteristicsMap } from '../interface/Communication';\nimport errorUtils from '../utils/errorUtils';\nimport { SDKLogger } from '@onbright/common-sdk'\n\n\n/**\n * 蓝牙设备连接处理器类\n * 负责管理蓝牙设备的连接、断开、MTU设置等操作\n */\nexport class ConnectHandler {\n  /**\n   * 连接状态枚举\n   * 0: 断开连接\n   * 1: 正在连接中\n   * 2: 设备连接成功\n   * 3: 协议监听成功\n   */\n  status = 0;\n\n  /** 事件回调处理器 */\n  callback: ConnectCallback | null = null;\n\n  /** 当前连接中的蓝牙设备实例 */\n  currentDevice: WechatMiniprogram.BlueToothDevice | null = null;\n\n  /**\n   * 上次断开连接的时间戳\n   * 用于防止频繁重连导致的认证失败\n   */\n  disconnectTime: number = 0;\n\n  /** 当前可用的最大传输单元(MTU)大小 */\n  mtu: number = 0;\n\n  /** 支持的最大MTU大小限制 */\n  maxMTU: number = 512;\n\n  /** 当前连接的蓝牙服务实例 */\n  communicationService: WechatMiniprogram.BLEService | null = null;\n\n  /** 用于写入数据的蓝牙特征值 */\n  communicationWriteCharacteristic: WechatMiniprogram.BLECharacteristic | null = null;\n\n  /** 用于读取数据的蓝牙特征值 */\n  communicationReadCharacteristic: WechatMiniprogram.BLECharacteristic | null = null;\n\n  /** 通信接口实现 */\n  communication: Communication;\n\n  /**\n   * 构造函数\n   * @param communication 通信接口实现实例\n   */\n  constructor(communication: Communication) {\n    this.communication = communication;\n  }\n\n  /**\n   * 连接蓝牙设备\n   * @param device 要连接的蓝牙设备\n   * @param isOTA 是否是OTA升级模式，OTA模式下不检查重连间隔\n   * @returns 是否成功发起连接请求\n   */\n  connect(device: WechatMiniprogram.BlueToothDevice, isOTA: boolean): boolean {\n    let date = new Date();\n    let currentTime = date.getTime();\n    if (currentTime - this.disconnectTime < 2000 && !isOTA) {\n      // 频繁断开连接设备，会导致认证失败。原因是频繁连接操作，BLE实际没有断开，设备无法进行认证。OTA的时候不需要这样\n      SDKLogger.log('connect failed interval time <2000');\n      return false;\n    }\n    if (this.isConnectedOrConnecting()) {\n      SDKLogger.log('connect failed is connected Or connecting');\n      return false;\n    }\n    this.status = 1;\n    this.currentDevice = device;\n    SDKLogger.log('开始连接设备 ' + JSON.stringify(device));\n    uni.createBLEConnection({\n      deviceId: device.deviceId,\n      success: (res) => {\n        SDKLogger.log('连接蓝牙成功:' + JSON.stringify(res.errMsg));\n        // 连接设备后断开搜索 并且不能搜索设备\n        this.status = 2;\n        let deviceInfo = uni.getDeviceInfo();\n        if (deviceInfo.platform == 'android') {\n          setTimeout(() => {\n            uni.setBLEMTU({\n              deviceId: device.deviceId,\n              mtu: this.maxMTU,\n              success: (res) => {\n                SDKLogger.log('调节MTU成功，' + res.mtu);\n                this.mtu = res.mtu;\n                if (this.callback && this.callback.onMTUChange && this.currentDevice) {\n                  this.callback.onMTUChange(this.currentDevice, this.mtu);\n                }\n                this._getBLEDeviceServices();\n                this._registerConnStatusListener();\n              },\n              fail: (res) => {\n                SDKLogger.log('调节失败，直接获取MTU，' + JSON.stringify(res));\n                uni.getBLEMTU({\n                  deviceId: device.deviceId,\n                  success: (res) => {\n                    SDKLogger.log('调节MTU成功，' + JSON.stringify(res.mtu));\n                    this.mtu = res.mtu;\n                    if (this.callback && this.callback.onMTUChange && this.currentDevice) {\n                      this.callback.onMTUChange(this.currentDevice, this.mtu);\n                    }\n                    this._getBLEDeviceServices();\n                    this._registerConnStatusListener();\n                  },\n                  fail: (res) => {\n                    SDKLogger.log('调节MTU失败，' + JSON.stringify(res));\n                    this.disconnect();\n                    this._connectFailed(errorUtils(res));\n                  },\n                });\n              },\n            });\n          }, 200);\n        } else {\n          setTimeout(() => {\n            uni.getBLEMTU({\n              writeType: 'writeNoResponse',\n              deviceId: device.deviceId,\n              success: (res) => {\n                SDKLogger.log('iOS调节MTU成功，api的mtu' + JSON.stringify(res.mtu));\n                if (res.mtu == 23) {\n                  //代表该mtu 的api不可用，认为设备mtu为123\n                  this.mtu = 128;\n                } else {\n                  this.mtu = res.mtu;\n                }\n                SDKLogger.log('iOS调节MTU成功，最终的mtu' + JSON.stringify(res.mtu));\n\n                if (this.callback && this.callback.onMTUChange && this.currentDevice) {\n                  SDKLogger.log('iOS调节MTU成功回调');\n                  this.callback.onMTUChange(this.currentDevice, this.mtu);\n                }\n                this._getBLEDeviceServices();\n                this._registerConnStatusListener();\n              },\n              fail: (res) => {\n                SDKLogger.log('调节MTU失败，' + JSON.stringify(res));\n                this.disconnect();\n                this._connectFailed(errorUtils(res));\n              },\n            });\n          }, 100);\n        }\n      },\n      fail: (error) => {\n        SDKLogger.log('连接失败，' + +JSON.stringify(error));\n        if (this.status == 2) {\n          SDKLogger.log('连接失败，已在onBLEConnectionStateChange处理，所以不做回调');\n          return;\n        } else {\n          this._connectFailed(errorUtils(error));\n        }\n      },\n    });\n\n    return true;\n  }\n\n  /**\n   * 设置最大MTU大小\n   * @param mtu 最大MTU大小\n   */\n  setMaxMTU(mtu: number) {\n    this.maxMTU = mtu;\n  }\n\n  /**\n   * 切换蓝牙特征值\n   * @returns Promise<void>\n   */\n  changeCharacteristics() {\n    SDKLogger.log('重置蓝牙监听');\n    // 移除之前的监听函数\n    uni.offBLECharacteristicValueChange();\n    // 重新绑定服务和监听\n    this._getBLEDeviceServices();\n    let deviceInfo = uni.getDeviceInfo();\n    const that = this;\n    if (that.currentDevice && that.currentDevice.deviceId) {\n      const deviceId = that.currentDevice.deviceId;\n      if (deviceInfo.platform == 'android') {\n        setTimeout(() => {\n          uni.setBLEMTU({\n            deviceId: deviceId,\n            mtu: this.maxMTU,\n            success: (res) => {\n              SDKLogger.log('调节MTU成功，' + res.mtu);\n              this.mtu = res.mtu;\n              if (this.callback && this.callback.onMTUChange && this.currentDevice) {\n                this.callback.onMTUChange(this.currentDevice, this.mtu);\n              }\n            },\n            fail: (res) => {\n              SDKLogger.log('调节失败，直接获取MTU，' + JSON.stringify(res));\n              uni.getBLEMTU({\n                deviceId: deviceId,\n                success: (res) => {\n                  SDKLogger.log('调节MTU成功，' + JSON.stringify(res.mtu));\n                  this.mtu = res.mtu;\n                  if (this.callback && this.callback.onMTUChange && this.currentDevice) {\n                    this.callback.onMTUChange(this.currentDevice, this.mtu);\n                  }\n                },\n                fail: (res) => {\n                  SDKLogger.log('调节MTU失败，' + JSON.stringify(res));\n                },\n              });\n            },\n          });\n        }, 200);\n      } else {\n        setTimeout(() => {\n          uni.getBLEMTU({\n            writeType: 'writeNoResponse',\n            deviceId: deviceId,\n            success: (res) => {\n              SDKLogger.log('iOS调节MTU成功，api的mtu' + JSON.stringify(res.mtu));\n              if (res.mtu == 23) {\n                //代表该mtu 的api不可用，认为设备mtu为123\n                that.mtu = 128;\n              } else {\n                that.mtu = res.mtu;\n              }\n              SDKLogger.log('iOS调节MTU成功，最终的mtu' + JSON.stringify(res.mtu));\n              if (that.callback && that.callback.onMTUChange && that.currentDevice) {\n                SDKLogger.log('iOS调节MTU成功回调');\n                that.callback.onMTUChange(that.currentDevice, that.mtu);\n              }\n            },\n            fail: (res) => {\n              SDKLogger.log('调节MTU失败，' + JSON.stringify(res));\n            },\n          });\n        }, 100);\n      }\n    } else {\n      // TODO 重置的时候设备实例为空，检查代码是否那里初始化了\n      SDKLogger.log('currentDevice is null');\n    }\n\n    return new Promise<void>((resolve) => {\n      setTimeout(() => {\n        resolve();\n      }, 1500);\n    });\n  }\n\n  /**\n   * 断开蓝牙连接\n   * @param isExecCallback 是否执行断开连接回调\n   */\n  disconnect(isExecCallback = true) {\n    SDKLogger.log(\n      'SDK:disconnect --> this.isConnectedOrConnecting()',\n      this.isConnectedOrConnecting(),\n    );\n    SDKLogger.log('SDK:disconnect --> this.currentDevice', this.currentDevice);\n    if (this.isConnectedOrConnecting() && this.currentDevice) {\n      uni.closeBLEConnection({\n        deviceId: this.currentDevice.deviceId,\n        success: () => {\n          SDKLogger.log('SDK:closeBLEConnection, 蓝牙关闭成功');\n          this.status = 0\n          this.handleCloseBluetoothAdapter()\n        },\n        fail: (error) => {\n          SDKLogger.log('蓝牙关闭失败' + JSON.stringify(errorUtils(error)));\n        },\n      });\n      if (isExecCallback) this._disconnect();\n    } else {\n      this.handleCloseBluetoothAdapter()\n    }\n  }\n\n  handleCloseBluetoothAdapter() {\n    uni.closeBluetoothAdapter({\n      success: () => {\n        SDKLogger.log('SDK:closeBluetoothAdapter, 蓝牙关闭成功');\n      },\n      fail: (error) => {\n        SDKLogger.log('蓝牙关闭失败' + JSON.stringify(errorUtils(error)));\n      },\n    });\n  }\n\n  /**\n   * 设置事件回调处理器\n   * @param callback 事件回调处理器\n   */\n  setCallback(callback: ConnectCallback | null) {\n    this.callback = callback;\n  }\n\n  /**\n   * 获取当前连接的蓝牙设备实例\n   * @returns WechatMiniprogram.BlueToothDevice | null\n   */\n  getConnectedDevice(): WechatMiniprogram.BlueToothDevice | null {\n    if (this.isConnected()) {\n      return this.currentDevice;\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * 获取当前连接的蓝牙服务实例\n   * @returns WechatMiniprogram.BLEService | null\n   */\n  getCommunicationService(): WechatMiniprogram.BLEService | null {\n    return this.communicationService;\n  }\n\n  /**\n   * 获取通信接口实现实例\n   * @returns Communication\n   */\n  getCommunication(): Communication {\n    return this.communication;\n  }\n\n  /**\n   * 设置通信接口实现实例\n   * @param communication 通信接口实现实例\n   * @returns Promise<void>\n   */\n  async setCommunication(communication: Communication) {\n\n    // const oldBleDeviceCharacteristicsMap: BLEDeviceCharacteristicsMap =\n    //   this.communication.onMatchingServiceCharacteristic();\n    // const newBleDeviceCharacteristicsMap: BLEDeviceCharacteristicsMap =\n    //   this.communication.onMatchingServiceCharacteristic();\n    //   if (oldBleDeviceCharacteristicsMap.write !== newBleDeviceCharacteristicsMap.write || oldBleDeviceCharacteristicsMap.notify !== newBleDeviceCharacteristicsMap.notify) {\n\n    //   }\n    this.communication = communication;\n    await this.changeCharacteristics();\n  }\n\n  /**\n   * 获取用于写入数据的蓝牙特征值\n   * @returns WechatMiniprogram.BLECharacteristic | null\n   */\n  getCommunicationWriteCharacteristic(): WechatMiniprogram.BLECharacteristic | null {\n    return this.communicationWriteCharacteristic;\n  }\n\n  /**\n   * 获取用于读取数据的蓝牙特征值\n   * @returns WechatMiniprogram.BLECharacteristic | null\n   */\n  getCommunicationReadCharacteristic(): WechatMiniprogram.BLECharacteristic | null {\n    return this.communicationReadCharacteristic;\n  }\n\n  /**\n   * 获取当前可用的最大传输单元(MTU)大小\n   * @returns number | undefined\n   */\n  getMTU(): number | undefined {\n    if (this.isConnected()) {\n      return this.mtu;\n    }\n    return undefined;\n  }\n\n  /**\n   * 判断是否处于连接中或连接成功状态\n   * @returns boolean\n   */\n  isConnectedOrConnecting() {\n    return this.isConnected() || this.isConnecting();\n  }\n\n  /**\n   * 判断是否处于连接中状态\n   * @returns boolean\n   */\n  isConnecting() {\n    return this.status == 1 || this.status == 2;\n  }\n\n  /**\n   * 判断是否处于连接成功状态\n   * @returns boolean\n   */\n  isConnected() {\n    return this.status == 3;\n  }\n\n  /**\n   * 注册连接状态监听器\n   */\n  _registerConnStatusListener() {\n    // SDKLogger.log('注册连接状态回调');\n    let that = this;\n    let resFun = function (res: WechatMiniprogram.OnBLEConnectionStateChangeListenerResult) {\n      // 该方法回调中可以用于处理连接意外断开等异常情况\n      SDKLogger.log('蓝牙连接状态变化' + JSON.stringify(res));\n      if (that.currentDevice && that.currentDevice.deviceId != res.deviceId) {\n        SDKLogger.log('不是同一设备' + JSON.stringify(res));\n        SDKLogger.log('不是同一设备1' + JSON.stringify(that.currentDevice));\n        return;\n      }\n      if (res.connected) {\n        // that.status = 2;\n        // that._getBLEDeviceServices();\n      } else {\n        // 移除之前的监听函数\n        uni.offBluetoothDeviceFound();\n        uni.offBluetoothAdapterStateChange();\n        uni.offBLEMTUChange();\n        uni.offBLEConnectionStateChange();\n        uni.offBLECharacteristicValueChange();\n        uni.offBLEConnectionStateChange(resFun);\n        if (that.status == 3) {\n          let date = new Date();\n          that.disconnectTime = date.getTime();\n          that._disconnect();\n        } else {\n          that._connectFailed();\n        }\n      }\n    };\n    uni.onBLEConnectionStateChange(resFun);\n  }\n\n  /**\n   * 获取蓝牙设备服务列表\n   */\n  _getBLEDeviceServices() {\n    SDKLogger.log('_getBLEDeviceServices当前连接', this.currentDevice);\n    if (this.currentDevice && this.currentDevice.deviceId) {\n      let deviceId = this.currentDevice.deviceId;\n      SDKLogger.log('获取所有服务的 uuid:' + deviceId);\n      // 延迟一定时间，否则会报错\n      setTimeout(() => {\n        uni.getBLEDeviceServices({\n          deviceId,\n          success: (res: WechatMiniprogram.GetBLEDeviceServicesSuccessCallbackResult) => {\n            SDKLogger.log('获取设备服务成功:', res.services);\n            const services = res.services;\n            if (services.length <= 0) {\n              this._connectFailed();\n              return;\n            }\n            this.communicationService = this.communication.onMatchingService(services);\n            if (!this.communicationService) {\n              SDKLogger.log('未能找到对应的service uuid');\n              this._connectFailed();\n            } else {\n              this._getBLEDeviceCharacteristics(deviceId, this.communicationService.uuid);\n            }\n          },\n          fail: (e) => {\n            SDKLogger.log('获取设备服务失败，错误码：' + e.errCode);\n            this._connectFailed(errorUtils(e));\n          },\n        });\n      }, 1000);\n    }\n  }\n\n\n\n  /**\n   * 获取蓝牙设备特征值列表\n   * @param deviceId 设备ID\n   * @param serviceId 服务ID\n   */\n  _getBLEDeviceCharacteristics(deviceId: string, serviceId: string) {\n    SDKLogger.log(\n      '获取某个服务下的所有特征值' + '\\tdeviceId=' + deviceId + '\\tserviceId=' + serviceId,\n    );\n    uni.getBLEDeviceCharacteristics({\n      deviceId,\n      serviceId,\n      success: (res) => {\n        let characteristics = res.characteristics;\n        SDKLogger.log('getBLEDeviceCharacteristics', characteristics);\n        if (characteristics.length <= 0) {\n          this._connectFailed();\n          return;\n        }\n        let hasNotifyUUID = false;\n        const bleDeviceCharacteristicsMap: BLEDeviceCharacteristicsMap =\n          this.communication.onMatchingServiceCharacteristic();\n        characteristics.forEach((characteristicItem) => {\n          if (bleDeviceCharacteristicsMap.write == characteristicItem.uuid) {\n            this.communicationWriteCharacteristic = characteristicItem;\n          }\n          if (bleDeviceCharacteristicsMap.notify == characteristicItem.uuid) {\n            this._notifyBLECharacteristicValueChange({\n              deviceId: deviceId,\n              serviceId: serviceId,\n              characteristicId: characteristicItem.uuid,\n            });\n            hasNotifyUUID = true;\n          }\n          if (bleDeviceCharacteristicsMap.read == characteristicItem.uuid) {\n            this.communicationReadCharacteristic = characteristicItem;\n          }\n        });\n        if (!hasNotifyUUID) {\n          SDKLogger.log('未能找到Notify特征值！');\n          this._connectFailed();\n        }\n      },\n      fail: (e) => {\n        SDKLogger.log('获取特征值失败，错误码：' + e.errCode);\n        this._connectFailed(errorUtils(e));\n      },\n    });\n  }\n\n  /**\n   * 订阅蓝牙特征值变化\n   * @param obj 订阅参数\n   */\n  _notifyBLECharacteristicValueChange(obj: {\n    deviceId: string;\n    serviceId: string;\n    characteristicId: string;\n  }) {\n    uni.notifyBLECharacteristicValueChange({\n      state: true, // 启用 notify 功能\n      deviceId: obj.deviceId,\n      serviceId: obj.serviceId,\n      characteristicId: obj.characteristicId,\n      success: (res) => {\n        SDKLogger.log('使能通知成功：' + JSON.stringify(res), obj.characteristicId);\n        this._connectSuccsed();\n      },\n      fail: (err) => {\n        SDKLogger.log('使能通知失败' + JSON.stringify(err));\n        this._connectFailed(errorUtils(err));\n      },\n    });\n  }\n\n  /**\n   * 断开连接回调\n   */\n  _disconnect() {\n    this.status = 0;\n    if (this.callback && this.callback.onDisconnect && this.currentDevice) {\n      this.callback.onDisconnect(this.currentDevice);\n    }\n  }\n\n  /**\n   * 连接失败回调\n   * @param error 错误信息\n   */\n  _connectFailed(error?: WechatMiniprogram.BluetoothError) {\n    this.status = 0;\n    if (this.callback && this.callback.onFailed && this.currentDevice) {\n      this.callback.onFailed(this.currentDevice, error);\n    }\n  }\n\n  /**\n   * 连接成功回调\n   */\n  _connectSuccsed() {\n    this.status = 3;\n    if (this.callback && this.callback.onSuccess && this.currentDevice) {\n      this.callback.onSuccess(this.currentDevice);\n    }\n  }\n}\n\n/** 设备连接的回调 */\nexport interface ConnectCallback {\n  onDisconnect?: ConnectDisconnectCallback;\n  onFailed?: ConnectFailedCallback;\n  onSuccess?: ConnectSuccessCallback;\n  onMTUChange?: DeviceMTUChangeCallback;\n}\n\n/** 设备断开的回调函数 */\ntype ConnectDisconnectCallback = (result: WechatMiniprogram.BlueToothDevice) => void;\n\n/** 设备连接失败的回调函数 */\ntype ConnectFailedCallback = (\n  result: WechatMiniprogram.BlueToothDevice,\n  error?: WechatMiniprogram.BluetoothError,\n) => void;\n\n/** 设备连接成功的回调函数 */\ntype ConnectSuccessCallback = (result: WechatMiniprogram.BlueToothDevice) => void;\n\n/** 设备MTU改变的回调函数 */\ntype DeviceMTUChangeCallback = (result: WechatMiniprogram.BlueToothDevice, mtu: number) => void;\n","import { dataConversion } from '@onbright/common-sdk';\nimport { ProtocolComponent } from '../interface/ProtocolComponent';\nimport errorUtils from '../utils/errorUtils';\nimport { SDKLogger } from '@onbright/common-sdk'\n\n\nexport class DataHandler {\n  protocolComponent: ProtocolComponent;\n  /**\n   * 接收数据回调函数数组\n   * 用于存储多个数据接收的回调处理函数\n   */\n  callbacks: Array<AcceptDataCallback> = [];\n  /**\n   * 每个serviceId对应的MTU（Maximum Transmission Unit）大小映射\n   * 用于存储不同服务的最大传输单元大小\n   */\n  mtuMap: Map<string, number> = new Map();\n  /**\n   * 发送数据任务队列\n   * 用于存储待发送的数据任务\n   */\n  sendInfoArray: Array<SendDataTask> = [];\n  /**\n   * 数据发送失败后的重试次数计数\n   */\n  retryNum: number = 0;\n\n  constructor(protocolComponent: ProtocolComponent) {\n    this.protocolComponent = protocolComponent;\n  }\n  /**\n   * 初始化蓝牙数据处理\n   * 设置蓝牙特征值变化的监听器\n   */\n  init() {\n    uni.onBLECharacteristicValueChange((res) => {\n      SDKLogger.debug(\n        '收到数据 serviceId uuid:' + res.serviceId + '  characteristicId: ' + res.characteristicId,\n      );\n      SDKLogger.debug('收到数据:' + dataConversion.ab2hex(res.value));\n      this.protocolComponent.onProcessNotifyData?.(res).then((processedData) => {\n        this._handlerData(processedData);\n      });\n    });\n  }\n\n  /**\n   * 添加数据接收回调函数\n   * @param callback 要添加的回调函数\n   */\n  addCallbacks(callback: AcceptDataCallback) {\n    if (this.callbacks.indexOf(callback) == -1) {\n      this.callbacks.push(callback);\n    }\n  }\n\n  /**\n   * 移除数据接收回调函数\n   * @param callback 要移除的回调函数\n   */\n  removeCallbacks(callback: AcceptDataCallback) {\n    var index = this.callbacks.indexOf(callback);\n    if (index != -1) {\n      this.callbacks.splice(index, 1);\n    }\n  }\n\n  /**\n   * 处理接收到的数据\n   * @param res 接收到的数据\n   */\n  _handlerData(res: any) {\n    this._doAction({\n      action: function (c) {\n        if (c.onReceiveData) {\n          c.onReceiveData(res);\n        }\n      },\n    });\n  }\n\n  /**\n   * 执行回调函数\n   * @param obj 包含要执行的动作的对象\n   */\n  _doAction(obj: { action: (c: AcceptDataCallback) => void }) {\n    this.callbacks.forEach((c) => {\n      obj.action(c);\n    });\n  }\n\n  /**\n   * 设置指定设备的MTU大小\n   * @param deviceId 设备ID\n   * @param mtu MTU大小\n   */\n  setMtu(deviceId: string, mtu: number) {\n    // SDKLogger.log('--->' + deviceId + ':' + mtu);\n    this.mtuMap.set(deviceId, mtu);\n  }\n\n  /**\n   * 发送数据到蓝牙设备\n   * 根据MTU大小对数据进行分包处理\n   * @param deviceId 设备ID\n   * @param serviceId 服务ID\n   * @param characteristicId 特征值ID\n   * @param data 要发送的数据\n   */\n  sendData(deviceId: string, serviceId: string, characteristicId: string, data: Uint8Array) {\n    SDKLogger.debug('发送数据：', deviceId, serviceId, characteristicId, data);\n    this.protocolComponent.onProcessingSentData?.(data).then((realData) => {\n      const mtu = this.mtuMap.get(deviceId);\n      let realMTU = 20;\n      if (mtu != undefined) realMTU = mtu - 3;\n      SDKLogger.debug('realMTU --->', realMTU, 'realData length --->', realData.byteLength);\n\n      const dataLen = realData.byteLength;\n      const blockCount = Math.floor(dataLen / realMTU);\n      for (let i = 0; i < blockCount; i++) {\n        const mBlockData = new Uint8Array(realMTU);\n        mBlockData.set(realData.slice(i * realMTU, i * realMTU + mBlockData.length));\n        this._addSendData(deviceId, serviceId, characteristicId, mBlockData);\n      }\n      if (0 != dataLen % realMTU) {\n        const noBlockData = new Uint8Array(dataLen % realMTU);\n        noBlockData.set(realData.slice(dataLen - (dataLen % realMTU), dataLen));\n        this._addSendData(deviceId, serviceId, characteristicId, noBlockData);\n      }\n    });\n  }\n\n  /**\n   * 添加发送数据任务到队列\n   * @param deviceId 设备ID\n   * @param serviceId 服务ID\n   * @param characteristicId 特征值ID\n   * @param data 要发送的数据\n   * @returns 是否成功添加到队列\n   */\n  _addSendData(\n    deviceId: string,\n    serviceId: string,\n    characteristicId: string,\n    data: Uint8Array,\n  ): boolean {\n    const sendDataTask = new SendDataTask(deviceId, serviceId, characteristicId, data);\n    this.sendInfoArray.push(sendDataTask);\n    if (this.sendInfoArray.length > 1) {\n      return true;\n    }\n    const handleCallback = {\n      complete: () => {\n        this._writeDataToDevice(this.sendInfoArray, handleCallback);\n      },\n    };\n    this._writeDataToDevice(this.sendInfoArray, handleCallback);\n    return true;\n  }\n\n  /**\n   * 向设备写入数据\n   * @param dataInfoArray 数据任务数组\n   * @param callback 完成回调\n   */\n  _writeDataToDevice(dataInfoArray: Array<SendDataTask>, callback: { complete?: Function }) {\n    const dataInfo = dataInfoArray.shift();\n    if (dataInfo == undefined) {\n      if (dataInfoArray.length == 0) return;\n      callback.complete?.();\n      return;\n    }\n    this._sendData(dataInfo, callback);\n  }\n\n  /**\n   * 执行发送数据操作\n   * 包含失败重试机制，最多重试3次\n   * @param sendDataTask 发送数据任务\n   * @param callback 完成回调\n   * @returns 是否成功发送\n   */\n  _sendData(sendDataTask: SendDataTask, callback: { complete?: Function }): boolean {\n    // 发送失败重发三次\n    SDKLogger.debug(\n      `开始发送数据：-> ${dataConversion.ab2hex(sendDataTask.data.buffer as ArrayBuffer)}，deviceId：${sendDataTask.deviceId}，serviceId：${sendDataTask.serviceId}，characteristicId：${sendDataTask.characteristicId}`,\n    );\n    SDKLogger.debug(\n      `this.protocolComponent`,\n      this.protocolComponent &&\n        this.protocolComponent.sendDataWriteType &&\n        this.protocolComponent.sendDataWriteType()\n        ? this.protocolComponent.sendDataWriteType()\n        : 'write',\n    );\n    uni.writeBLECharacteristicValue({\n      deviceId: sendDataTask.deviceId,\n      serviceId: sendDataTask.serviceId,\n      characteristicId: sendDataTask.characteristicId,\n      value: sendDataTask.data.buffer as ArrayBuffer,\n      writeType:\n        this.protocolComponent &&\n          this.protocolComponent.sendDataWriteType &&\n          this.protocolComponent.sendDataWriteType()\n          ? this.protocolComponent.sendDataWriteType()\n          : 'write',\n      fail: (err) => {\n        this.retryNum++;\n        if (this.retryNum >= 3) {\n          SDKLogger.error(\n            '发送失败，重发数据：->' +\n            '\\terr=' +\n            JSON.stringify(err) +\n            ' retryNum = ' +\n            this.retryNum,\n          );\n          this._sendData(sendDataTask, callback);\n        } else {\n          this.retryNum = 0;\n          callback.complete?.();\n        }\n        SDKLogger.error('发送数据失败：->' + '\\terr=' + JSON.stringify(err));\n        this.protocolComponent.onProcessSentFailed &&\n          this.protocolComponent.onProcessSentFailed(errorUtils(err));\n      },\n      success: () => {\n        SDKLogger.debug(\n          '发送数据成功：->' +\n          dataConversion.ab2hex(sendDataTask.data.buffer as ArrayBuffer) +\n          ' serviceId:' +\n          sendDataTask.serviceId,\n        );\n        this.retryNum = 0;\n        callback.complete?.();\n      },\n    });\n    return true;\n  }\n\n  /**\n   * 读取蓝牙设备数据\n   * @param deviceId 设备ID\n   * @param serviceId 服务ID\n   * @param characteristicId 特征值ID\n   */\n  readData(deviceId: string, serviceId: string, characteristicId: string) {\n    uni.readBLECharacteristicValue({\n      deviceId,\n      serviceId,\n      characteristicId,\n      success: (res) => {\n        SDKLogger.debug('读取数据成功', res);\n        // this.protocolComponent.onProcessReadData && this.protocolComponent.onProcessReadData(res);\n      },\n      fail: (error) => {\n        SDKLogger.error('读取数据失败');\n        this.protocolComponent.onProcessReadFailed &&\n          this.protocolComponent.onProcessReadFailed(error);\n      },\n    });\n  }\n}\n\nexport interface AcceptDataCallback {\n  onReceiveData?: (res: any) => void;\n}\n\n/**\n * 蓝牙发送数据任务类\n */\nclass SendDataTask {\n  /**\n   * 设备ID\n   */\n  public deviceId: string;\n  /**\n   * 服务ID\n   */\n  public serviceId: string;\n  /**\n   * 特征值ID\n   */\n  public characteristicId: string;\n\n  /**\n   * 待发送的数据\n   */\n  public data: Uint8Array;\n\n  constructor(deviceId: string, serviceId: string, characteristicId: string, data: Uint8Array) {\n    this.deviceId = deviceId;\n    this.serviceId = serviceId;\n    this.characteristicId = characteristicId;\n    this.data = data;\n  }\n}\n","import errorUtils from '../utils/errorUtils';\nimport { SDKLogger } from '@onbright/common-sdk'\n\n/**\n * 蓝牙设备扫描处理类\n * 负责管理蓝牙设备的搜索、发现和状态监控\n * 包含设备搜索的启动、停止、超时控制等功能\n */\nexport class ScanHandler {\n  /**\n   * 要搜索的蓝牙设备主服务的 UUID 列表\n   */\n  services: Array<string> = [];\n\n  /**\n   * 扫描的设备列表，存储发现的蓝牙设备信息\n   */\n  scanList: WechatMiniprogram.BlueToothDevice[] = [];\n\n  /**\n   * 扫描的设备mac地址集合，用于过滤重复设备\n   */\n  foundDeviceMacSet: Set<string> = new Set();\n\n  /**\n   * 扫描超时定时器句柄\n   */\n  timeoutId: number | null = null;\n\n  /**\n   * 扫描过程中的事件回调函数集合\n   */\n  callback: ScanCallback | null = null;\n\n  /**\n   * 搜索蓝牙的超时时间，默认30秒\n   */\n  scanTime: number = 30000;\n\n  /**\n   * 是否搜索没有名字的蓝牙\n   */\n  enableSearchUnnamedBle: Boolean = false;\n\n  /**\n   * 蓝牙扫描时间间隔\n   */\n  interval: number = 200;\n\n  /**\n   * 初始化蓝牙扫描处理器\n   * 1. 注册蓝牙设备发现监听器\n   * 2. 监听蓝牙适配器状态变化\n   *    - 当适配器不可用时，停止扫描并清空设备列表\n   *    - 当适配器可用且正在搜索时，重置设备列表并触发设备发现回调\n   */\n  constructor() {\n    this._onBluetoothDeviceFound();\n    uni.onBluetoothAdapterStateChange((res) => {\n      // SDKLogger.log('onBluetoothAdapterStateChange 触发了', res.available, res.discovering);\n      this._onAdapter(res);\n\n      if (!res.available) {\n        if (res.discovering) {\n          this.stopScan();\n        }\n        this.scanList = [];\n        this.foundDeviceMacSet = new Set();\n      } else if (res.available && res.discovering) {\n        this.scanList = [];\n        this.foundDeviceMacSet = new Set();\n        this._onFound(this.scanList);\n      }\n    });\n  }\n\n  /**\n   * 设置扫描回调函数\n   * @param callback 扫描过程中的事件回调函数集合\n   */\n  setCallback(callback: ScanCallback | null) {\n    this.callback = callback;\n  }\n\n  /**\n   * 设置搜索蓝牙的超时时间\n   * @param scanTime 搜索蓝牙的超时时间，默认30秒\n   */\n  setScanTime(scanTime: number = 30000) {\n    this.scanTime = scanTime;\n  }\n\n  /**\n   * 设置要搜索的蓝牙设备主服务的 UUID 列表\n   * @param services 要搜索的蓝牙设备主服务的 UUID 列表\n   */\n  setServices(services: Array<string>) {\n    this.services = services;\n  }\n\n  setEnableSearchUnnamedBle(enableSearchUnnamedBle: Boolean) {\n    this.enableSearchUnnamedBle = enableSearchUnnamedBle;\n  }\n\n  setInterval(interval: number) {\n    this.interval = interval;\n  }\n\n  /**\n   * 启动蓝牙设备扫描\n   * 1. 停止当前扫描\n   * 2. 清空设备列表\n   * 3. 获取蓝牙适配器状态\n   */\n  startScan() {\n    // SDKLogger.log('SDK:startScan 进来了');\n    this._stopTiming();\n    this.scanList = [];\n    this.foundDeviceMacSet = new Set();\n    this._getAdapterStatus({\n      fail: () => {\n        this._openAdapter();\n      },\n    });\n  }\n\n  /**\n   * 停止蓝牙设备扫描\n   * @param isExecCallback 是否执行回调函数，默认true\n   */\n  stopScan(isExecCallback = true) {\n    // SDKLogger.log('stopScan 进来了');\n    this._stopTiming();\n    uni.stopBluetoothDevicesDiscovery({\n      success: () => {\n        SDKLogger.log('停止扫描成功')\n        if (isExecCallback) this._onStop();\n      },\n      fail: (error) => {\n        SDKLogger.log('停止扫描失败', error);\n        this._onFailed(errorUtils(error));\n      },\n    });\n  }\n\n  /**\n   * 发现外围设备\n   */\n  _onBluetoothDeviceFound() {\n    uni.onBluetoothDeviceFound((res) => {\n      var devices = res.devices;\n      if (!devices || devices.length < 1) {\n        return;\n      }\n      devices.forEach((device) => {\n        const deviceAddress = device.deviceId;\n        if (this.foundDeviceMacSet.has(deviceAddress)) {\n          // 如果设备已经发现过，更新蓝牙信息\n          const index = this.scanList.findIndex((item) => item.deviceId === deviceAddress);\n          // if (index !== -1) {\n          //   // 删除已有的设备\n          //   this.scanList.splice(index, 1);\n          // }\n          // this.scanList.push(device);\n          if (index === -1) {\n            this.scanList.push(device);\n          }\n        } else {\n          if (!this.enableSearchUnnamedBle && !device.name) {\n            // 如果未开启搜索无名设备且设备没有名称，则忽略\n            return;\n          }\n          // 将设备添加到扫描列表和已发现设备集合\n          this.scanList.push(device);\n          this.foundDeviceMacSet.add(deviceAddress);\n        }\n      });\n      this._onFound(this.scanList);\n    });\n  }\n\n  /**\n   * 打开蓝牙适配器\n   */\n  _openAdapter() {\n    uni.openBluetoothAdapter({\n      fail: (error) => {\n        this._onFailed(errorUtils(error));\n      },\n      success: () => {\n        // SDKLogger.log('SDK:_openAdapter触发了');\n        this._getAdapterStatus(null);\n      },\n    });\n  }\n\n  /**\n   * 获取本机蓝牙适配器状态\n   * @param callback 获取状态失败的回调函数\n   */\n  _getAdapterStatus(callback: { fail: Function } | null) {\n    uni.getBluetoothAdapterState({\n      success: (res) => {\n        SDKLogger.log('蓝牙适配器初始化成功', res);\n        if (res.available && res.discovering) {\n          // SDKLogger.log('SDK:getBluetoothAdapterState触发了');\n          this._startTiming();\n          this._onFound(this.scanList);\n          this._onSuccess();\n          return;\n        }\n        this._startScan();\n      },\n      fail: (error) => {\n        SDKLogger.log('蓝牙适配器初始化失败', error);\n        if (callback != null && callback.fail) {\n          callback.fail(errorUtils(error));\n        } else {\n          this._onFailed(errorUtils(error));\n        }\n      },\n    });\n  }\n\n  /**\n   * 开始搜寻附近的蓝牙外围设备\n   */\n  _startScan() {\n    uni.startBluetoothDevicesDiscovery({\n      allowDuplicatesKey: true,\n      interval: this.interval,\n      success: (e) => {\n        SDKLogger.log('开始扫描设备');\n        this._onBluetoothDeviceFound();\n        this._startTiming();\n        this._onSuccess();\n      },\n      fail: (error) => {\n        this._onFailed(errorUtils(error));\n      },\n    });\n  }\n\n  /**\n   * 停止扫描超时定时器\n   */\n  _stopTiming() {\n    SDKLogger.log('扫描设备超时停止', this.timeoutId);\n    if (this.timeoutId != null) {\n      clearTimeout(this.timeoutId);\n    }\n    this.timeoutId = null;\n  }\n\n  /**\n   * 启动扫描超时定时器\n   */\n  _startTiming() {\n    if (this.timeoutId) {\n      return;\n    }\n    this.timeoutId = setTimeout(() => {\n      this.stopScan();\n    }, this.scanTime);\n  }\n\n  /**\n   * 蓝牙适配器状态变化回调\n   * @param res 蓝牙适配器状态变化事件\n   */\n  _onAdapter(res: WechatMiniprogram.OnBluetoothAdapterStateChangeListenerResult) {\n    if (this.callback && this.callback.onAdapter) {\n      this.callback.onAdapter(res);\n    }\n  }\n\n  /**\n   * 扫描成功回调\n   */\n  _onSuccess() {\n    if (this.callback && this.callback.onSuccess) {\n      this.callback.onSuccess();\n    }\n  }\n\n  /**\n   * 扫描失败回调\n   * @param res 扫描失败事件\n   */\n  _onFailed(res: WechatMiniprogram.BluetoothError) {\n    if (this.callback && this.callback.onFailed) {\n      this.callback.onFailed(res);\n    }\n  }\n\n  /**\n   * 设备发现回调\n   * @param devices 发现的蓝牙设备列表\n   */\n  _onFound(devices: WechatMiniprogram.BlueToothDevice[]) {\n    if (this.callback && this.callback.onFound) {\n      this.callback.onFound(devices);\n    }\n  }\n\n  /**\n   * 扫描停止回调\n   */\n  _onStop() {\n    if (this.callback && this.callback.onStop) {\n      this.callback.onStop();\n    }\n  }\n}\n\n/**\n * 扫描回调函数集合\n */\nexport interface ScanCallback {\n  /**\n   * 蓝牙适配器状态变化回调\n   */\n  onAdapter?: ScanOnAdapterCallback;\n  /**\n   * 扫描成功回调\n   */\n  onSuccess?: ScanSuccessCallback;\n  /**\n   * 扫描失败回调\n   */\n  onFailed?: ScanFailedCallback;\n  /**\n   * 设备发现回调\n   */\n  onFound?: ScanOnFoundCallback;\n  /**\n   * 扫描停止回调\n   */\n  onStop?: ScanStopCallback;\n}\n\n/**\n * 蓝牙适配器状态变化回调函数\n * @param res 蓝牙适配器状态变化事件\n */\ntype ScanOnAdapterCallback = (\n  res: WechatMiniprogram.OnBluetoothAdapterStateChangeListenerResult,\n) => void;\n\n/**\n * 扫描成功回调函数\n */\ntype ScanSuccessCallback = () => void;\n\n/**\n * 扫描失败回调函数\n * @param res 扫描失败事件\n */\ntype ScanFailedCallback = (res: WechatMiniprogram.BluetoothError) => void;\n\n/**\n * 设备发现回调函数\n * @param devices 发现的蓝牙设备列表\n */\ntype ScanOnFoundCallback = (devices: WechatMiniprogram.BlueToothDevice[]) => void;\n\n/**\n * 扫描停止回调函数\n */\ntype ScanStopCallback = () => void;\n","// import bitwise from 'bitwise'\nimport sm4 from './sm4'\nimport { SDKLogger } from '@onbright/common-sdk'\n\n// 将枚举值映射为中文描述\nexport function Chinese(context, next) {\n  context.value = context.options[context.value]\n  next()\n}\n\n// 分发器，仅传递控制流\nexport function Dispense(context, next) {\n  next()\n}\n\n// 辅助函数：将数值从一种进制转换为另一种进制\nconst _fn = (value, from, to) => {\n  return parseInt(value, from).toString(to)\n}\n\n// 将数值转换为十六进制字符串，并保证长度为两位\nconst _toHex = (value, from) => {\n  const radix = _fn(value, from, 16)\n  return radix.length < 2 ? `0${radix}` : radix\n}\n\n// 十进制转二进制\nexport function decimalToBinary(context, next) {\n  context.value = _fn(context.value, 10, 2)\n  next()\n}\n\n// 二进制转十六进制\nexport function binaryToHex(context, next) {\n  context.value = _toHex(context.value, 2)\n  next()\n}\n\n// 十进制转十六进制\nexport function decimalToHex(context, next) {\n  context.value = _toHex(context.value, 10)\n  next()\n}\n\n// 十六进制转十进制\nexport function hexToDecimal(context, next) {\n  const radix = _fn(context.value, 16, 10)\n  context.value = radix\n  next()\n}\n\n// 将密码转换为8位DBC格式\nexport function passTo8DBC(context, next) {\n  const arr = new Array(16)\n  const old = context.value.split('')\n  context.value = arr.fill('F').map((item, index) => {\n    if (old[index]) {\n      item = old[index]\n    }\n    return item\n  }).join('')\n  next()\n}\n\n// ArrayBuffer转数组\nexport function abToA(context, next) {\n  context.value = Array.from(new Uint8Array(context.value))\n  next()\n}\n\n// ArrayBuffer转十六进制字符串\nexport function ab2hex(context, next) {\n  const hexArr = Array.from(\n    new Uint8Array(context.value),\n    bit => ('00' + bit.toString(16)).slice(-2)\n  )\n  context.value = hexArr.join('')\n  next()\n}\n\n// ArrayBuffer转十六进制字符串（移除前两个字节）\nexport function ab2hex2(context, next) {\n  context.ab2hex2 = ''\n  const hexArr = Array.from(\n    new Uint8Array(context.value),\n    (bit, index) => {\n      if (index !== 0 && index !== 1) {\n        return ('00' + bit.toString(16)).slice(-2)\n      } else {\n        context.ab2hex2 += ('00' + bit.toString(16)).slice(-2)\n      }\n    }\n  )\n  context.value = hexArr.join('')\n  next()\n}\n\n// 获取随机数\nexport function getRandomNum(context, next) {\n  const hex1 = parseInt(context.value, 16).toString(2).padStart(32, '0')\n  const arr = hex1.split('')\n  const newArr = arr.map(item => item === '0' ? 1 : 0)\n  const hex2 = newArr.join('')\n  context.value = parseInt(hex2, 2).toString(16)\n  next()\n}\n\n// 十六进制字符串转Buffer\nexport function hex2Buff(context, next) {\n  const typedArray = new Uint8Array(context.value.match(/[\\da-f]{2}/gi).map(h => parseInt(h, 16)))\n  context.value = typedArray.buffer\n  next()\n}\n\n// 十六进制字符串转Uint8Array\nexport function hex2Array (context, next) {\n  console.log('转之前数据', context.value)\n  const typedArray = new Uint8Array(context.value.match(/[\\da-f]{2}/gi).map(h => parseInt(h, 16)))\n  context.value = typedArray\n  next()\n}\n\n// SM4加密\nexport function setSm4Value(context, next) {\n  const hash = sm4.encrypt(context.value, context.key)\n  context.value = hash.slice(0, 32)\n  console.log('加密参数', context.key, '加密后', context.value)\n  if (context.checkSum) {\n    context.value = context.checkSum + context.value\n    console.log('加密后+校验和', context.value)\n  }\n  next()\n}\n\n// SM4解密\nexport function getSm4Value(context, next) {\n  context.value = sm4.decrypt(context.value, context.key)\n  console.log('解密参数', context.key, '解密后', context.value)\n  if (context.ab2hex2) {\n    context.value = context.ab2hex2 + context.value\n    console.log('解密后+操作命令+校验和', context.value)\n  }\n  next()\n}\n\n// 字符串截取\nexport function sliceHex(context, next) {\n  context.value = context.value.slice(context.sliceHex)\n  next()\n}\n\n// 在字符串尾部补零\nexport function padEndHex(context, next) {\n  // console.log(\"padEndHex===\", context)\n  context.value = context.value.padEnd(context.padEndHex, context.padEndValue)\n  // console.log(\"padEndHex222===\", context)\n  next()\n}\n\n// 在字符串头部补零\nexport function padStartHex(context, next) {\n  // console.log(\"padStartHex===\", context)\n  context.value = context.value.padStart(context.padStartHex, context.padStartValue)\n  // console.log(\"padStartHex22s===\", context)\n  next()\n}\n\n// 时间转十六进制时间戳\nexport function dateTime2unixHex(context, next) {\n  context.value = dayjs(context.value).unix().toString(16).padStart(8, '0')\n  next()\n}\n\n// 按位设置bit\n// export function setbit(context, next) {\n//   context.value = context.value.reduce((prev, cur) => {\n//     console.log(prev, cur)\n//     return bitwise.integer.setBit(prev, parseInt(cur), 1)\n//   }, 0)\n//   // console.log('setbit===', context.value)\n//   next()\n// }\n\n// 处理MAC地址\nexport function dealMAC(context, next) {\n  context.value = context.value.replace(/:/g, '')\n  next()\n}\n\n// 用户ID高低位转换\nexport function highLowBitCV(context, next) {\n  const start = context.value.slice(0, 2)\n  const end = context.value.slice(2, 4)\n  context.value = `${end}${start}`\n  // console.log('高低位转换', context.value)\n  next()\n}\n\n// 开锁密钥十六进制异或运算\nexport function openKeyEctopicOr(context, next) {\n  let result = ''\n  for (let index = 0; index < 16; index++) {\n    const temp = (parseInt(context.value.slice(0, 16).charAt(index), 16) ^ parseInt(context.value.slice(16, 32).charAt(index), 16)).toString(16).toUpperCase()\n    result += temp\n  }\n  context.value = result\n  next()\n}\n\n// 计算数据校验核\nexport function checkSum(context, next) {\n  context.checkSum = (context.value.split('').reduce((prev, cur, i, arr) => {\n    if (i % 2 === 0) {\n      const str = arr[i] + '' + arr[i + 1]\n      return prev + parseInt(str, 16)\n    } else {\n      return prev\n    }\n  }, 0) & 0xff).toString(16).padStart(2, '0').slice(-2)\n  // console.log('o命令校验核', context.checkSum)\n  next()\n}\n\n// 计算校验和并赋值开锁专用2字节\nexport function checkSumValue(context, next) {\n  const arr = context.value.split('')\n  const newArr = []\n  for (let i = 0; i < arr.length - 1; i++) {\n    if (i % 2 === 0) {\n      const str = arr[i] + '' + arr[i + 1]\n      newArr.push(str)\n    }\n  }\n  let num = 0\n  newArr.forEach(e => {\n    num += parseInt(e, 16)\n  })\n  // console.log('getSumValue', num.toString(16).padStart(4, '0').slice(-4))\n  context.value = num.toString(16).padStart(4, '0').slice(-4)\n  next()\n}\n// 解析鉴权广播返回数据\nexport function advertisData(context, next) {\n  // console.log(`advertisData1111`, context)\n  const mac = context.value.slice(2, 14)\n  const manufacturer = context.value.slice(14, 16)\n  const model = context.value.slice(16, 18)\n  // console.log(`advertisData`, `${mac}|${manufacturer}|${model}`)\n  context.value = `${mac}|${manufacturer}|${model}`\n  next()\n}\n\n// 十六进制字符串反转\nexport function hexReverse(context, next) {\n  context.value = context.value.match(/[\\da-f]{2}/gi).reverse().join('')\n  next()\n}\n\n// 二进制字符串反转\nexport function binaryReverse(context, next) {\n  context.value = context.value.split('').reverse().join('')\n  next()\n}\n\n// 大小端转换\nexport function HighLowConversion(context, next) {\n  let byteArr = []\n  for (let i = 0; i < context.value.length; i += 2) {\n    byteArr.push(context.value.substring(i, i + 2))\n  }\n  context.value = byteArr.reverse().join('')\n  next()\n}","/* eslint-disable no-bitwise, no-mixed-operators, complexity */\nconst DECRYPT = 0\nconst ROUND = 32\nconst BLOCK = 16\n\nconst Sbox = [\n  0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05,\n  0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99,\n  0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62,\n  0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6,\n  0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8,\n  0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35,\n  0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87,\n  0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e,\n  0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1,\n  0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3,\n  0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f,\n  0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51,\n  0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8,\n  0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0,\n  0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84,\n  0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48\n]\n\nconst CK = [\n  0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,\n  0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,\n  0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,\n  0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,\n  0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,\n  0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,\n  0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,\n  0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279\n]\n\n/**\n * 16 进制串转字节数组\n */\nfunction hexToArray (str) {\n  const arr = []\n  for (let i = 0, len = str.length; i < len; i += 2) {\n    arr.push(parseInt(str.substr(i, 2), 16))\n  }\n  return arr\n}\n\n/**\n * 字节数组转 16 进制串\n */\nfunction ArrayToHex (arr) {\n  return arr.map(item => {\n    item = item.toString(16)\n    return item.length === 1 ? '0' + item : item\n  }).join('')\n}\n\n/**\n * utf8 串转字节数组\n */\nfunction utf8ToArray (str) {\n  const arr = []\n\n  for (let i = 0, len = str.length; i < len; i++) {\n    const point = str.codePointAt(i)\n\n    if (point <= 0x007f) {\n      // 单字节，标量值：00000000 00000000 0zzzzzzz\n      arr.push(point)\n    } else if (point <= 0x07ff) {\n      // 双字节，标量值：00000000 00000yyy yyzzzzzz\n      arr.push(0xc0 | (point >>> 6)) // 110yyyyy（0xc0-0xdf）\n      arr.push(0x80 | (point & 0x3f)) // 10zzzzzz（0x80-0xbf）\n    } else if (point <= 0xD7FF || (point >= 0xE000 && point <= 0xFFFF)) {\n      // 三字节：标量值：00000000 xxxxyyyy yyzzzzzz\n      arr.push(0xe0 | (point >>> 12)) // 1110xxxx（0xe0-0xef）\n      arr.push(0x80 | ((point >>> 6) & 0x3f)) // 10yyyyyy（0x80-0xbf）\n      arr.push(0x80 | (point & 0x3f)) // 10zzzzzz（0x80-0xbf）\n    } else if (point >= 0x010000 && point <= 0x10FFFF) {\n      // 四字节：标量值：000wwwxx xxxxyyyy yyzzzzzz\n      i++\n      arr.push((0xf0 | (point >>> 18) & 0x1c)) // 11110www（0xf0-0xf7）\n      arr.push((0x80 | ((point >>> 12) & 0x3f))) // 10xxxxxx（0x80-0xbf）\n      arr.push((0x80 | ((point >>> 6) & 0x3f))) // 10yyyyyy（0x80-0xbf）\n      arr.push((0x80 | (point & 0x3f))) // 10zzzzzz（0x80-0xbf）\n    } else {\n      // 五、六字节，暂时不支持\n      arr.push(point)\n      throw new Error('input is not supported')\n    }\n  }\n\n  return arr\n}\n\n/**\n * 字节数组转 utf8 串\n */\n// eslint-disable-next-line no-unused-vars\nfunction arrayToUtf8 (arr) {\n  const str = []\n  for (let i = 0, len = arr.length; i < len; i++) {\n    if (arr[i] >= 0xf0 && arr[i] <= 0xf7) {\n      // 四字节\n      str.push(String.fromCodePoint(((arr[i] & 0x07) << 18) + ((arr[i + 1] & 0x3f) << 12) + ((arr[i + 2] & 0x3f) << 6) + (arr[i + 3] & 0x3f)))\n      i += 3\n    } else if (arr[i] >= 0xe0 && arr[i] <= 0xef) {\n      // 三字节\n      str.push(String.fromCodePoint(((arr[i] & 0x0f) << 12) + ((arr[i + 1] & 0x3f) << 6) + (arr[i + 2] & 0x3f)))\n      i += 2\n    } else if (arr[i] >= 0xc0 && arr[i] <= 0xdf) {\n      // 双字节\n      str.push(String.fromCodePoint(((arr[i] & 0x1f) << 6) + (arr[i + 1] & 0x3f)))\n      i++\n    } else {\n      // 单字节\n      str.push(String.fromCodePoint(arr[i]))\n    }\n  }\n\n  return str.join('')\n}\n\n/**\n * 32 比特循环左移\n */\nfunction rotl (x, y) {\n  return x << y | x >>> (32 - y)\n}\n\n/**\n * 非线性变换\n */\nfunction byteSub (a) {\n  return (Sbox[a >>> 24 & 0xFF] & 0xFF) << 24 |\n    (Sbox[a >>> 16 & 0xFF] & 0xFF) << 16 |\n    (Sbox[a >>> 8 & 0xFF] & 0xFF) << 8 |\n    (Sbox[a & 0xFF] & 0xFF)\n}\n\n/**\n * 线性变换，加密/解密用\n */\nfunction l1 (b) {\n  return b ^ rotl(b, 2) ^ rotl(b, 10) ^ rotl(b, 18) ^ rotl(b, 24)\n}\n\n/**\n * 线性变换，生成轮密钥用\n */\nfunction l2 (b) {\n  return b ^ rotl(b, 13) ^ rotl(b, 23)\n}\n\n/**\n * 以一组 128 比特进行加密/解密操作\n */\nfunction sms4Crypt (input, output, roundKey) {\n  const x = new Array(4)\n\n  // 字节数组转成字数组（此处 1 字 = 32 比特）\n  const tmp = new Array(4)\n  for (let i = 0; i < 4; i++) {\n    tmp[0] = input[4 * i] & 0xff\n    tmp[1] = input[4 * i + 1] & 0xff\n    tmp[2] = input[4 * i + 2] & 0xff\n    tmp[3] = input[4 * i + 3] & 0xff\n    x[i] = tmp[0] << 24 | tmp[1] << 16 | tmp[2] << 8 | tmp[3]\n  }\n\n  // x[i + 4] = x[i] ^ l1(byteSub(x[i + 1] ^ x[i + 2] ^ x[i + 3] ^ roundKey[i]))\n  for (let r = 0, mid; r < 32; r += 4) {\n    mid = x[1] ^ x[2] ^ x[3] ^ roundKey[r + 0]\n    x[0] ^= l1(byteSub(mid)) // x[4]\n\n    mid = x[2] ^ x[3] ^ x[0] ^ roundKey[r + 1]\n    x[1] ^= l1(byteSub(mid)) // x[5]\n\n    mid = x[3] ^ x[0] ^ x[1] ^ roundKey[r + 2]\n    x[2] ^= l1(byteSub(mid)) // x[6]\n\n    mid = x[0] ^ x[1] ^ x[2] ^ roundKey[r + 3]\n    x[3] ^= l1(byteSub(mid)) // x[7]\n  }\n\n  // 反序变换\n  for (let j = 0; j < 16; j += 4) {\n    output[j] = x[3 - j / 4] >>> 24 & 0xff\n    output[j + 1] = x[3 - j / 4] >>> 16 & 0xff\n    output[j + 2] = x[3 - j / 4] >>> 8 & 0xff\n    output[j + 3] = x[3 - j / 4] & 0xff\n  }\n}\n\n/**\n * 密钥扩展算法\n */\nfunction sms4KeyExt (key, roundKey, cryptFlag) {\n  const x = new Array(4)\n\n  // 字节数组转成字数组（此处 1 字 = 32 比特）\n  const tmp = new Array(4)\n  for (let i = 0; i < 4; i++) {\n    tmp[0] = key[0 + 4 * i] & 0xff\n    tmp[1] = key[1 + 4 * i] & 0xff\n    tmp[2] = key[2 + 4 * i] & 0xff\n    tmp[3] = key[3 + 4 * i] & 0xff\n    x[i] = tmp[0] << 24 | tmp[1] << 16 | tmp[2] << 8 | tmp[3]\n  }\n\n  // 与系统参数做异或\n  x[0] ^= 0xa3b1bac6\n  x[1] ^= 0x56aa3350\n  x[2] ^= 0x677d9197\n  x[3] ^= 0xb27022dc\n\n  // roundKey[i] = x[i + 4] = x[i] ^ l2(byteSub(x[i + 1] ^ x[i + 2] ^ x[i + 3] ^ CK[i]))\n  for (let r = 0, mid; r < 32; r += 4) {\n    mid = x[1] ^ x[2] ^ x[3] ^ CK[r + 0]\n    roundKey[r + 0] = x[0] ^= l2(byteSub(mid)) // x[4]\n\n    mid = x[2] ^ x[3] ^ x[0] ^ CK[r + 1]\n    roundKey[r + 1] = x[1] ^= l2(byteSub(mid)) // x[5]\n\n    mid = x[3] ^ x[0] ^ x[1] ^ CK[r + 2]\n    roundKey[r + 2] = x[2] ^= l2(byteSub(mid)) // x[6]\n\n    mid = x[0] ^ x[1] ^ x[2] ^ CK[r + 3]\n    roundKey[r + 3] = x[3] ^= l2(byteSub(mid)) // x[7]\n  }\n\n  // 解密时使用反序的轮密钥\n  if (cryptFlag === DECRYPT) {\n    for (let r = 0, mid; r < 16; r++) {\n      mid = roundKey[r]\n      roundKey[r] = roundKey[31 - r]\n      roundKey[31 - r] = mid\n    }\n  }\n}\n\nfunction sm4 (inArray, key, cryptFlag, {\n  padding = 'pkcs#7', mode, iv = [], output = 'string'\n} = {}) {\n  if (mode === 'cbc') {\n    // CBC 模式，默认走 ECB 模式\n    if (typeof iv === 'string') iv = hexToArray(iv)\n    if (iv.length !== (128 / 8)) {\n      // iv 不是 128 比特\n      throw new Error('iv is invalid')\n    }\n  }\n  // console.log('inArray, key', inArray, key)\n  // 检查 key\n  if (typeof key === 'string') key = hexToArray(key)\n  if (key.length !== (128 / 8)) {\n    // key 不是 128 比特\n    throw new Error('key is invalid')\n  }\n  // console.log('key', key)\n  // console.log('inArray', inArray, typeof inArray)\n\n  // 检查输入\n  if (typeof inArray === 'string') {\n    if (cryptFlag !== DECRYPT) {\n      // 加密，输入为 utf8 串\n      inArray = utf8ToArray(inArray)\n    } else {\n      // 解密，输入为 16 进制串\n      inArray = hexToArray(inArray)\n    }\n    // console.log('inArray', inArray)\n  } else {\n    inArray = [...inArray]\n  }\n  // console.log('inArray', inArray)\n  // 新增填充，sm4 是 16 个字节一个分组，所以统一走到 pkcs#7\n  if ((padding === 'pkcs#5' || padding === 'pkcs#7') && cryptFlag !== DECRYPT) {\n    const paddingCount = BLOCK - inArray.length % BLOCK\n    for (let i = 0; i < paddingCount; i++) inArray.push(paddingCount)\n  }\n\n  // 生成轮密钥\n  const roundKey = new Array(ROUND)\n  sms4KeyExt(key, roundKey, cryptFlag)\n\n  const outArray = []\n  let lastVector = iv\n  let restLen = inArray.length\n  let point = 0\n  while (restLen >= BLOCK) {\n    const input = inArray.slice(point, point + 16)\n    const output = new Array(16)\n\n    if (mode === 'cbc') {\n      for (let i = 0; i < BLOCK; i++) {\n        if (cryptFlag !== DECRYPT) {\n          // 加密过程在组加密前进行异或\n          input[i] ^= lastVector[i]\n        }\n      }\n    }\n\n    sms4Crypt(input, output, roundKey)\n\n    for (let i = 0; i < BLOCK; i++) {\n      if (mode === 'cbc') {\n        if (cryptFlag === DECRYPT) {\n          // 解密过程在组解密后进行异或\n          output[i] ^= lastVector[i]\n        }\n      }\n\n      outArray[point + i] = output[i]\n    }\n\n    if (mode === 'cbc') {\n      if (cryptFlag !== DECRYPT) {\n        // 使用上一次输出作为加密向量\n        lastVector = output\n      } else {\n        // 使用上一次输入作为解密向量\n        lastVector = input\n      }\n    }\n\n    restLen -= BLOCK\n    point += BLOCK\n  }\n  // console.log(outArray, output)\n  // 去除填充，sm4 是 16 个字节一个分组，所以统一走到 pkcs#7\n  // if ((padding === 'pkcs#5' || padding === 'pkcs#7') && cryptFlag === DECRYPT) {\n  //   const len = outArray.length\n  //   const paddingCount = outArray[len - 1]\n  //   console.log(paddingCount)\n  //   for (let i = 1; i <= paddingCount; i++) {\n  //     if (outArray[len - i] !== paddingCount) throw new Error('padding is invalid')\n  //   }\n  //   outArray.splice(len - paddingCount, paddingCount)\n  // }\n\n  // 调整输出\n  if (output !== 'array') {\n    if (cryptFlag !== DECRYPT) {\n      // 加密，输出转 16 进制串\n      return ArrayToHex(outArray)\n    } else {\n      // 解密，输出转 utf8 串\n      // return arrayToUtf8(outArray)\n      return ArrayToHex(outArray)\n    }\n  } else {\n    return outArray\n  }\n}\n\nexport default {\n  encrypt (inArray, key, options) {\n    return sm4(inArray, key, 1, options)\n  },\n  decrypt (inArray, key, options) {\n    return sm4(inArray, key, 0, options)\n  }\n}\n","import * as utils from './utils/index'\n\n/**\n * 创建一个生成规则的函数\n * @param {Array} options - 选项列表，每个选项包含一个值和可能的使用方法\n * @param {Object} common - 共同的配置，包含使用的函数和初始值\n * @returns {Function} - 一个异步函数，用于根据给定的选项和共同配置生成规则\n */\nexport function GenerationRule(options, common) {\n  // 生成所有选项的组合公式\n  const formulas = combination(options)\n  // 如果没有提供共同配置，则初始化\n  common = common || { use: [] }\n  // 创建共同配置的函数组合\n  const comfun = compose(common.use)\n\n  // 返回一个异步函数，用于生成规则\n  return async function (e, config = {}) {\n    // 合并每个选项的值和配置\n    const _mergeOptions = (context, e) => options.map((item, index) => {\n      item.value = e[index]\n      item = { ...item, ...config }\n      return _promiseParcel(item, index)\n    })\n\n    // 将选项通过Promise处理\n    const _promiseParcel = (option, i) => new Promise((resolve, reject) => {\n      formulas[i](option, (option, next) => {\n        next()\n        resolve(option.value)\n      })\n    })\n\n    // 运行共同配置的函数\n    const runCommon = (value) => new Promise((resolve, reject) => {\n      common.value = value\n      common = { ...common, ...config }\n      comfun(common, (common, next) => {\n        next()\n        resolve(common.value)\n      })\n    })\n\n    try {\n      // 获取所有选项处理后的数据\n      const data = await _mergeOptions(options, e)\n      // 将所有处理后的数据组合起来\n      const combine = (await Promise.all(data)).join('')\n      // 使用组合后的值运行共同配置的函数\n      return runCommon(combine)\n    } catch (err) {\n      throw new Error(err)\n    }\n  }\n}\n\n/**\n * 创建选项的组合公式\n * @param {Array} context - 选项的上下文\n * @returns {Function} - 一个函数，用于管理公式的组合\n */\nfunction combination(context) {\n  const _formulaManage = (context) => context.map(item => compose(item.use))\n  return _formulaManage(context)\n}\n\n/**\n * 组合多个函数成一个函数\n * @param {Array} use - 要组合的函数列表\n * @returns {Function} - 一个组合函数，顺序执行列表中的函数\n */\nfunction compose(use) {\n  if (!Array.isArray(use)) throw new Error('use stack must be an array!')\n  // for (const fn of use) {\n  //   if (typeof utils[fn] !== 'function') throw new Error('use must be composed of functions!')\n  // }\n  return (context, next) => {\n    let index = -1\n    return dispatch(0)\n\n    function dispatch(i) {\n      if (i <= index) return Promise.reject(new Error('next() called multiple times'))\n      index = i\n      const fn = utils[use[i]] || (i === use.length ? next : null)\n      if (!fn) return Promise.resolve()\n      try {\n        return Promise.resolve(fn(context, dispatch.bind(null, i + 1)))\n      } catch (err) {\n        return Promise.reject(err)\n      }\n    }\n  }\n}","import { BLEDeviceCharacteristicsMap } from '../../../interface/Communication';\nimport { dataConversion } from '@onbright/common-sdk';\nimport BluetoothSdk from '../utils/bluetoothSdk';\nimport { SDKLogger } from '@onbright/common-sdk'\n\n/**\n * 蓝牙服务\n */\nexport const ONBRIGHT_AUTH_BLUE_UUID_SERVICE = '00004F42-0000-1000-8000-00805F9B34FB';\n// 写入特性\nexport const ONBRIGHT_AUTH_BLUE_WRITE_UUID = '00004F00-0000-1000-8000-00805F9B34FB';\n// 通知特性\nexport const ONBRIGHT_AUTH_BLUE_NOTIFY_UUID = '00004F00-0000-1000-8000-00805F9B34FB';\n// 读取特性\nexport const ONBRIGHT_AUTH_BLUE_READ_UUID = '00004F00-0000-1000-8000-00805F9B34FB';\n\n\n// 定义 authObject 的类型\ninterface AuthObject {\n  grade: string; // 权限等级\n  userId: string | number; // 用户ID\n  timeStamp?: number; // 时间戳（可选）\n}\n\nexport class Cat1LockAuthHandler {\n  /**\n   * 权限\n   * root: '80'\n   * advanced: '20'\n   * admin: '40'\n   * common: '10'\n   */\n  grade: string = '';\n\n  /**\n   * 用户id\n   */\n  userId: string = '';\n\n  advertisData: ArrayBuffer = new ArrayBuffer(1);\n\n  hexStr: string = '';\n\n  timeStamp: number = 0;\n\n  /**\n   * 接收数据回调\n   */\n  callback: Cat1LockAuthCallback | null = null;\n\n  constructor(authObject: AuthObject) {\n    this.grade = authObject.grade || '80';\n    // 初始化时设置默认值，后续异步更新\n    this.userId = '0000';\n    this.timeStamp = authObject.timeStamp || 0;\n\n    // 异步初始化userId\n    this._initUserId(authObject.userId);\n  }\n\n  /**\n   * 异步初始化userId\n   * @param userId 用户ID\n   */\n  _initUserId(userId: string | number) {\n    SDKLogger.log('params userID', userId)\n    this.userId = this._getUserId(userId);\n    SDKLogger.log('userId', this._getUserId(userId))\n  }\n\n  handleAuthenticationData() {\n    return new Uint8Array();\n  }\n\n  async handleSendData(deviceId: string, hexStr: string) {\n    this.hexStr = hexStr;\n    const data = await this.onProcessingSentData();\n\n    uni.writeBLECharacteristicValue({\n      deviceId: deviceId,\n      serviceId: ONBRIGHT_AUTH_BLUE_UUID_SERVICE,\n      characteristicId: ONBRIGHT_AUTH_BLUE_WRITE_UUID,\n      value: data,\n      fail: (err) => {\n        SDKLogger.log('发送数据失败：->' + '\\terr=' + JSON.stringify(err));\n      },\n      success: () => {\n        SDKLogger.log(\n          'Cat1LockAuthHandler 发送数据成功：->' +\n          dataConversion.ab2hex(data) +\n          ' serviceId:' +\n          ONBRIGHT_AUTH_BLUE_UUID_SERVICE,\n        );\n      },\n    });\n\n    uni.notifyBLECharacteristicValueChange({\n      state: true,\n      deviceId: deviceId,\n      serviceId: ONBRIGHT_AUTH_BLUE_UUID_SERVICE,\n      characteristicId: ONBRIGHT_AUTH_BLUE_NOTIFY_UUID,\n      success: (res) => {\n        SDKLogger.log('使能通知成功：' + JSON.stringify(res));\n      },\n      fail: (err) => {\n        SDKLogger.log('使能通知失败' + JSON.stringify(err));\n        if (this.callback && this.callback.onAuthFailed) {\n          this.callback.onAuthFailed();\n        }\n      },\n    });\n\n    uni.onBLECharacteristicValueChange(async (res) => {\n      SDKLogger.log('收到数据:' + dataConversion.ab2hex(res.value));\n\n      const notifyValue = await BluetoothSdk.getSm4Auth([res.value], {\n        key: await this._getKey(),\n      });\n      const grade = notifyValue.slice(0, 2);\n      const userId = notifyValue.slice(2, 6);\n      SDKLogger.log('notifyValue', notifyValue, 'grade', grade, this.grade, 'userId', userId, this.userId);\n\n      if (grade === this.grade && userId === this.userId) {\n        this.callback?.onAuthSuccess();\n      } else {\n        this.callback?.onAuthFailed();\n      }\n\n      uni.offBLECharacteristicValueChange();\n    });\n  }\n\n  setCallback(callback: Cat1LockAuthCallback | null) {\n    this.callback = callback;\n  }\n\n  onMatchingServiceCharacteristic(): BLEDeviceCharacteristicsMap {\n    return {\n      write: ONBRIGHT_AUTH_BLUE_WRITE_UUID,\n      notify: ONBRIGHT_AUTH_BLUE_NOTIFY_UUID,\n      read: ONBRIGHT_AUTH_BLUE_READ_UUID,\n    };\n  }\n\n  async onProcessingSentData(): Promise<ArrayBuffer> {\n    const timeUnix = await this._getTimeUnix(this.timeStamp);\n    const key = await this._getKey();\n    SDKLogger.log(this.grade, this.userId, timeUnix)\n    return await BluetoothSdk.setSm4Auth(\n      [this.advertisData, this.grade || '80', this.userId, timeUnix],\n      {\n        key,\n        padEndValue: '0',\n      }\n    );\n  }\n\n  onProcessNotifyData(\n    receivedData: WechatMiniprogram.OnBLECharacteristicValueChangeListenerResult,\n  ): Promise<void> {\n    SDKLogger.log('onProcessNotifyData收到协议了', receivedData);\n    return Promise.resolve();\n  }\n\n  onProcessReadData(receivedData: WechatMiniprogram.OnBLECharacteristicValueChangeListenerResult): Promise<void> {\n    SDKLogger.log('onProcessReadData 收到协议了', receivedData);\n    return Promise.resolve();\n  }\n\n  async _getKey(): Promise<string> {\n    const OBBLE = '4F42424C45';\n    const mac = this.hexStr.slice(2, 14);\n    const random = this.hexStr.slice(-8);\n    const hex = OBBLE + mac + random;\n    const numStr = await this._getSum(hex);\n\n    return OBBLE + mac + random + numStr;\n  }\n\n  async _getSum(hex: string): Promise<string> {\n    const sum = hex\n      .split('')\n      .reduce((prev, cur, i, arr) => {\n        if (i % 2 === 0) {\n          const str = arr[i] + '' + arr[i + 1];\n          return prev + parseInt(str, 16);\n        } else {\n          return prev;\n        }\n      }, 0);\n\n    return sum.toString(16).padStart(2, '0').slice(-2);\n  }\n\n  async _getTimeUnix(timeStamp: number): Promise<string> {\n    const timeStampDate = timeStamp ? new Date(timeStamp) : new Date();\n    const s = ((Math.floor(timeStampDate.getTime() / 1000)) + 8 * 60 * 60).toString(16).padStart(8, '0');\n    const week = timeStampDate.getDay();\n    let w = week;\n    if (week === 0) {\n      w = 7;\n    }\n    const wHex = (w - 1).toString(16).padStart(2, '0');\n    return dataConversion.highLowConversion(s) + wHex;\n  }\n\n  _getUserId(userId: any) {\n    let userIdHex = '0000';\n    if (userId || userId === 0) {\n      if (typeof userId === 'string') {\n        // Pad with two bytes of '0'\n        userIdHex = userId.padStart(4, '0');\n      } else if (typeof userId === 'number') {\n        // Convert number to little-endian two bytes hex string\n        userIdHex = this.numberToLittleEndianTwoBytesHex(userId);\n      }\n    }\n    return userIdHex;\n  }\n\n  /**\n   * 将数字转换为两个字节的小端十六进制字符串\n   * @param number 待转换的数字\n   * @returns 十六进制字符串\n   */\n  numberToLittleEndianTwoBytesHex(number: number): string {\n    // 创建一个长度为2的Uint8Array（即2个字节），它基于一个ArrayBuffer\n    const buffer = new ArrayBuffer(2);\n    const bytes = new Uint8Array(buffer);\n    // 将number的低8位存入第一个字节（索引0）\n    bytes[0] = number & 0xFF;\n    // 将number的高8位（考虑符号位）存入第二个字节（索引1）\n    bytes[1] = (number >> 8) & 0xFF;\n    // 将两个字节转换为十六进制字符串\n    const hexString = [\n      bytes[0].toString(16).padStart(2, '0'),\n      bytes[1].toString(16).padStart(2, '0')\n    ].join('');\n    return hexString;\n  }\n}\n\nexport interface Cat1LockAuthCallback {\n  /**\n   * 鉴权成功\n   */\n  onAuthSuccess: onAuthSuccessCallback;\n\n  /**\n   * 鉴权失败\n   */\n  onAuthFailed: onAuthFailedCallback;\n}\n\ntype onAuthSuccessCallback = () => void;\n\ntype onAuthFailedCallback = () => void;\n","import { GenerationRule } from '../../../extension'\n\n// 设备绑定\nconst deviceBind = GenerationRule([{ use: [] }, { use: [`passTo8DBC`] }], {\n  use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'],\n  padEndHex: 32\n})\nconst deviceBindNew = GenerationRule([{ use: [] }, { use: [] }, { use: [`passTo8DBC`] }], {\n  use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'],\n  padEndHex: 32\n})\n// 同步钥匙列表\nconst syncKeyList = GenerationRule([{ use: [] }, { use: [] }], {\n  use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'],\n  padEndHex: 32\n})\n// 输入密码补位\nconst passwordDbc = GenerationRule([{ use: [`padEndHex`], padEndHex: 10 }])\n// 设备鉴权\nconst setSm4Auth = GenerationRule(\n  [\n    { use: [`ab2hex`, `sliceHex`, `getRandomNum`, 'padStartHex'], sliceHex: -8, padStartHex: 8, padStartValue: '0' },\n    { use: [] },\n    { use: [] },\n    { use: [] }\n  ],\n  { use: ['padEndHex', 'hex2Array', 'setSm4Value', 'hex2Buff'], padEndHex: 32 }\n) // 鉴权加密\n\n// 设备鉴权\nconst setSm4AuthCon = GenerationRule(\n  [\n    { use: [`ab2hex`, `sliceHex`, `getRandomNum`, 'padStartHex'], sliceHex: -8, padStartHex: 0, padStartValue: '0' },\n    { use: [] },\n    { use: [] },\n    { use: [] }\n  ],\n  { use: ['padEndHex', 'hex2Array', 'setSm4Value', 'hex2Buff'], padEndHex: 32 }\n) // 鉴权加密\n\n// 设备操作\nconst deviceOperate = GenerationRule([{ use: [] }, { use: [] }], { use: ['hex2Buff'] }) // 操作数据加密\n// 固件升级内容发送\nconst firmwareContent = GenerationRule(\n  [{ use: ['decimalToHex', 'padStartHex', 'HighLowConversion'], padStartHex: 6, padStartValue: '0' }, { use: [] }],\n  { use: ['hex2Buff'] }\n) // 操作数据加密\n// 鉴权数据解密\nconst getSm4Auth = GenerationRule([{ use: ['ab2hex', 'hex2Array', 'getSm4Value'] }]) // 操作数据加密\n// 操作数据解密\nconst getSm4AuthOperate = GenerationRule([{ use: ['ab2hex2', 'hex2Array', 'getSm4Value'] }]) // 操作数据加密\n// 解析广播随机数\nconst getadvertisData = GenerationRule([{ use: [`advertisData`] }])\n// 数据高低位转换\nconst getHighLow = GenerationRule([{ use: [`highLowBitCV`] }])\n// 开锁密钥 hushKey\nconst getOpenHushKey = GenerationRule([{ use: [] }, { use: [] }, { use: [] }], {\n  use: ['padEndHex', 'hex2Array', 'setSm4Value', 'openKeyEctopicOr'],\n  padEndHex: 32\n})\n// 读取设备序列号\nconst getDeviceSerialId = GenerationRule([{ use: [] }], {\n  use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'],\n  padEndHex: 32\n})\n// 更新用户 请求 用户属性\nconst getUserProperty = GenerationRule(\n  [{ use: [] }, { use: ['decimalToBinary', 'padStartHex'], padStartHex: 2, padStartValue: '0' }, { use: [] }],\n  { use: ['binaryToHex', 'HighLowConversion'] }\n)\n// TODO: 打包时bitwise和微信小程序的 .d.ts 文件冲突。先临时屏蔽\n// 更新用户 请求 周期起始数据\n// const getCycleStart = GenerationRule(\n//   [{ use: ['decimalToHex'] }, { use: ['decimalToHex'] }, { use: ['setbit', 'decimalToHex'] }, { use: [] }],\n//   { use: ['hexReverse'] }\n// )\n// 更新用户 请求 周期结束数据\nconst getCycleEnd = GenerationRule(\n  [{ use: ['decimalToHex'] }, { use: ['decimalToHex'] }, { use: [] }, { use: [] }],\n  { use: ['hexReverse'] }\n)\n// 更新用户 请求\nconst updateUser = GenerationRule(\n  [\n    { use: [] },\n    { use: ['padStartHex'], padStartHex: 4, padStartValue: '0' },\n    { use: ['padStartHex'], padStartHex: 4, padStartValue: '0' },\n    { use: [] },\n    { use: ['HighLowConversion'] },\n    { use: ['HighLowConversion'] }\n  ],\n  { use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'], padEndHex: 32 }\n)\n// 删除用户\nconst deleteUser = GenerationRule(\n  [{ use: [] }, { use: ['padStartHex'], padStartHex: 4, padStartValue: '0' }, { use: [] }],\n  { use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'], padEndHex: 32 }\n)\n// 开锁参数内校验和获取\nconst getLockDataSum = GenerationRule([{ use: [] }, { use: [] }, { use: [] }, { use: [] }], {\n  use: ['checkSumValue']\n})\n// 开锁参数加密\nconst getLockDataSm4 = GenerationRule(\n  [{ use: ['HighLowConversion'] }, { use: [] }, { use: ['HighLowConversion'] }, { use: [] }, { use: [] }],\n  { use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'], padEndHex: 32 }\n)\n// 新建钥匙\nconst createKeySm4 = GenerationRule(\n  [\n    { use: [] },\n    { use: ['decimalToHex'] },\n    { use: ['padStartHex'], padStartHex: 4, padStartValue: '0' },\n    { use: [] },\n    { use: ['decimalToHex'] },\n    { use: ['decimalToHex'] },\n    { use: [`padEndHex`], padEndHex: 16 },\n    { use: [] }\n  ],\n  { use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'], padEndHex: 32 }\n)\n// 不用解密的数据返回\nconst getNoSm4Data = GenerationRule([{ use: ['ab2hex'] }])\n// 电量返回\nconst getNoSm4Butter = GenerationRule([{ use: ['ab2hex', 'hexToDecimal'] }, { use: [] }])\n// 设置音量\nconst setBuletVolume = GenerationRule([{ use: [] }, { use: [] }, { use: [] }], {\n  use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'],\n  padEndHex: 32\n})\n// 设置逗留\nconst setBuleStay = GenerationRule([{ use: [] }, { use: [] }, { use: [] }, { use: [] }], {\n  use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'],\n  padEndHex: 32\n})\n// 设置上锁\nconst setBuleClose = GenerationRule([{ use: [] }, { use: [] }, { use: [] }, { use: [] }, { use: [] }], {\n  use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'],\n  padEndHex: 32\n})\n// 删除钥匙\nconst deleteKeySm4 = GenerationRule(\n  [{ use: [] }, { use: [] }, { use: ['padStartHex'], padStartHex: 4, padStartValue: '0' }, { use: [] }, { use: [] }],\n  { use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'], padEndHex: 32 }\n)\n// 语音留言\nconst voiceMessageSm4 = GenerationRule(\n  [\n    { use: [] },\n    { use: ['decimalToHex', 'padStartHex'], padStartHex: 2, padStartValue: '0' },\n    { use: ['padStartHex'], padStartHex: 8, padStartValue: '0' },\n    { use: ['decimalToHex', 'padStartHex'], padStartHex: 8, padStartValue: '0' },\n    { use: ['decimalToHex', 'padStartHex'], padStartHex: 8, padStartValue: '0' },\n    { use: [] }\n  ],\n  { use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'], padEndHex: 32 }\n)\n// 获取语音包版本\nconst voicePgVsSm4 = GenerationRule([{ use: [] }, { use: [] }], {\n  use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'],\n  padEndHex: 32\n})\n// 准备语音包下发\nconst issuceVoicePgSm4 = GenerationRule(\n  [{ use: [] }, { use: ['decimalToHex', 'padStartHex'], padStartHex: 8, padStartValue: '0' }, { use: [] }, { use: [] }],\n  { use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'], padEndHex: 32 }\n)\n// 数据包下发\nconst issuceAnySm4 = GenerationRule([\n  { use: ['decimalToHex', 'padStartHex', 'HighLowConversion'], padStartHex: 6, padStartValue: '0' },\n  { use: [] }\n])\n// 获取日志\nconst getLogSm4Data = GenerationRule(\n  [{ use: [] }, { use: ['decimalToHex', 'padStartHex', 'HighLowConversion'], padStartHex: 8, padStartValue: '0' }],\n  { use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'], padEndHex: 32 }\n)\n// 固件升级准备下发\nconst firmwareUpReady = GenerationRule(\n  [\n    { use: [] },\n    { use: ['decimalToHex', 'padStartHex', 'HighLowConversion'], padStartHex: 8, padStartValue: '0' },\n    { use: ['HighLowConversion'] }\n  ],\n  { use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'], padEndHex: 32 }\n)\n// 获取门锁状态\nconst getLockState = GenerationRule([{ use: [] }], {\n  use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'],\n  padEndHex: 32\n})\n// 设置反锁\nconst setBuleLocked = GenerationRule([{ use: [] }, { use: [] }], {\n  use: ['padEndHex', 'checkSum', 'hex2Array', 'setSm4Value'],\n  padEndHex: 32\n})\n\nconst BluetoothSdk = {\n  deviceBind,\n  deviceBindNew,\n  setSm4Auth,\n  deviceOperate,\n  firmwareContent,\n  getSm4Auth,\n  getSm4AuthOperate,\n  getadvertisData,\n  getHighLow,\n  getOpenHushKey,\n  getDeviceSerialId,\n  passwordDbc,\n  getUserProperty,\n  // getCycleStart,\n  getCycleEnd,\n  updateUser,\n  deleteUser,\n  getLockDataSum,\n  getLockDataSm4,\n  createKeySm4,\n  getNoSm4Data,\n  setBuletVolume,\n  setBuleStay,\n  setBuleClose,\n  deleteKeySm4,\n  voiceMessageSm4,\n  voicePgVsSm4,\n  issuceVoicePgSm4,\n  issuceAnySm4,\n  getNoSm4Butter,\n  setSm4AuthCon,\n  syncKeyList,\n  getLogSm4Data,\n  firmwareUpReady,\n  getLockState,\n  setBuleLocked\n}\n\nexport default BluetoothSdk\n","import { BluetoothManager, BluetoothEventCallback, PermissionDeniedValue, PermissionDeniedError } from './manager/bluetoothManager';\nimport { GenerationRule } from './extension/index';\nimport { Communication, BLEDeviceCharacteristicsMap } from './interface/Communication'\nimport { ProtocolComponent } from './interface/ProtocolComponent'\nimport { Cat1LockAuthCallback, Cat1LockAuthHandler } from './handler/auth/modules/cat1LockAuthHandler'\nimport { AcceptDataCallback } from './handler/dataHandler';\nimport { ConnectCallback } from './handler/connectHandler';\nimport { ScanCallback } from './handler/scanHandler';\n\n\n// 导出类型\nexport type {\n  BluetoothEventCallback,\n  Communication,\n  ProtocolComponent,\n  Cat1LockAuthCallback,\n  BLEDeviceCharacteristicsMap,\n  AcceptDataCallback,\n  ConnectCallback,\n  ScanCallback,\n  PermissionDeniedValue,\n  PermissionDeniedError\n};\n\n// 导出值\nexport default {\n  BluetoothManager,\n  GenerationRule,\n  Cat1LockAuthHandler\n};"]}