扫描提供特定服务的外围设备,但在发现的外围设备上找不到服务

时间:2016-03-04 12:50:22

标签: ios core-bluetooth

我正在尝试使用适用于iOS的CoreBluetooth框架,而我正面临一个我发现非常奇怪的问题。

一旦我有一个连接的外围设备,我想发现它的服务 - 但它失败了。尽管寻找和寻找提供特定服务的外围设备。请参阅以下代码:

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计算机上,我运行了Bleno个实例,该实例显示为外围设备,名称为" PizzaSquat" (并且显然提供了一项服务,因为它已被发现。所以当发现这个外围设备时,我会连接它。

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)
        }
    }
}

连接后(到#34; PizzaSquat"),我检查它是否已经有服务(它没有)并启动服务发现。到目前为止,一切都是正确的 - 但是没有发现任何服务。我希望调用以下函数:

func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) {
    print("Discovered new Service")
    for service: CBService in peripheral.services! {
        print(service)
    }
}

至少有一项服务,因为如果外围设备没有指定的服务,则根本不应该被发现!

我还试图调用peripheral.discoverServices(nil)来发现任何服务,但仍然没有响应。

有人可以帮我找到问题吗?

1 个答案:

答案 0 :(得分:4)

扫描CBPeripheral对象时,从广告包中获取外围服务UUID。外围设备基本上是在说,"哦,是的,我有这项服务UUID!" iOS选择了它并将CBPeripheral传递给你。

但外围设备可能无法与广告包中的内容同步。这是一个非约束性协议,广告包与外围设备的服务/特征层次结构中的实际内容相匹配。

所以这意味着外围设备可以宣传一个服务UUID,但实际上包含另一个服务UUID(或者没有)。

在iOS上检查LightBlue或在Android上查看nRF控制面板,看看服务/特征层次结构是否与您的想法相符。在LightBlue中,您应该能够查看广告数据并将其与您所连接的外围设备上的服务进行比较。