首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS 7 CoreBluetooth retrievePeripheralsWithIdentifiers未检索

iOS 7 CoreBluetooth retrievePeripheralsWithIdentifiers未检索
EN

Stack Overflow用户
提问于 2013-10-03 02:04:28
回答 2查看 9.6K关注 0票数 8

我在将CoreBluetooth代码从iOS 6更新到iOS 7时遇到问题。我可以扫描外设并建立连接,但是无法使用iOS 7中提供的新CoreBluetooth方法重新连接外设。以下是我尝试完成重新连接的方法:

代码语言:javascript
运行
复制
- (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是保存的外设UUID。

我总是转到没有可用的外设的NSLog语句。我想我遗漏了一些非常明显的东西,有人可以给我指明正确的方向。

此外,我还阅读了其他关于CoreBluetooth的iOS 7更新问题的文章,并尝试重置BLE设备和iOS设备,但都无济于事。

提前感谢!可听的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-03 21:52:08

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

这是不正确的方式:

代码语言:javascript
运行
复制
NSString *uuidString = [NSString stringWithFormat:@"%@", CFUUIDCreateString(NULL, (__bridge CFUUIDRef)([peripheral identifier]))];

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

代码语言:javascript
运行
复制
NSString *uuidString = [NSString stringWithFormat:@"%@", [[peripheral identifier] UUIDString]];

根据苹果公司的文档,NSUUID类与CoreFoundation的CFUUIDRef不是免费桥接的,如下所述:

注意:NSUUID类不是与CoreFoundation的CFUUIDRef免费桥接的。如果需要,可以使用UUID字符串在CFUUIDNSUUID之间进行转换。不能保证两个NSUUID对象在指针值上具有可比性(就像CFUUIDRef一样);请使用isEqual:比较两个NSUUID实例。

对于那些喜欢像我这样直观表示这意味着什么的人,这里有一个示例:)

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

代码语言:javascript
运行
复制
<CBPeripheral: 0x14699430 identifier = DD2468AB-1865-B926-7FA4-AE3755D479D8, Name = "IDYNAMO EMV-A27F", state = disconnected>

将外围设备的标识符转换为NSString的错误方法会产生以下结果:

代码语言:javascript
运行
复制
1865B926-7FA4-AE37-55D4-79D800000000

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

代码语言:javascript
运行
复制
DD2468AB-1865-B926-7FA4-AE3755D479D8

我希望这对一些人的BLE之旅有所帮助,如果我以任何方式错了,请随时纠正我,因为我还在学习这些东西。

谢谢!

可听的

票数 5
EN

Stack Overflow用户

发布于 2015-01-11 00:35:58

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19143687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档