iOS蓝牙 - 现在配对弹出

时间:2015-07-23 08:40:05

标签: ios iphone bluetooth core-bluetooth

我正在创建一个连接蓝牙耳机(BLE)的iOS应用程序。

  • 我搜索&将耳机连接到我的iPhone
  • 我将设备与我的iPhone配对
  • 我打开我的应用程序,它会搜索蓝牙设备
  • 当应用程序找到我的设备时,它会请求连接它。
  • iOS弹出一条消息,要求用户按“立即配对”按钮连接设备

由于我在使用我的应用程序之前已经配对设备,有没有办法连接应用程序中没有“立即配对”弹出窗口?

---------------编辑1 ---------

我改变了我的代码。我第一次连接时保存设备的UUID,当我重新连接设备时,应用程序找到保存的UUID并尝试找到“已知外设”并重新连接。代码实际上找到了“已知外围设备”,但在我尝试重新连接之后,它又要求配对。当设备重新连接时,有没有办法避免“立即对”弹出窗口?

代码段:

-(void) connectToPeripheral : (CBPeripheral*) peripheral {
    [self.centralManager stopScan];
    self.peripheral = peripheral;
    peripheral.delegate = self;
    [self.centralManager connectPeripheral:peripheral options:nil];
    self.peripheral = peripheral;
}

-(void) searchForDevices {
    // Scan for all available CoreBluetooth LE devices
    if (self.centralManager == nil ) {
        CBCentralManager *centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
        self.centralManager = centralManager;
    }

    //check if previous peripheral exists
    NSArray *knownPeripherals = nil;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString* knownPeripheralID = [defaults stringForKey:@"knownPeripheralID"];
    if ( knownPeripheralID != nil ) {
        self.connectedPeripheralUUID = [[NSUUID alloc] initWithUUIDString:knownPeripheralID];
        knownPeripherals = [self.centralManager retrievePeripheralsWithIdentifiers:[NSArray arrayWithObjects:self.connectedPeripheralUUID, nil]];
    }


    if ( knownPeripherals != nil && [knownPeripherals count] > 0 ) {
        NSLog(@"knownPeripherals Peripherals");
        CBPeripheral *foundPeripheral = [knownPeripherals objectAtIndex:0];
        [self connectToPeripheral:foundPeripheral];
    } else {

        NSArray *connectedPeripherals = [self.centralManager retrieveConnectedPeripheralsWithServices:[NSArray arrayWithObjects:UUID_SERIAL_SERVICE_STR, nil]];
        NSLog(@"Connected Peripherals");

        if ( connectedPeripherals != nil && [connectedPeripherals count] > 0 ) {

        } else {
            [self.centralManager scanForPeripheralsWithServices:nil options:nil];
        }

    }
}

1 个答案:

答案 0 :(得分:2)

在围绕这个问题进行一些研究之后,我认为这不是你能够解决的问题(除非我评论了一个自定义警报,通过查找任何一个应该很容易找到的警报创建警报的代码!)。无论您尝试连接的耳机是什么,都要求安全连接,CoreBluetooth正在生成此警报。据我所知,没有办法在代码中使用警报。

来自蓝牙上的苹果文档(https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/BestPracticesForSettingUpYourIOSDeviceAsAPeripheral/BestPracticesForSettingUpYourIOSDeviceAsAPeripheral.html#//apple_ref/doc/uid/TP40013257-CH5-SW7

  

根据用例,您可能希望销售具有一个服务的服务   或更多的特征,其价值需要是安全的。例如,   想象一下,你想要出售社交媒体资料服务。这个   服务可能具有其值代表成员的特征   个人资料信息,例如名字,姓氏和电子邮件地址。   您很可能希望仅允许受信任的设备检索   会员的电子邮件地址。

     

您可以确保只有受信任的设备才能访问敏感设备   通过设定适当的特征来表征特征值   属性和权限。继续上面的例子,允许   只有可信设备才能检索会员的电子邮件地址,设置   适当的特性的属性和权限,如下所示:

emailCharacteristic = [[CBMutableCharacteristic alloc]
    initWithType:emailCharacteristicUUID
    properties:CBCharacteristicPropertyRead
    | CBCharacteristicPropertyNotifyEncryptionRequired
    value:nil permissions:CBAttributePermissionsReadEncryptionRequired]; In this
     

示例,该特性配置为仅允许受信任   设备读取或订阅其值。当连接,远程   中央试图阅读或订阅这个特征的价值,   核心蓝牙尝试将本地外围设备与中心配对   创建一个安全的连接。

     

例如,如果中央和外围设备都是iOS设备,则两者都是   设备接收指示其他设备想要的警报   配对。中央设备上的警报包含您必须的代码   进入外围设备警报的文本字段以完成   配对过程。

     

配对过程完成后,外围设备会考虑   配对中心是可信设备,允许集中访问它   加密的特征值。

如果您收到此警报,那么您尝试连接的BlueTooth耳机需要为您尝试访问的其中一个特征提供安全连接。更多信息可以在@koshyyyk的答案中找到:stackoverflow.com / a / 18226632/1122794。还有一个Apple开发者关于BlueTooth的讨论以及我在此处复制的评论中链接的配对概念:http://adcdownload.apple.com//videos/wwdc_2012__hd/session_705__advanced_core_bluetooth.mov

如果您有开发者访问该设备的权限,则可以将其关闭。如果没有,那么您可以选择不使用该特征,也可以找出将警报用于您的应用程序的某种方式。

编辑我的BLE代码,它不会发出警报(如果相关的话)。该项目正在改编自Red Bear Lab的开源BLE代码:https://github.com/RedBearLab/iOS

- (void) connectPeripheral:(CBPeripheral *)peripheral
{
    NSLog(@"Connecting to peripheral with UUID : %@", peripheral.identifier.UUIDString);

    [self.activePeripherals addObject:peripheral];
    [self.CM connectPeripheral:peripheral
                       options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];
}

- (int) findBLEPeripherals:(int)timeout
{        
    if (self.CM.state != CBCentralManagerStatePoweredOn)
    {
        NSLog(@"CoreBluetooth not correctly initialized !");
        return -1;
    }

    [NSTimer scheduledTimerWithTimeInterval:(float)timeout target:self selector:@selector(scanTimer:) userInfo:nil repeats:NO];

    [self.CM scanForPeripheralsWithServices:nil options:nil];              
    return 0; // Started scanning OK !
}