RFID扫描器的Bluetooth Service UUID查询及CoreBluetooth设备过滤方法
关于CoreBluetooth筛选RFID扫描器的解决方案
一、是否存在RFID扫描器专属的蓝牙Service UUID?
蓝牙官方并没有定义通用的、专门对应RFID扫描器的预定义Service UUID。大部分RFID扫描器厂商会使用自定义的私有UUID,或者复用通用的蓝牙服务(比如常用的UART串口服务,UUID通常为6E400001-B5A3-F393-E0A9-E50E24DCCA9E)。如果你的目标扫描器有厂商文档,建议优先从中获取它的专属服务UUID。
二、如何筛选发现的RFID扫描器设备?
可以结合以下几种方式组合筛选,提升准确性:
- 通过设备类(Class of Device, CoD)筛选:你提到的手持RFID扫描器Minor Device Class的5-2位为
1000(二进制),可从蓝牙广播数据中解析设备类值,提取对应位进行匹配。 - 通过服务UUID筛选(推荐,若已知):如果能获取到目标RFID扫描器的服务UUID(可通过蓝牙调试工具如LightBlue扫描查看,或厂商文档获取),直接在扫描时指定该UUID,CoreBluetooth会自动过滤只返回广播该服务的设备,效率更高。
- 通过设备名称关键词筛选:不少RFID扫描器的设备名称会包含
RFID、Scanner等关键词,可通过检查设备名称或本地名称来初步筛选。
三、修改后的代码示例
func startBluetoothScan() { print("starting bt scan...") // 若已知RFID扫描器的服务UUID,可替换成对应UUID来精准扫描 // let rfidServiceUUID = CBUUID(string: "你的RFID服务UUID") // self.centralManager.scanForPeripherals(withServices: [rfidServiceUUID], options: [CBCentralManagerScanOptionAllowDuplicatesKey: false]) // 暂时先全量扫描,后续在回调里筛选 self.centralManager.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey: false]) print("started bt scan") } func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi: NSNumber) { guard self.discoveredPeripherals[peripheral.identifier] == nil else { return } var isRfidScanner = false // 方式1:通过设备类(CoD)筛选 if let cod = advertisementData[CBAdvertisementDataClassOfDeviceKey] as? NSNumber { let codValue = cod.uint32Value let minorDeviceClass = (codValue >> 0) & 0xFF // 提取Minor Device Class(最低8位) // 提取第5-2位(二进制1000,对应十进制8) let targetBits = (minorDeviceClass & 0x3C) >> 2 // 0x3C是二进制111100,对应bit5-bit2 if targetBits == 0b1000 { isRfidScanner = true } } // 方式2:通过设备名称关键词筛选(可补充更多关键词) if !isRfidScanner { let deviceName = peripheral.name ?? "" let localName = advertisementData[CBAdvertisementDataLocalNameKey] as? String ?? "" if deviceName.contains("RFID") || deviceName.contains("Scanner") || localName.contains("RFID") || localName.contains("Scanner") { isRfidScanner = true } } if isRfidScanner { print("发现RFID扫描器 (信号强度: \(rssi)): \(peripheral.name ?? "-") | \(advertisementData[CBAdvertisementDataLocalNameKey] ?? "-")") self.discoveredPeripherals[peripheral.identifier] = CBPeripheralInfo(peripheral: peripheral, data: advertisementData, rssi: rssi) } }
注意事项
- 不是所有RFID扫描器都会广播设备类(CoD)信息,单一方式可能有遗漏,建议组合多种筛选逻辑
- 若能获取到目标设备的专属服务UUID,优先使用
scanForPeripherals(withServices:)指定UUID扫描,能大幅提升扫描效率和准确性
内容的提问来源于stack exchange,提问作者Kenny Wyland
相关产品推荐
相关产品推荐

