我正在嘗試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