IOS蓝牙LE:无法使用存储的配对数据进行连接

时间:2013-10-25 12:25:24

标签: ios iphone bluetooth bluetooth-lowenergy

我被困在我的IOS开发中,我需要帮助。我不是专家,也许这是一个愚蠢的问题。

我想做什么

我正在尝试将我的应用程序连接到需要配对的蓝牙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];
        }
    }
}

1 个答案:

答案 0 :(得分:16)

您无需在应用中执行任何配对管理操作。

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

如果您断开与设备的连接,并且稍后再次重新连接,则外围设备需要再次发送Insufficient Authentication错误代码,以便iPhone重新启动加密。同样,您不必在此处执行任何特殊操作。

如果你的应用程序在LE Peripheral模式下运行,情况会有所不同。设置GATT数据库时,请确保为CBAttributePermissionsCBCharacteristicProperties设置正确的标记。这将告诉iOS它应该发送Insufficient Authentication错误代码本身,如果它没有配对。然后由中央设备负责启动加密过程。

Bluetooth Accessory Design Guidelines for Apple Products中,描述了进一步的限制。

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

  • “第3.9节配对”也很有趣。

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

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

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

关于一般的LE加密:无论如何它都不安全(见http://eprint.iacr.org/2013/309)。