iOSConfigurar balizas con CoreBluetooth


Introducción

Caliente para leer y escribir datos en un dispositivo bluetooth de baja energía.

Observaciones

Algunos puntos importantes

  • No se necesitan capacidades.
  • Los bytes de la tienda de iPhone en formato Little Endian, así que compruebe si el accesorio Bluetooth también usa Little Endian. Ejemplo:
    • Intel CPU usualmente usa little endian.
    • La arquitectura ARM era little-endian antes de la versión 3 cuando se convirtió en big-endian.
  • Después de una operación única o por lotes, la conexión se perderá, por lo que debe volver a conectarse antes de continuar.

Escanear para UUID DE SERVICIO

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

Cómo descubrir el UUID de SERVICIO sin documentación.

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 significa que se devolverán todos los servicios, lo que no es una buena opción (LEA Comentarios 3)
  • Si no ha encontrado el UUID DE SERVICIO, ejecute su código y busque en la consola introduzca la descripción de la imagen aquí
  • Encontré tener 3 servicios: Batería, información del dispositivo (Firmware) y FFF0
  • Este servicio de uuid no es estándar, puede encontrar una lista de estándares aquí
  • FFF0 es el UUID DE SERVICIO en este caso

Convertir datos a UInt16 y contrario.

Agrega estas extensiones a tu clase

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))
    }
}

Configurar balizas con CoreBluetooth Ejemplos relacionados