我要做什么

我正在尝试将我的应用程序连接到需要配对的Bluetooth LE设备。

当前行为

不将设备和我的iPhone应用程序配对就没有问题。我能够毫无问题地连接,重新连接和读取/写入特征。

但是,如果需要将设备与配对配对,则仅在配对弹出确认之后,我才能够第一次读取/写入特征。下次,我发现该应用程序并将其连接到我的设备,但是我没有读取/写入特征数据的权限,因为(我想)我没有使用配对信息。

最后...

在花了几个小时在网上搜索失败后,这是我的问题:

  • 如何使用手机中存储的配对数据将我的应用程序从iPhone应用程序连接到Bluetooth LE设备?我想念什么吗?
  • 是否有可能不是IOS问题,因为如果配对设备的电话中存在配对数据,则会自动使用该配对数据?

  • 有在蓝牙LE和IOS方面有经验的人可以帮助我吗?

    更新2013-10-27

    我发现,如果配对存在(没有确认弹出窗口),发现特征之后,就无法通过配对身份验证来读取受保护的特性。不 protected 特性没问题!我不知道为什么会这样,但是行为是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];
            }
        }
    }
    

    最佳答案

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

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

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

    如果您的应用程序在LE Peripheral模式下运行,则情况会有所不同。设置GATT数据库时,请确保同时为CBAttributePermissionsCBCharacteristicProperties设置正确的标志。这将告诉iOS,如果未配对,则应发送“身份验证不足”错误代码本身。然后由中央设备负责启动加密过程。

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

  • 您的附件需要具有解析专用蓝牙地址的功能。 iPhone会不时更​​改其公共(public)蓝牙地址,只有配对的设备才具有正确的 key 来解析该公共(public)地址并识别iPhone。
  • “3.9节配对”也很有趣。
  • 请注意,如果您在没有中间人(MITM)保护的情况下进行配对,则外围设备可以使用生成的 key 来解析iPhone的私有(private)蓝牙地址。但是,您将无法加密 channel 。

    与iOS上的MITM保护配对时,需要输入一个由远程设备显示的PIN码。据我所知,iOS不支持通过外部 channel 发送配对数据的带外(OOB)配对(至少没有公共(public)的API可以设置OOB数据)。

    长话短说:如果只有“配对”/“取消”配对,则不能加密LE channel ,而只能在以后的连接中识别iPhone。令人高兴的是,即使在iPhone端取消配对,甚至在恢复iPhone固件之后也仍然可以识别iPhone ;-)。

  • 一般而言,关于LE加密:仍然不安全(请参阅http://eprint.iacr.org/2013/309)。

    关于iOS蓝牙LE : unable to connect using stored pairing data,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19589836/

    10-12 01:59