2013-07-31 93 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