2016-03-04 77 views
1

我正在嘗試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)發現任何服務,但仍然沒有迴應。

有人能幫我找到問題嗎?

+0

在Objective-C中,情況就是這樣,對Swift沒有把握,但我想這是一樣的,但是你應該保留'CBPeripheral'的引用。 – Larme

+0

我不明白爲什麼Swift和Objective C之間會有區別...是的,我之前陷入了陷阱。我在'didDiscoverPeripheral'中保留了'activePeripheral = peripheral'的CBPeripheral – Joakim

+0

我的不好,我錯過了'activePeripheral'這一行。 – Larme

回答

3

當您掃描CBPeripheral對象時,從通告數據包中獲取外圍服務UUID。外設基本上是說:「噢,我有這個服務UUID!」 iOS挑選並傳遞CBPeripheral給你。

但外設可能不會與廣告數據包中的內容同步。這是一個不具約束力的協議,廣告數據包與外設的服務/特性層次結構中的實際內容相匹配。

那麼這意味着外設可能通告一個服務的UUID,但實際上包含另一個(或沒有)UUID。

查看iOS上的LightBlue或Android上的nRF控制面板,查看服務/特性層次結構是否與您的想法相符。在LightBlue中,您應該能夠查看廣告數據,並將其與您連接的外圍設備上的服務進行比較。

相關問題