iOS – How to create app scanning BLE with “CoreBluetooth” framework?

How to scan & connect & read peripherals?

Use protocol “CBCentralManagerDelegate“, “CBPeripheralDelegate

How to scan BLE?

...
import CoreBluetooth

// Service UUID
let serviceUUID = CBUUID.init(string: "b4250400-fb4b-4746-b2b0-93f0e61122c6")

class ViewController: UIViewController, CBCentralManagerDelegate {
    
    // Property
    private var centralManager: CBCentralManager!
    
    // Start scanning
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        // Update when the Bluetooth Peripheral is switched on or off. It will fire when an app first starts so you know the state of Bluetooth
        print("Central state update")
        if central.state != .poweredOn {
            print("Central is not powered on")
        } else {
            print("Central scanning for", serviceUUID);
            centralManager.scanForPeripherals(
                withServices: [serviceUUID],
                options: [CBCentralManagerScanOptionAllowDuplicatesKey : true])
        }
    }
    ...
}

How to connect a peripheral?

...
class ViewController: UIViewController, CBPeripheralDelegate, CBCentralManagerDelegate {
    
    // Properties
    private var centralManager: CBCentralManager!
    private var peripheral: CBPeripheral!
    
    // Start scanning
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
           ...
    }
    
    // Connect
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

        // We've found it so stop scan
        self.centralManager.stopScan()

        // Copy the peripheral instance
        self.peripheral = peripheral
        self.peripheral.delegate = self

        // Connect!
        self.centralManager.connect(self.peripheral, options: nil)
    }

    // Handler if we do connect succesfully
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        if peripheral == self.peripheral {
            print("Connected!")
        peripheral.discoverServices([serviceUUID])
        }
    }
    ...
}

How to read characteristics?

...
import CoreBluetooth

// Service UUID
let serviceUUID = CBUUID.init(string: "b4250400-fb4b-4746-b2b0-93f0e61122c6")

// Characteristic UUID
let redLEDCharacteristicUUID   = CBUUID.init(string: "b4250401-fb4b-4746-b2b0-93f0e61122c6")
let greenLEDCharacteristicUUID = CBUUID.init(string: "b4250402-fb4b-4746-b2b0-93f0e61122c6")
let blueLEDCharacteristicUUID  = CBUUID.init(string: "b4250403-fb4b-4746-b2b0-93f0e61122c6")

class ViewController: UIViewController, CBPeripheralDelegate, CBCentralManagerDelegate {
    ...
    // Handles discovery event
    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        if let services = peripheral.services {
            for service in services {
                if service.uuid == serviceUUID {
                    print("LED service found")
                    //Now kick off discovery of characteristics
                    peripheral.discoverCharacteristics([redLEDCharacteristicUUID,
                                                             greenLEDCharacteristicUUID,
                                                             blueLEDCharacteristicUUID], for: service)
                    return
                }
            }
        }
    }

    // Handling discovery of characteristics
    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        if let characteristics = service.characteristics {
            for characteristic in characteristics {
                if characteristic.uuid == redLEDCharacteristicUUID {
                    print("Red LED characteristic found")
                } else if characteristic.uuid == greenLEDCharacteristicUUID {
                    print("Green LED characteristic found")
                } else if characteristic.uuid == blueLEDCharacteristicUUID {
                    print("Blue LED characteristic found");
                }
            }
        }
    }
    ...
}

Reference: ultimate-how-to-bluetooth-swift

Be the first to comment

Leave a Reply

Your email address will not be published.


*