Search code examples
iosswiftcore-bluetoothrfid

Bluetooth Service UUID for RFID Scanner?


I'm working with CoreBluetooth for the first time and trying to figure out how to filter down the list of devices to just RFID scanners. I've learned that there are pre-defined Service UUIDs for various types of devices, but I can't find any of those services that explicitly mention, or even seem to match up with, RFID Scanners.

However, in the Minor Device Class table that bits 5-2 for handheld RFID scanners should be 1000. I'm confused as to where that goes though. The Class of Device section describes what bits 23-0 are used for when defining various types of devices so I know those 5-2 bits go into that overall 23-0 bits collection... but I'm not sure how that overlaps/interacts with the service UUIDs or whether they interact at all.

For example, the common example I've found is that the Heart Rate service is defined with a shortened UUID of 0x180D, but that would be 32 bits, not 24 like the Device Class above.

Is there a Bluetooth Service UUID for RFID scanners? How can I filter the list of discovered devices so that I can only present the RFID scanners?

func startBluetoothScan() {
    print("starting bt scan...")
    self.centralManager.scanForPeripherals(withServices: nil,
        options: [CBCentralManagerScanOptionAllowDuplicatesKey: false]
    )
    print("started bt scan")
}

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi: NSNumber) {
    if self.discoveredPeripherals[peripheral.identifier] == nil {
        print("did discover bt peripheral (strength: \(rssi)): \(peripheral.name ?? "-") | \(advertisementData[CBAdvertisementDataLocalNameKey] ?? "-")")
        self.discoveredPeripherals[peripheral.identifier] = CBPeripheralInfo(peripheral: peripheral, data: advertisementData, rssi: rssi)
    }
}

Solution

  • There are certain services that are defined by the Bluetooth SIG - You give an example of one such; The heart rate service. These services are contained in the assigned numbers document.

    These assigned services use a 16 bit value that is substituted into the base UUID of 0000xxxx-0000-1000-8000-00805F9B34FB - The actual service code for the heart rate service is 0000180d-0000-1000-8000-00805F9B34FB

    Core Bluetooth recognises these 16 bit service identifiers and does the substitution for you.

    The assigned GATT service ids are listed in section 3.4.1.

    The 1 0 0 0 bits you refer to are in the peripheral device class section, not the GATT service section.

    There does not appear to be a defined service for RFID scanners. I suspect that it would be likely for such a device to use the HID Bluetooth profile and appear as a keyboard, in which case it would not be visible to an iOS app via Core Bluetooth.

    Manufacturers may also choose to expose their device via their own GATT services; You would need to refer to the documentation for the specific device.