You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:28:15