扫描具有服务 returns 无的外围设备

Scan for peripherals with services returns nothing

我正在尝试通过其服务 uuid 扫描特定设备 - 在本例中为 JBL 扬声器,在未来的情况下,我想扫描车内的设备。 起初,我用 nil.

扫描附近的外围设备
self.centralManager?.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey:true])

找到扬声器后(这是我得到的数据):

peripheral identifier =  0BD95D98-D979-67DA-F3AA-C6C03781E70B
discovered peripheral =  <CBPeripheral: 0x283ed4000, identifier = 0BD95D98-D979-67DA-F3AA-C6C03781E70B, name = JBL Flip 4, state = disconnected>
advertisement data =  ["kCBAdvDataRxSecondaryPHY": 0, "kCBAdvDataTimestamp": 643124133.584141, "kCBAdvDataIsConnectable": 1, "kCBAdvDataManufacturerData": <5700d11e 0100ff58>, "kCBAdvDataRxPrimaryPHY": 0, "kCBAdvDataLocalName": JBL Flip 4]
kCBAdvDataManufacturerData =  {length = 8, bytes = 0x5700d11e0100ff58}

我连接到扬声器,当我收到 didConnect 回调时,我调用了发现服务:

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        
        self.connectedPeripheral = peripheral
        peripheral.delegate = self
        
        peripheral.discoverServices(nil)
}

didDiscoverServices 服务返回时,我看到以下输出:

services =  Optional([<CBService: 0x281adc700, isPrimary = YES, UUID = 65786365-6C70-6F69-6E74-2E636F6D0000>, <CBService: 0x281adcb40, isPrimary = YES, UUID = FE8F>])

此时,我想使用我得到的服务uuid​​,扫描JBL音箱。 因此,我没有使用 nil 来调用 scanForPeripherals,而是使用了一个包含如下服务的数组:

self.centralManager?.scanForPeripherals(withServices: [CBUUID(string: "FE8F"), CBUUID(string: "65786365-6C70-6F69-6E74-2E636F6D0000")], options: [CBCentralManagerScanOptionAllowDuplicatesKey:true])

然后我重新启动了应用程序,但是这次我没有找到任何设备。 为什么会这样?

请参阅 scanForPeripherals(withServices:options:) 的文档:

You can provide an array of CBUUID objects — representing service UUIDs — in the serviceUUIDs parameter. When you do, the central manager returns only peripherals that advertise the services you specify

您获得的服务 65786365-6C70-6F69-6E74-2E636F6D0000,您在连接之前获得它 (didConnect),并且在“扫描设备上的更多信息”之后获得它 (discoverServices ).
但它并没有为它做广告,也没有告诉所有人它有使用该 UUID 的服务。它保守秘密。所以你不能扫描它。