iOS 7 CoreBluetooth retrievePeripheralsWithIdentifiers未检索

时间:2013-10-02 18:04:28

标签: objective-c iphone ipad ios7 core-bluetooth

我在修复从iOS 6到iOS 7的CoreBluetooth代码时遇到问题。我可以扫描外围设备并建立连接,但是,我无法使用iOS 7中提供的新CoreBluetooth方法重新连接外围设备。这是看看我是如何完成重新连接的:

- (void)retrievePeripheral:(NSString *)uuidString
{

NSUUID *nsUUID = [[NSUUID UUID] initWithUUIDString:uuidString];

if(nsUUID)
{        
    NSArray *peripheralArray = [centralManager retrievePeripheralsWithIdentifiers:@[nsUUID]];

    // Check for known Peripherals
    if([peripheralArray count] > 0)
    {
        for(CBPeripheral *peripheral in peripheralArray)
        {
            NSLog(@"Connecting to Peripheral - %@", peripheral);

            [self connectPeripheral:peripheral];
        }
    }
    // There are no known Peripherals so we check for connected Peripherals if any
    else
    {
        CBUUID *cbUUID = [CBUUID UUIDWithNSUUID:nsUUID];

        NSArray *connectedPeripheralArray = [centralManager retrieveConnectedPeripheralsWithServices:@[cbUUID]];

        // If there are connected Peripherals
        if([connectedPeripheralArray count] > 0)
        {
            for(CBPeripheral *peripheral in connectedPeripheralArray)
            {
                NSLog(@"Connecting to Peripheral - %@", peripheral);

                [self connectPeripheral:peripheral];
            }
        }
        // Else there are no available Peripherals
        else
        {
            // No Dice!
            NSLog(@"There are no available Peripherals");
        }
    }
}

}

uuidString是保存的Peripheral UUID。

我总是看到没有可用外围设备的NSLog语句。我想我错过了一些非常明显的东西,有人可以指出我正确的方向。

此外,我已阅读其他有关CoreBluetooth iOS 7更新问题的帖子,并尝试重置BLE设备和iOS设备,但无济于事。

提前致谢! 可听

2 个答案:

答案 0 :(得分:5)

事实证明,在将消息发送到retrievePeripheral方法之前,我的错误是如何将外围设备的标识符转换为NSString格式。

这是不正确的方式:

NSString *uuidString = [NSString stringWithFormat:@"%@", CFUUIDCreateString(NULL, (__bridge CFUUIDRef)([peripheral identifier]))];

这是正确的方法(在我的方案中有效):

NSString *uuidString = [NSString stringWithFormat:@"%@", [[peripheral identifier] UUIDString]];

根据Apple文档,NSUUID类与CoreFoundation的CFUUIDRef没有免费桥接,如下所述:

  

注意:NSUUID类与CoreFoundation的CFUUIDRef没有免费桥接。如果需要,使用UUID字符串在CFUUIDNSUUID之间进行转换。两个NSUUID对象不能保证与指针值相当(因为CFUUIDRef是);使用isEqual:来比较两个NSUUID个实例。

对于那些喜欢直观表达我这意味着什么的人来说,这是一个例子:)

控制台中打印的外围信息:

<CBPeripheral: 0x14699430 identifier = DD2468AB-1865-B926-7FA4-AE3755D479D8, Name = "IDYNAMO EMV-A27F", state = disconnected>

将Peripheral的标识符转换为NSString的错误方法产生:

1865B926-7FA4-AE37-55D4-79D800000000

将外围设备的标识符转换为NSString的正确方法产生:

DD2468AB-1865-B926-7FA4-AE3755D479D8

我希望这可以帮助某人完成他们的BLE旅程,如果我错了,我可以随时纠正我,因为我还在学习这些东西。

谢谢!

可听

答案 1 :(得分:1)

这是一篇很老的帖子,但是对于其他寻找答案的人来说。

对retrieveConnectedPeripherals的第二次/下次调用实际上需要服务UUID(CBUUID类型),而不是iOS首次连接的NSUUID。检索的是具有该服务UUID实现的列表外围设备。例如,如果你有许多活动臂章,并且所有人都有你需要的心跳服务,那么你将检索所有3个外围设备。此外,在第一次调用KNOWN外围设备时,您必须在应用程序启动之间存储NSUUID,因为该ID是由iOS首次连接创建的。希望有所帮助