2013-07-31 5 views
10

В моем недавнем проекте мне нужно передать аппаратное обеспечение (Bluetooth Low energy). Я реализовал весь код методов делегатов. Я могу подключить оборудование и устройство, но я не получаю предупреждение о соединении (прилагается скриншот). Почему бы не попросить спаривания? Спасибо.iOS Core 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

Спасибо Bloodcount, пожалуйста, проверьте обновленный вопрос. – Mangesh

+0

Вы пытались использовать устройство iOS6? – Larme

ответ

16

Если я понимаю, что вы правы, вы можете написать значение успешно характеристическим, но вы не получите запрос на сопряжение.

Сопряжение осуществляется периферийным устройством. Это означает, что периферийное устройство должно отказаться от запроса записи или чтения вашего центрального элемента. Ваша центральная сторона получает отказ от «несанкционированной аутентификации», а затем пытается соединиться с периферийным устройством и показывая сообщение о спаривании, которое вы ожидаете. Все это делается с помощью базового Bluetooth автоматически. Единственное, что вам нужно сделать, это изменить параметры и разрешения в вашем периферии. Это образец яблока код, чтобы вызвать спаривание:

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

Смежные вопросы