扫描具有服务 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 的服务。它保守秘密。所以你不能扫描它。
我正在尝试通过其服务 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 的服务。它保守秘密。所以你不能扫描它。