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];
        }
    }
}
4

1 回答 1

18

您无需在应用程序中执行任何操作即可进行配对管理。

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

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

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

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

  • 您的配件需要能够解析私有蓝牙地址。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)。

于 2013-10-26T11:03:28.560 回答