2013-07-31 5 views
10

最近のプロジェクトでは、ハードウェア(Bluetooth Low energy)を通信する必要があります。すべてのデリゲートメソッドコードを実装しました。私はハードウェアとデバイスを接続することができますが、私はペアリングアラートを取得していません(添付スクリーンショット)。なぜペアリングを求めているのですか?ありがとうございました。iOSコアBluetoothペアを要求していません

#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

ありがとうございます、更新された質問を確認してください。 – Mangesh

+0

iOS6デバイスで試しましたか? – Larme

答えて

16

私は右のあなたを理解していれば、あなたは特性に正常に値を書き込むことができますが、ペアリング要求を得ることはありません。

周辺機器によってトリガーされます。つまり、周辺機器は、あなたの中心的な特性の書き込み要求または読み出し要求を拒否しなければなりません。あなたの中央は拒否された「不正な認証」を取得し、周辺機器とペア設定を試み、あなたが待っているペア設定のアラートポップアップを表示します。これはすべてコアのBluetoothによって自動的に行われます。必要なのは、周辺機器の特性オプションと権限を変更するだけです。これは、ペアリングをトリガするリンゴのサンプルコードです:

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

ソース:CoreBluetooth _concepts iOS7プレビュー

また、彼らはペアリングの概念を説明する28分でWWDC 2012 advanced core bluetooth videoをチェックしてください。

+1

ビデオへのリンクは次のとおりです。http://adcdownload.apple.com//videos/wwdc_2012__hd/session_705__advanced_core_bluetooth.mov – ThomasW

関連する問題