iOS蓝牙低功耗:无法使用存储的配对数据进行连接

12

我想做什么

我试图将我的应用程序连接到需要配对的蓝牙LE设备。

当前行为

没有配对设备和我的iPhone应用程序没有问题。我能够连接,重新连接并读取/写入特征而没有任何问题。

但是,如果设备需要配对,我只能在第一次进行配对弹出确认后读取/写入特征。下一次,尽管我已经发现并连接了应用程序到我的设备,但我没有权限读取/写入特征数据,因为(我猜)我没有使用配对信息。

最后...

在花费几个小时在网络上搜索无果后,这里有我的问题:

  • 怎样可以从我的iPhone应用程序中使用存储在手机中的配对数据来连接蓝牙LE设备?我错过了什么吗?

  • 是否可能不是IOS的问题,因为如果配对数据存在于连接的设备中,则会自动使用它?

有没有具有蓝牙LE和IOS经验的人可以帮助我?

更新2013-10-27

我发现如果存在配对鉴权,就无法在发现特征时立即读取受保护的特征(没有确认弹出窗口)。非受保护的特征没有问题!我不知道为什么会发生这种情况,但是行为是IOS应用程序从未收到来自设备的答案。

因此,如果第一次阅读是在之后进行的,则不会引起问题。这里是我用于发现具有数据读取注释的特征的代码。

- (void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
{
    NSArray     *characteristics    = [service characteristics];
    CBCharacteristic *characteristic;

    if (peripheral != servicePeripheral) {
        NSLog(@"Wrong Peripheral.\n");
        return ;
    }

    if (service != batteryService) {
        NSLog(@"Wrong Service.\n");
        return ;
    }

    if (error != nil) {
        NSLog(@"Error %@\n", error);
        return ;
    }

    for (characteristic in characteristics) {
        NSLog(@"discovered characteristic %@", [characteristic UUID]);

        if ([[characteristic UUID] isEqual:[CBUUID UUIDWithString:kBatteryCharacteristicUUIDString]]) { // Bat
            NSLog(@"Discovered Bat Characteristic");
            batteryCharacteristic = [characteristic retain];
            //--> generate problem when pairing exists between IOS app and device
            //[peripheral readValueForCharacteristic:batteryCharacteristic];
        }
    }
}

我遇到了完全相同的问题。您说“问题在芯片方面”,那么您是如何解决这个问题的呢?能否提供一些指示? - Subzero
@Subzero 我之前使用了Nordic BLE芯片nRF51822,但是在微控制器中特征属性没有定义得很好。 - sdespont
每当我在BLE上写入数据时,它都没有响应,我也遇到了同样的问题,并且在didupdatecharcaterstics中没有接收到任何数据。 - Nex Mishra
@sdespont,好的,nRF51822芯片编程器声称已经完成了安全配对。但是在iOS中,我无法使用connectPeripheral:options:方法进行配对。在iOS中,我们不想改变任何东西。只有当nRF51822芯片编程完美时,connectPeripheral方法才会打开配对对话框。对吗?请回复。 - Solid Soft
@SolidSoft 抱歉,我无法帮助您。您应该尝试在https://devzone.nordicsemi.com/questions/上发布问题。 - sdespont
显示剩余4条评论
1个回答

18

您的应用程序不需要进行配对管理。

如果您的应用程序在LE Central模式下运行,并且外设响应读/写请求时发送了Insufficient Authentication错误代码,iOS将自动与您的设备配对并重试请求。

如果您断开与设备的连接,稍后再次重新连接,则外设需要再次发送Insufficient Authentication错误代码,以便iPhone重新启动加密。同样,在此处您的应用程序不需要做任何特殊处理。

如果您的应用程序在LE Peripheral模式下运行,则情况有所不同。设置GATT数据库时,请确保为CBAttributePermissions和CBCharacteristicProperties都设置正确的标志。这将告诉iOS,如果未配对,则应该自己发送Insufficient Authentication错误代码。然后,中央设备负责启动加密过程。

Apple产品的蓝牙附件设计指南中,描述了进一步的限制。

  • 您的配件需要具备解析私有蓝牙地址的能力。iPhone会不时更改其公共蓝牙地址,只有已配对的设备才能具备正确的密钥来解析该公共地址并识别iPhone。

  • "第3.9节 配对"也很有趣。

  • 请注意,如果您在没有中间人攻击(MITM)保护的情况下进行配对,则您的外围设备可以使用生成的密钥来解析iPhone的私有蓝牙地址。但是,您将无法加密通道。

    iOS上的MITM保护配对涉及输入由远程设备显示的PIN码。至于通过外部渠道发送配对数据的带外(OOB)配对,据我所知,iOS不支持(至少没有公共API设置OOB数据)。

    长话短说:如果您只有“配对”/“取消”配对,您无法加密LE通道,但仅能识别iPhone在未来的连接中。好处是即使您在iPhone端解除配对,在恢复iPhone固件后,仍然可以识别iPhone;-)。

关于LE加密的总体来说:它本身不安全(参见http://eprint.iacr.org/2013/309)。


1
感谢您完整而有趣的回答。由于我的设备没有显示屏或键盘,所以认证方法是“只需操作”。您说得对,事实上我不需要做任何事情来处理当前配对信息。有了您的答案,我能够找到真正的问题所在。请查看我的问题更新。 - sdespont
1
问题出在BLE芯片方面。感谢帮助我相信iPhone的行为,我一直责怪错误的设备:o) - sdespont
我们能否在iPhone上不进行配对的情况下从某些设备接收信息? - Rajath Shetty K
@rajath 如果您没有指定特殊权限/属性,则这是默认设置。 - Etan
我无法打开配对对话框,当连接外设时如何触发它? - Solid Soft
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接