iOS核心蓝牙不要求配对

在我最近的项目中,我需要沟通一个硬件(蓝牙低功耗)。我已经实现了所有委托方法的代码。 我能够连接硬件和设备,但我没有得到配对警报(附加屏幕截图)。 为什么不是要求配对? 谢谢。

#import "BTWCentralConnectionManager.h" @implementation BTWCentralConnectionManager @synthesize cbcManager; @synthesize discoveredPeripheral; @synthesize findMeServiceCharacteristic; @synthesize findMeService; @synthesize delegate=_delegate; static NSString *kFindMeServiceUUID=@"1802"; static NSString *kFindMeCharacteristicUUID=@"2A06"; static BTWCentralConnectionManager* connectionManager = nil; +(BTWCentralConnectionManager *)sharedConnectionManager{ @synchronized(self) { if (!connectionManager){ connectionManager=[[self alloc] init]; } return connectionManager; } return nil; } -(void)findMe { Byte code=0x02; if(self.discoveredPeripheral){ [self.discoveredPeripheral writeValue:[NSData dataWithBytes:&code length:1] forCharacteristic:self.findMeServiceCharacteristic type:CBCharacteristicWriteWithoutResponse]; }else{ UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:@"Invalid Charactersitcs" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alertView show]; alertView=nil; } } -(void)searchForDevices{ self.cbcManager=[[CBCentralManager alloc] initWithDelegate:self queue:nil]; } -(void)connect { NSDictionary* connectOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]; [self.cbcManager connectPeripheral:self.discoveredPeripheral options:connectOptions]; } -(void)disconnect{ [self cleanup]; } - (void)centralManagerDidUpdateState:(CBCentralManager *)central { switch (central.state) { case CBCentralManagerStatePoweredOn:{ [self.cbcManager scanForPeripheralsWithServices:@[ [CBUUID UUIDWithString:kFindMeServiceUUID] ] options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @NO }]; } break; // Scans for any peripheral default:{ UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:@"Cental Manager did change state" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alertView show]; alertView=nil; } break; } } - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { // Stops scanning for peripheral [self.cbcManager stopScan]; if (self.discoveredPeripheral != peripheral) { self.discoveredPeripheral = peripheral; [self.delegate didDeviceDiscoverd:self.discoveredPeripheral.name]; } } - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { [self.delegate didDeviceConnectionFailed:error]; [self cleanup]; } - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { [self.delegate didDeviceConnected]; [self.discoveredPeripheral setDelegate:self]; [self.discoveredPeripheral discoverServices:@[[CBUUID UUIDWithString:kFindMeServiceUUID]]]; } - (void)peripheral:(CBPeripheral *)aPeripheral didDiscoverServices:(NSError *)error { if (error) { NSString *strMsg=[NSString stringWithFormat:@"didDiscoverServices: %@", error]; UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alertView show]; alertView=nil; [self cleanup]; return; } for (CBService *service in aPeripheral.services) { if ([service.UUID isEqual:[CBUUID UUIDWithString:kFindMeServiceUUID]]) { self.findMeService=service; [self.discoveredPeripheral discoverCharacteristics:@[[CBUUID UUIDWithString:kFindMeCharacteristicUUID]] forService:self.findMeService]; } } } - (void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { if(error){ NSString *strMsg=[NSString stringWithFormat:@"didDiscoverCharacteristicsForService: %@", error]; UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alertView show]; alertView=nil; } for(CBCharacteristic *character in [service characteristics]) { if([[service UUID] isEqual:[CBUUID UUIDWithString:kFindMeServiceUUID]] && [[character UUID] isEqual:[CBUUID UUIDWithString:kFindMeCharacteristicUUID]]) { NSString *strMsg=[NSString stringWithFormat:@"didDiscoverCharacteristicsForService: %@", character]; UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alertView show]; alertView=nil; self.findMeServiceCharacteristic = character; } } } - (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { NSString *strMsg=[NSString stringWithFormat:@"Did update value for characteristic %@, new value: %@, error: %@", characteristic, [characteristic value], error]; UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alertView show]; alertView=nil; } - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { if (error) { NSLog(@"Error changing notification state: %@", error.localizedDescription); } // Exits if it's not the transfer characteristic if (![characteristic.UUID isEqual:[CBUUID UUIDWithString:kFindMeCharacteristicUUID]]) { return; } NSString *strMsg=[NSString stringWithFormat:@"didUpdateNotificationStateForCharacteristic %@, reason: %@", characteristic, error]; UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alertView show]; alertView=nil; } - (void) peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { if (error) { NSString *strMsg=[NSString stringWithFormat:@"Failed to write value for characteristic %@, reason: %@", characteristic, error]; UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alertView show]; alertView=nil; } else { NSString *strMsg=[NSString stringWithFormat:@"Did write value for characterstic %@, new value: %@", characteristic, [characteristic value]]; UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Test" message:strMsg delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alertView show]; alertView=nil; } } - (void)cleanup { if (!self.discoveredPeripheral.isConnected) { return; } if (self.discoveredPeripheral.services != nil) { for (CBService *service in self.discoveredPeripheral.services) { if (service.characteristics != nil) { for (CBCharacteristic *characteristic in service.characteristics) { if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:kFindMeServiceUUID]]) { if (characteristic.isNotifying) { [self.discoveredPeripheral setNotifyValue:NO forCharacteristic:characteristic]; return; } } } } } } [self.cbcManager cancelPeripheralConnection:self.discoveredPeripheral]; [self.delegate didDeviceDisconnected]; } @end ` 

如果我理解你是对的,你可以写出一个价值成功的特征,但你没有得到配对的要求。

配对由外设触发 。 意思是外围设备必须拒绝你的核心的写入或读取请求的一个特点。 您的中央拒绝“未经授权的身份validation”,然后尝试与外设配对,并显示您正在等待的配对警报popup。 这一切都是由核心蓝牙自动完成的。 您唯一需要做的就是更改外设中的特性选项和权限。 这是触发配对的苹果示例代码:

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

来源: CoreBluetooth _concepts iOS7预览

在28分钟的时间里,他们还检查了WWDC 2012高级核心蓝牙video ,解释了配对的概念。