我正在尝试iOS的CoreBluetooth Framework,并且遇到了一个我觉得非常奇怪的问题。扫描提供特定服务的外围设备,但未在发现的外围设备上找到服务
一旦我有一个连接外设,我想发现它的服务 - 但它失败了。尽管寻找并找到提供特定服务的外设。请参阅下面的代码:
func centralManagerDidUpdateState(central: CBCentralManager) {
if(central.state != .PoweredOn) {
print("Returning due to wrong state: ", central.state)
return;
}
print("Starting peripheral scan")
manager.scanForPeripheralsWithServices(serviceUUID, options: nil)
}
外设扫描开始并查找指定的serviceUUID。在这种情况下:serviceUUIDs = [CBUUID(string: "13333333-3333-3333-3333-333333333337")]
。如果我更改字符串,根本没有发现任何服务(如预期的那样)。
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
print("Discovered peripheral: ", peripheral.name)
if(peripheral.name == "PizzaSquat") {
print("Advertising data: ", advertisementData)
print("RSSI: ", RSSI)
activePeripheral = peripheral
print("Connecting to peripheral")
manager.connectPeripheral(peripheral, options: nil)
}
}
在Linux计算机上,我有被显示为一个名为“PizzaSquat”外设(很显然提供了一个服务,因为它发现在全部Bleno
实例上运行。因此,当该外设被发现,我连接到它
func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
print("Connected to Peripheral: ", peripheral.name)
if(peripheral.services == nil) {
print("Starting service discovery")
peripheral.delegate = self
peripheral.discoverServices(serviceUUIDs)
} else {
print("Already has services: ")
for service: CBService in peripheral.services! {
print(service)
}
}
}
一旦连接(以“PizzaSquat”),我检查它是否已经具有服务(事实并非如此),并开始服务发现一切是正确的了这一点 - 但没有服务我期望下面的函数被调用:
func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) {
print("Discovered new Service")
for service: CBService in peripheral.services! {
print(service)
}
}
至少有一个服务,因为如果它没有指定的服务,则根本不应该发现外设!
我也尝试致电peripheral.discoverServices(nil)
发现任何服务,但仍然没有回应。
有人能帮我找到问题吗?
在Objective-C中,情况就是这样,对Swift没有把握,但我想这是一样的,但是你应该保留'CBPeripheral'的引用。 – Larme
我不明白为什么Swift和Objective C之间会有区别...是的,我之前陷入了陷阱。我在'didDiscoverPeripheral'中保留了'activePeripheral = peripheral'的CBPeripheral – Joakim
我的不好,我错过了'activePeripheral'这一行。 – Larme