2016-03-04 108 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中,您应该能够查看广告数据,并将其与您连接的外围设备上的服务进行比较。