// // BluetoothManager+Function.swift // HDFwear // // Created by daifengyi on 2023/6/27. // import SwiftDate extension BluetoothManager { // 设置时间 func newSetTime(completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getTimeCmd() self.setCmdClosure = completion sendData(data) } // 设置时间格式 func newSetTimeFormat(format: TimeFormat, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getTimeFormatCmd(format: format) self.setCmdClosure = completion sendData(data) } // 设置温度单位 func newSetTemperatureUnit(unit: TemperatureUnit, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getTemperatureUnitCmd(unit: unit) self.setCmdClosure = completion sendData(data) } // 设置公英制 func newSetDistanceUnit(unit: DistanceUnit, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getDistanceUnitCmd(unit: unit) self.setCmdClosure = completion sendData(data) } // 设置抬腕唤醒 func newSetWristSense(bool: Bool, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getWristSenseCmd(bool) self.setCmdClosure = completion sendData(data) } // 设置触摸唤醒 func newSetTouchSense(bool: Bool, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getTouchSenseCmd(bool) self.setCmdClosure = completion sendData(data) } // 设置低电提醒 func newSetLowPowerRemind(bool: Bool, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getLowPowerRemind(bool) self.setCmdClosure = completion sendData(data) } // 设置语言 // lan 0表示中文,1表示英语 func newSetLanguage(lan: UInt8, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getLanguageCmd(lan) self.setCmdClosure = completion sendData(data) } // 设置恢复出厂设置 func newSetRestore(completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getRestoreCmd() self.setCmdClosure = completion sendData(data) } // 设置心率过高提醒 // maxHr 0表示关闭提醒 其他值表示最大值 func newSetHeartRateHighRemind(maxHr: UInt8, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getHeartRateHighRemindCmd(maxHr) self.setCmdClosure = completion sendData(data) } // 设置心率过低提醒 // minHr 0表示关闭提醒 其他值表示最小值 func newSetHeartRateLowRemind(minHr: UInt8, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getHeartRateLowRemindCmd(minHr) self.setCmdClosure = completion sendData(data) } // 设置查找手表 // bool 0表示关闭 1表示打开 func newSetFindWatch(bool: Bool, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getFindWatchCmd(bool) self.setCmdClosure = completion sendData(data) } // 设置压力自动检测 // bool 0表示关闭 1表示打开 func newSetPressureAutoDetect(bool: Bool, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getPressureAutoDetectCmd(bool) self.setCmdClosure = completion sendData(data) } // 设置血压自动检测 // bool 0表示关闭 1表示打开 func newSetBloodOxygenAutoDetect(bool: Bool, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getBloodOxygenAutoDetectCmd(bool) self.setCmdClosure = completion sendData(data) } // 设置用户信息 func newSetUserInfo(_ user: UserInfoModel, completion: ((_ error: Int?) -> ())? = nil) { let data = BleMessage.shared.getUserInfoCmd(user) self.setCmdClosure = completion sendData(data) } // 设置勿扰模式 func newSetNotDisturb(remind: RemindModel, completion: @escaping(_ error: Int?) -> ()) { let data = BleMessage.shared.getNotDisturbCmd(remind) self.setCmdClosure = completion sendData(data) } //MARK: - 同步健康数据 func getSleepHistoryData(day: SyncDay = .today, closure: SleepClosure? = nil) { let data = BleMessage.shared.getSyncCmd(.sleep) newStartSyncHealthData(closure: closure, data: data, synType: .sleep) } func getBloodPressureHistoryData(day: SyncDay = .today, closure: BloodPressureClosure? = nil) { // let data = BleMessage.shared.getSyncCmd(.bloodOxygen) // newStartSyncHealthData(closure: closure, data: data, synType: .pressure) } func getBloodOxygenHistoryData(day: SyncDay = .today, closure: BloodOxygenClosure? = nil) { let data = BleMessage.shared.getSyncCmd(.bloodOxygen) newStartSyncHealthData(closure: closure, data: data, synType: .bloodOxygen) } func getHeartRateHistoryData(day: SyncDay = .today, closure: HeartRateClosure? = nil) { let data = BleMessage.shared.getSyncCmd(.heartRate) newStartSyncHealthData(closure: closure, data: data, synType: .heartRate) } func getStepHistoryData(day: SyncDay = .today, closure: StepClosure? = nil) { let data = BleMessage.shared.getSyncCmd(.step) newStartSyncHealthData(closure: closure, data: data, synType: .step) } func getTrainHistoryData(day: SyncDay = .today, closure: TrainClosure? = nil) { let data = BleMessage.shared.getSyncCmd(.train) newStartSyncHealthData(closure: closure, data: data, synType: .train) } func getPressureHistoryData(day: SyncDay = .today, closure: PressureClosure? = nil) { let data = BleMessage.shared.getSyncCmd(.pressure) newStartSyncHealthData(closure: closure, data: data, synType: .pressure) } func getMettHistoryData(day: SyncDay = .today, closure: MettClosure? = nil) { // startSyncHealthData(closure: closure, data: BleMessage.shared.getSyncCmd(.mett, day: day), cmd: .mett) } // 同步数据 func newStartSyncHealthData(closure: Any?, data: Data, synType: SyncType) { if !isSync { GCDTimer.shared.scheduledDispatchTimerNotNow(WithTimerName: "SyncInterval", timeInterval: 0.1, queue: .main, repeats: false) { self.clearClosures(closure: closure) self.startSyncTimer() self.isNextSync = false self.isSync = true self.isSyncType = synType self.sendData(data) } } else { switch closure { case is BloodPressureClosure: if bloodPressureClosure == nil { bloodPressureClosure = closure as? BloodPressureClosure bloodPressureClosure?([], -1002) bloodPressureClosure = nil } case is HeartRateClosure: if heartRateClosure == nil { heartRateClosure = closure as? HeartRateClosure heartRateClosure?([], -1002) heartRateClosure = nil } case is BloodOxygenClosure: if bloodOxygenClosure == nil { bloodOxygenClosure = closure as? BloodOxygenClosure bloodOxygenClosure?([], -1002) bloodOxygenClosure = nil } case is SleepClosure: if sleepClosure == nil { sleepClosure = closure as? SleepClosure sleepClosure?([], -1002) sleepClosure = nil } case is StepClosure: if stepClosure == nil { stepClosure = closure as? StepClosure stepClosure?([], -1002) stepClosure = nil } case is TrainClosure: if trainClosure == nil { trainClosure = closure as? TrainClosure trainClosure?(nil, -1002) trainClosure = nil } case is PressureClosure: if pressureClosure == nil { pressureClosure = closure as? PressureClosure pressureClosure?([], -1002) pressureClosure = nil } case is MettClosure: if mettClosure == nil { mettClosure = closure as? MettClosure mettClosure?([], -1002) mettClosure = nil } default: break } } } //MARK: - 发送数据 func sendData(_ data: Data) { if peripheral == nil { print("peripheral == nil") return } var serverUUID: String = "" var writeUUID: String = "" switch platform { case ._828: serverUUID = BLEConfig.ServerUUID writeUUID = BLEConfig.WriteUUID default: break } if let services = peripheral?.services { for service in services { if service.uuid.uuidString == serverUUID { if service.characteristics == nil { return } for char in service.characteristics! { if char.uuid.uuidString == writeUUID { if platform == ._828 { if data.count <= 20 { print("发送: \([UInt8](data))") peripheral?.writeValue(data, for: char, type: .withoutResponse) } else { print("发送 拼: \([UInt8](data))") let n = data.count/20 + (data.count%20 == 0 ? 0 : 1) for i in 0.. 12 else { return } let msgId = Int(UInt16(bytes[4]) << 8 | UInt16(bytes[5])) switch msgId { case 0x8001: parseDefaultResponseData(bytes) case 0x8002:// 设备信息查询应答 print("设备信息查询应答") case 0x8009:// 实时步数、卡路里、距离自动上报 print("实时步数、卡路里、距离自动上报") case 0x8010:// 电量变化自动上报 print("电量变化自动上报") Battery = Int(bytes[10]) for delegate in syncDelegateList { delegate.didReceiveBattery(value: Battery) } case 0x8014:// 电话挂断 print("电话挂断") case 0x8015:// 找手机 print("找手机") case 0x8016:// 历史心率数据上报 print("历史心率数据上报") case 0x8017:// 历史血氧数据上报 print("历史血氧数据上报") case 0x8018:// 历史体温数据上报 print("历史体温数据上报") case 0x8019:// 睡眠数据上报 print("睡眠数据上报") case 0x8020:// 历史压力数据上报 print("历史压力数据上报") default: break } // switch cmd { // case .set, .find, .device, .remind, .firmware: // parseSetData(SetCmd(rawValue: bytes[10]), data: data) // case .sync: // let valueBytes = Array(bytes[13..