从一个字节中获取一个字符串(Corebluetooth, Swift)

问题描述 投票:0回答:1

做这个只是想看看是否有人能帮我解决一些BLE问题。我想做一个应用程序,从我的划船机上获取东西,但我不知道如何把字节变成像字符串一样?它很难解释,但这是我的VC。

import UIKit
import CoreBluetooth


let rowerServiceCBUUID = CBUUID(string: "CE060000-43E5-11E4-916C-0800200C9A66")
let characteristic1CBUUID = CBUUID(string: "CE060031-43E5-11E4-916C-0800200C9A66")
let characteristic2CBUUID = CBUUID(string: "2AD1")
class HRMViewController: UIViewController {
  @IBOutlet weak var heartRateLabel: UILabel!
  @IBOutlet weak var bodySensorLocationLabel: UILabel!
  var centralManager: CBCentralManager!
  var pmPeripheral: CBPeripheral!
  var wattValue: Int!
  override func viewDidLoad() {
    super.viewDidLoad()
    centralManager = CBCentralManager(delegate: self, queue: nil)
    // Make the digits monospaces to avoid shifting when the numbers change
    heartRateLabel.font = UIFont.monospacedDigitSystemFont(ofSize: heartRateLabel.font!.pointSize, weight: .regular)
  }

  func onHeartRateReceived(_ heartRate: Int) {
    heartRateLabel.text = String(heartRate)
    print("BPM: \(heartRate)")
  }
}
extension HRMViewController: CBCentralManagerDelegate {
  func centralManagerDidUpdateState(_ central: CBCentralManager) {
      print("Central state update")
      if central.state != .poweredOn {
          print("Central is not powered on")
      } else {
          print("Central scanning for", rowerServiceCBUUID);
          centralManager.scanForPeripherals(withServices: [rowerServiceCBUUID],
                                            options: [CBCentralManagerScanOptionAllowDuplicatesKey : true])
      }
  }

  func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    print(peripheral)
    peripheral.delegate = self
    pmPeripheral = peripheral
    pmPeripheral.delegate = self
    centralManager.stopScan()
    centralManager.connect(pmPeripheral!)
  }
  func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    print("Connected!")
    pmPeripheral.discoverServices(nil)
  }

}
extension HRMViewController: CBPeripheralDelegate {
  func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    guard let services = peripheral.services else { return }
    for service in services {
      print(service)
      print(service.characteristics ?? "characteristics are nil")
      peripheral.discoverCharacteristics(nil, for: service)
    }
  }
  func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?){
    guard let characteristics = service.characteristics else { return }
    for characteristic in characteristics {
      print(characteristic)
      if characteristic.properties.contains(.read) {
        print("\(characteristic.uuid): properties contains .read")
      }
      if characteristic.properties.contains(.notify) {
        print("\(characteristic.uuid): properties contains .notify")
      }
      peripheral.readValue(for: characteristic)
    }
  }
  func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic,
                  error: Error?) {
    switch characteristic.uuid {
      case characteristic1CBUUID:
        let bodySensorLocation = bodyLocation(from: characteristic)
        bodySensorLocationLabel.text = bodySensorLocation
      default:
        print("Unhandled Characteristic UUID: \(characteristic.uuid)")
    }
  }
  private func bodyLocation(from characteristic: CBCharacteristic) -> String {
    guard let characteristicData = characteristic.value,
      let byte = characteristicData.first else { return "Error" }
    switch byte {
      case 0: return "0"
      case 1: return "1"
      case 2: return "2"
      case 3: return "3"
      case 4: return "4"
      case 5: return "5"
      case 6: return "6"
      case 7: return "7"
      case 8: return "8"
      default:
        return "Reserved for future use"
    }
  }
}

具体来说,最下面的文字是我被卡住的地方,每个Corebluetooth指南都会把数字换成文字,但我的是一个字符串数组(如图所示。https:/youtu.berXDCBVQXdbg)。)

我被卡住了,不知道该往哪里走。任何帮助将被感激!

ios swift bluetooth-lowenergy core-bluetooth
1个回答
0
投票

从你使用的UUID来看,你目前关注到的是 C2划船一般状态特征 的第11页记载。Concept2性能监控器蓝牙智能通信接口定义.

文档中说,该消息将由19个字节组成。

  • 字节0: 逝去的时间Lo(0.01秒LSB)
  • 字节1:经过的时间中
  • 字节2:经过时间高
  • 字节3:距离Lo(0.1米LSB)
  • 字节4:中距离
  • 字节5:距离高
  • 字节6: 锻炼类型(枚举)
  • ...

在3个字节中存储的经过时间:字节0是最不重要的字节(LSB),其次是中字节和高字节。而单位是0.01s。所以要得到秒,必须除以100。

距离的存储方式与此类似。单位是0.1m。

锻炼类型在字节6中以枚举方式给出。所以不包含文字。只是一个数字代码。

要解码它,请使用下面的代码。函数 onRowingGeneralStatusUpdate(for:) 取代了你那名称混乱的函数 bodyLocation(from:):

func onRowingGeneralStatusUpdate(characteristic: CBCharacteristic) {
    guard let data = characteristic.value else { return }

    // elapsed time in sec
    let elapsedTime: Double = Double(Int(data[0]) + 256 * Int(data[1]) + 65536 * Int(data[2])) / 100.0
    // distance in m
    let distance: Double = Double(Int(data[3]) + 256 * Int(data[4]) + 65536 * Int(data[5])) / 10.0
    let workout: String =  workoutType(for: data[6])
}

func workoutType(for code: UInt8) -> String {
    switch code {
    case 0:
        return "Just row, no splits"
    case 1:
        return "Just row, splits"
    case 2:
        return "Fixed dist, no splits"
    case 3:
        return "Fixed dist, splits"
    case 4:
        return "Fixed time, no splits"
    case 5:
        return "Fixed time, splits"
    case 6:
        return "Fixed time, interval"
    case 7:
        return "Fixed dist, interval"
    case 8:
        return "Variable, interval"
    case 9:
        return "Variable, undef rest, interval"
    case 10:
        return "Fixed, calorie"
    case 11:
        return "Fixed, watt-minutes"
    case 12:
        return "Fixed cals, interval"
    default:
        return ""
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.