2013-10-02 11 views
8

Ho un problema di aggiornamento del mio codice CoreBluetooth da iOS 6 a iOS 7. Posso eseguire la scansione di Periferiche e effettuare connessioni, tuttavia, non sono in grado di riconnettere una Periferiche utilizzando i nuovi metodi CoreBluetooth offerti all'interno di iOS 7. Ecco uno sguardo a come sto cercando di realizzare la riconnessione:iOS 7 CoreBluetooth retrievePeripheralsWithIdentificanti non Recupero

- (void)retrievePeripheral:(NSString *)uuidString 
{ 

NSUUID *nsUUID = [[NSUUID UUID] initWithUUIDString:uuidString]; 

if(nsUUID) 
{   
    NSArray *peripheralArray = [centralManager retrievePeripheralsWithIdentifiers:@[nsUUID]]; 

    // Check for known Peripherals 
    if([peripheralArray count] > 0) 
    { 
     for(CBPeripheral *peripheral in peripheralArray) 
     { 
      NSLog(@"Connecting to Peripheral - %@", peripheral); 

      [self connectPeripheral:peripheral]; 
     } 
    } 
    // There are no known Peripherals so we check for connected Peripherals if any 
    else 
    { 
     CBUUID *cbUUID = [CBUUID UUIDWithNSUUID:nsUUID]; 

     NSArray *connectedPeripheralArray = [centralManager retrieveConnectedPeripheralsWithServices:@[cbUUID]]; 

     // If there are connected Peripherals 
     if([connectedPeripheralArray count] > 0) 
     { 
      for(CBPeripheral *peripheral in connectedPeripheralArray) 
      { 
       NSLog(@"Connecting to Peripheral - %@", peripheral); 

       [self connectPeripheral:peripheral]; 
      } 
     } 
     // Else there are no available Peripherals 
     else 
     { 
      // No Dice! 
      NSLog(@"There are no available Peripherals"); 
     } 
    } 
} 

} 

Dove uuidString è salvato periferico UUID.

Mi trovo sempre sull'istruzione NSLog dove non sono disponibili periferiche. Suppongo che mi manchi qualcosa di molto ovvio e qualcuno può indicarmi la giusta direzione.

Inoltre, ho letto altri post relativi ai problemi di aggiornamento di iOS 7 con CoreBluetooth e ho provato a resettare il dispositivo BLE e il dispositivo iOS, ma senza alcun risultato.

Grazie in anticipo! udibile

risposta

5

Si è scoperto che il mio errore riguardava il modo in cui stavo convertendo l'identificatore del Peripheral in un formato NSString prima di inviare un messaggio al mio metodo retrievePeripheral.

questo era il modo corretto:

NSString *uuidString = [NSString stringWithFormat:@"%@", CFUUIDCreateString(NULL, (__bridge CFUUIDRef)([peripheral identifier]))]; 

questo era il modo corretto (che ha lavorato nel mio scenario):

NSString *uuidString = [NSString stringWithFormat:@"%@", [[peripheral identifier] UUIDString]]; 

in base alla documentazione di Apple Classe NSUUID non è verde bridged con CoreFoundation's CFUUIDRef come descritto di seguito:

Nota:La classenon è disponibile in parallelo con CoreFoundation CFUUIDRef. Utilizzare le stringhe UUID per convertire tra CFUUID e NSUUID, se necessario. Due oggetti NSUUID non possono essere paragonati al valore del puntatore (come CFUUIDRef); utilizzare isEqual: per confrontare due istanze NSUUID.

Per quelli di voi che come una rappresentazione visiva di ciò che questo significa, come faccio io qui è un esempio :)

Le informazioni Peripheral stampata all'interno della console:

<CBPeripheral: 0x14699430 identifier = DD2468AB-1865-B926-7FA4-AE3755D479D8, Name = "IDYNAMO EMV-A27F", state = disconnected> 

Il modo errato di convertire l'identificatore del periferico in un NSString rendimenti:

1865B926-7FA4-AE37-55D4-79D800000000 

T ha corretto modo di convertire l'identificatore del periferico in un NSString rendimenti:

DD2468AB-1865-B926-7FA4-AE3755D479D8 

Spero che questo aiuta qualcuno sul loro cammino BLE e non esitate a correggermi se sbaglio in alcun modo come sto ancora imparando questa roba come bene.

Grazie!

udibile

+0

Mi chiedo se potete aiutarmi con il mio codice per convertire in retrievePeripheralsWithIdentifiers - (void) centralManager: (CBCentralManager *) centrale didDiscoverPeripheral: (CBPeripheral *) aPeripheral advertisementData: (NSDictionary *) advertisementData RSSI: (NSNumber *) RSSI { NSMutableArray * peripherals = [self mutableArrayValueForKey: @ "heartRateMonitors"]; se: [periferiche addObject: aPeripheral] ([self.heartRateMonitors containsObject aPeripheral]!); [retrievePeripherals self.manager: [NSArray arrayWithObject: (id) aPeripheral.UUID]]; } –

1

Questo è un vecchio post, ma per gli altri in cerca di risposte.

La seconda/successiva chiamata a retrieve ConnectedPeripherals richiede effettivamente l'UUID di servizio (tipo CBUUID), non l'NSUUID connesso per la prima volta a iOS. Ciò che viene recuperato è un periferiche lista och che ha quel UUID del servizio implementato. Per esempio, se si dispone di un certo numero di bracciali di attività e tutti hanno il servizio di battito cardiaco necessario tra le altre cose, verrà retrieveing ​​tutte e 3 le periferiche. Anche in prima convocazione alle periferiche noto, è necessario memorizzare il NSUUID tra l'applicazione inizia dal momento che ID è stato creato da iOS in un primo momento la connessione. Speranza che aiuta

Problemi correlati