Commit cbe73597ebf8de2aabfe25215eec8ff4272cd651
1 parent
69e5b680
feat:heart rate
Showing
2 changed files
with
25 additions
and
7 deletions
HDFwear/Home/Model/HealthModel.swift
@@ -287,10 +287,14 @@ class HeartRateModel: Object { | @@ -287,10 +287,14 @@ class HeartRateModel: Object { | ||
287 | 287 | ||
288 | class func toHeartRateArray(_ bytes: [UInt8]) -> [HeartRateModel] { | 288 | class func toHeartRateArray(_ bytes: [UInt8]) -> [HeartRateModel] { |
289 | var hrArray: [HeartRateModel] = [] | 289 | var hrArray: [HeartRateModel] = [] |
290 | - let num = bytes.count/7 | ||
291 | - for i in 0..<num { | ||
292 | - let date = DateInRegion(year: Int(bytes[i*7])+2000, month: Int(bytes[i*7+1]), day: Int(bytes[i*7+2]), hour: Int(bytes[i*7+3]), minute: Int(bytes[i*7+4]), second: Int(bytes[i*7+5])).date | ||
293 | - let hr = HeartRateModel(value: Int(bytes[i*7+6]), date: date) | 290 | + // 将数组分成5个一组 |
291 | + let groupedArray = stride(from: 0, to: bytes.count, by: 5).map { Array(bytes[$0..<min($0 + 5, bytes.count)]) } | ||
292 | + // 处理每组的前四个数 | ||
293 | + for group in groupedArray { | ||
294 | + let hexValue = group.prefix(4).reduce(0) { ($0 << 8) + UInt32($1) } | ||
295 | + let timestamp = TimeInterval(hexValue) | ||
296 | + let date = Date(timeIntervalSince1970: timestamp) | ||
297 | + let hr = HeartRateModel(value: Int(group[4]), date: date) | ||
294 | hrArray.append(hr) | 298 | hrArray.append(hr) |
295 | } | 299 | } |
296 | return hrArray | 300 | return hrArray |
HDFwear/Tools/BluetoothManager+Function.swift
@@ -301,6 +301,7 @@ extension BluetoothManager { | @@ -301,6 +301,7 @@ extension BluetoothManager { | ||
301 | } | 301 | } |
302 | //MARK: - 新解析数据 | 302 | //MARK: - 新解析数据 |
303 | func parseData(_ bytes: [UInt8]) { | 303 | func parseData(_ bytes: [UInt8]) { |
304 | + let bytes: [UInt8] = [0xED, 0x7E, 0x00, 0x01, 0x80, 0x16, 0x00, 0x07, 0x00, 0xC8, 0x64, 0x9D, 0xA3, 0xB4, 0x70, 0x64, 0x9D, 0xAA, 0xBC, 0xF7, 0x64, 0x9D, 0xB1, 0xC4, 0x06, 0x64, 0x9D, 0xB8, 0xCC, 0x00, 0x64, 0x9D, 0xBF, 0xD4, 0x16, 0x64, 0x9D, 0xC6, 0xDC, 0xF9, 0x64, 0x9D, 0xCD, 0xE4, 0x06, 0x64, 0x9D, 0xD4, 0xEC, 0x00, 0x64, 0x9D, 0xDB, 0xF4, 0x00, 0x64, 0x9D, 0xE2, 0xFC, 0xFB, 0x64, 0x9D, 0xEA, 0x04, 0x06, 0x64, 0x9D, 0xF1, 0x0C, 0x00, 0x64, 0x9D, 0xF8, 0x14, 0xE5, 0x64, 0x9D, 0xFF, 0x1C, 0xFD, 0x64, 0x9E, 0x06, 0x24, 0x06, 0x64, 0x9E, 0x0D, 0x2C, 0x00, 0x64, 0x9E, 0x14, 0x34, 0xC5, 0x64, 0x9E, 0x1B, 0x3C, 0xFF, 0x64, 0x9E, 0x22, 0x44, 0x06, 0x64, 0x9E, 0x29, 0x4C, 0x00, 0x64, 0x9E, 0x30, 0x54, 0xB4, 0x64, 0x9E, 0x37, 0x5C, 0x01, 0x64, 0x9E, 0x3E, 0x64, 0x07, 0x64, 0x9E, 0x45, 0x6C, 0x00, 0x64, 0x9E, 0x4C, 0x74, 0x9E, 0x64, 0x9E, 0x53, 0x7C, 0x02, 0x64, 0x9E, 0x5A, 0x84, 0x07, 0x64, 0x9E, 0x61, 0x8C, 0x00, 0x64, 0x9E, 0x68, 0x94, 0x83, 0x64, 0x9E, 0x6F, 0x9C, 0x04, 0x64, 0x9E, 0x76, 0xA4, 0x07, 0x64, 0x9E, 0x7D, 0xAC, 0x00, 0x64, 0x9E, 0x84, 0xB4, 0x72, 0x64, 0x9E, 0x8B, 0xBC, 0x06, 0x64, 0x9E, 0x92, 0xC4, 0x07, 0x64, 0x9E, 0x99, 0xCC, 0x00, 0x64, 0x9E, 0xA0, 0xD4, 0x57, 0x64, 0x9E, 0xA7, 0xDC, 0x08, 0x64, 0x9E, 0xAE, 0xE4, 0x07, 0x64, 0x9E, 0xB5, 0xEC, 0x14, 0x17, 0x3E] | ||
304 | totalLength = 0 | 305 | totalLength = 0 |
305 | mergeLength = 0 | 306 | mergeLength = 0 |
306 | totalBytes = [] | 307 | totalBytes = [] |
@@ -336,6 +337,8 @@ extension BluetoothManager { | @@ -336,6 +337,8 @@ extension BluetoothManager { | ||
336 | } | 337 | } |
337 | case 0x8016:// 历史心率数据上报 | 338 | case 0x8016:// 历史心率数据上报 |
338 | print("历史心率数据上报") | 339 | print("历史心率数据上报") |
340 | + let content = parseContentFromBytes(bytes) | ||
341 | + parseHeartRateData(content) | ||
339 | case 0x8017:// 历史血氧数据上报 | 342 | case 0x8017:// 历史血氧数据上报 |
340 | print("历史血氧数据上报") | 343 | print("历史血氧数据上报") |
341 | case 0x8018:// 历史体温数据上报 | 344 | case 0x8018:// 历史体温数据上报 |
@@ -371,11 +374,11 @@ extension BluetoothManager { | @@ -371,11 +374,11 @@ extension BluetoothManager { | ||
371 | } | 374 | } |
372 | 375 | ||
373 | private func parseContentFromBytes(_ bytes: [UInt8]) -> [UInt8] { | 376 | private func parseContentFromBytes(_ bytes: [UInt8]) -> [UInt8] { |
374 | - let contentLength = Int(bytes[10]) // 获取内容长度 | ||
375 | - guard bytes.count >= 11 + contentLength else { | 377 | + let contentLength = Int(bytes[9]) // 获取内容长度 |
378 | + guard bytes.count >= 10 + contentLength else { | ||
376 | return [] // 如果字节数组长度不足以包含内容,返回空数组 | 379 | return [] // 如果字节数组长度不足以包含内容,返回空数组 |
377 | } | 380 | } |
378 | - let content = Array(bytes[11..<(11 + contentLength)]) // 获取内容部分 | 381 | + let content = Array(bytes[10..<(10 + contentLength)]) // 获取内容部分 |
379 | return content | 382 | return content |
380 | } | 383 | } |
381 | 384 | ||
@@ -438,4 +441,15 @@ extension BluetoothManager { | @@ -438,4 +441,15 @@ extension BluetoothManager { | ||
438 | print("内容: \(info)") | 441 | print("内容: \(info)") |
439 | } | 442 | } |
440 | } | 443 | } |
444 | + | ||
445 | + func parseHeartRateData (_ content: [UInt8]) { | ||
446 | + guard content.count > 0 else { | ||
447 | + print("无有效的信息") | ||
448 | + heartRateClosure?([], nil) | ||
449 | + return | ||
450 | + } | ||
451 | + let hrArray = HeartRateModel.toHeartRateArray(content) | ||
452 | + HeartRateModel.addArray(hrArray)// 加入数据库 | ||
453 | + heartRateClosure?(hrArray, nil) | ||
454 | + } | ||
441 | } | 455 | } |