使用 CoreBluetooth 配置信標

一些重點

  • 不需要任何功能。
  • iPhone 以 Little Endian 格式儲存位元組,因此請檢查藍芽配件是否也使用 Little Endian。例:
    • intel CPU 通常使用小端。
    • ARM 體系結構在版本 3 之前是小端,當它變成 big-endian 時。
  • 在單個或批量操作之後,連線將丟失,因此你必須在繼續之前重新連線。

掃描服務 UUID

func SearchBLE(){
    cb_manager.scanForPeripherals(withServices:[service_uuid], options: nil)
    StopSearchBLE()
}

如何在沒有文件的情況下發現 SERVICE UUID

func centralManager(_ central: CBCentralManager, didConnect peripheral:             
CBPeripheral) {
        peripheral.delegate = self
        peripheral.discoverServices(nil)
}

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    for service in peripheral.services! {
        print("Service: \(service)\n error: \(error)")
    }
}
  • discoverServices(nil) - NIL 表示將返回所有服務,這不是一個好的選擇。(閱讀備註 3)

  • 如果你還沒有找到 SERVICE UUID 執行程式碼並在控制檯中查詢 StackOverflow 文件

  • 我發現有 3 項服務:電池,裝置資訊(韌體)和 FFF0

  • 這個 uuid 服務不是標準服務,標準列表可以在這裡找到

  • 在這種情況下,FFF0 是 SERVICE UUID

將資料轉換為 UInt16,相反

將此擴充套件新增到你的類

protocol DataConvertible {
    init?(data: Data)
    var data: Data { get }
}

extension DataConvertible {

    init?(data: Data) {
        guard data.count == MemoryLayout<Self>.size else { return nil }
        self = data.withUnsafeBytes { $0.pointee }
    }

    var data: Data {
        var value = self
        return Data(buffer: UnsafeBufferPointer(start: &value, count: 1))
    }
}
extension UInt16 : DataConvertible {
    init?(data: Data) {
        guard data.count == MemoryLayout<UInt16>.size else { return nil }
        self = data.withUnsafeBytes { $0.pointee }
    }
    var data: Data {
        var value = CFSwapInt16HostToBig(self)
        return Data(buffer: UnsafeBufferPointer(start: &value, count: 1))
    }
}