2013-07-31 66 views
10

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

#import "BTWCentralConnectionManager.h" 

    @implementation BTWCentralConnectionManager 

    @synthesize cbcManager; 

    @synthesize discoveredPeripheral; 

    @synthesize findMeServiceCharacteristic; 

    @synthesize findMeService; 

    @synthesize delegate=_delegate; 

    static NSString *[email protected]"1802"; 

    static NSString *[email protected]"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 
` 
+0

没有一些源代码,它是很难帮助你。 – Bloodcount

+0

感谢Bloodcount,请检查更新的问题。 – Mangesh

+0

您是否尝试过使用iOS6设备? – Larme

回答

16

如果我理解你的权利,你可以成功地写入值的特性,但你没有得到的配对请求。

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

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

来源:CoreBluetooth _concepts iOS7预览

还检查了WWDC 2012 advanced core bluetooth video在28分钟后,他们解释配对的概念。

+1

以下是视频的链接:http://adcdownload.apple.com//videos/wwdc_2012__hd/session_705__advanced_core_bluetooth.mov – ThomasW