2013-09-06 3 views
1

Je dois me reconnecter périodiquement à un périphérique, mais j'essaie de recréer la connexion. D'abord, mes balayages centraux pour l'UUID des périphériques, puis il se connecte, puis il stocke le périphérique.UUID dans une variable CFUUIDRef, puis se déconnecte. Ensuite, pour se reconnecter, il récupère l'UUID de la variable, puis se bloque avec "EXC_BAD_ACCESS" quand il fait retreivePeripherals, ou un peu plus tard quand il fait le didRetrievePeripherals suivant.iOS Bluetooth retrievePeripherals provoque un plantage EXC_BAD_ACCESS

Peut-être que je ne stocke pas l'UUID correctement, mais je ne vois pas le bogue. Merci.

est ici le code ..........

-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral 
{ 
    /////////////////////// C E N T R A L C O N N E C T E D P E R I P H E R A L ////////////////////// 

    [self.centralManager stopScan]; 
    // Make sure we get the discovery callbacks 
    peripheral.delegate = pwr_tx_management; 

    switch(PWR_TX_manager.present_operation) 
    { 
     case POLLING_FOR_GENERIC_DVINEWAVE_DEVICE: 
      if(dbg_ev)  printf("1");   
      // Add new record for connection device to local system status database: 
      update_device_record(&packed_ad_record );  //  ==> device_record_index 
      // Store peripheral UUID for later, perioed re-connection for polling: 
      area_device_status[ device_area ][ device_record_index ].peripheral_UUID = peripheral.UUID; 
           // uses declaration: CFUUIDRef   peripheral_UUID; 

    // Disconnect:  !!! 
     [self.centralManager cancelPeripheralConnection: peripheral]; 
     break; 


     case OPERATION_SPECIFIC_POLLING: 
             NSLog(@"(7) didConnectPeripheral "); 
      if(dbg_ev)  printf("2");   
      // Proceed with reading device's status and updating local database: 
       [peripheral discoverServices:nil]; // request service, characteristics, then request device send its packed status record 

      break; 
     default: 
      break; 
    }  
} 





// Connects to device specificed by index next_dbase_record . 
void connect_specific_device(void) 
{ 
                 NSLog(@"(5) connect_specific_device - next_dbase_record = %d", next_dbase_record); 
    CFUUIDRef uuid = area_device_status[ device_area ][ next_dbase_record ].peripheral_UUID; 

    if(uuid) 
    { 
     // Request call to didRetrievePeripherals() with CBPeripheral: 
     [pwr_tx_management.centralManager retrievePeripherals:[NSArray arrayWithObject: (id)CFBridgingRelease(uuid)]];  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< crashes here with: Thread 1: EXC_BAD_ACCESS 
    } 
    else 
    { 
     NSLog(@" - missing area_device_status[][].peripheral_UUID "); 
    } 

} 



// Iniates connection to peripheral device specified before by retrievePeripherals. 
- (void) centralManager:(CBCentralManager *)central didRetrievePeripherals:(CBPeripheral *)peripheral 
{ 
    NSLog(@"(6) didRetrievePeripherals"); 
    [central connectPeripheral:peripheral options:nil]; 
} 

Répondre

1

La solution consistait à stocker l'UUID ASCII et à utiliser retrieveConnectedPeripherals ainsi que retreivePeripherals. Le stockage du pointeur a probablement échoué car les données n'ont pas été conservées. J'ai également implémenté la solution de tdevoy. didRetrievePeripherals est appelé mais sa liste de périphériques est vide, donc j'ai ajouté retrieveConnectedPeripherals et didRetrieveConnectedPeripherals, qui est appelé, et liste le périphérique avec lequel je me connecte avec succès. (Apple Prog guide pour ceux-ci est vague et manque de code exemple.)

+0

Donc je ne comprends pas vraiment ce que vous dites. retrieveConnectedPeriphs n'attrape que les périphériques auxquels vous êtes déjà connecté. Est-ce ce que vous vouliez faire? –

1

Permettez-moi de cette préface en disant que je vous écris ce billet depuis mon téléphone portable dans une voiture, alors excusez-moi pour les pauvres formatage . Je vais juste souligner le problème principal que je vois. Vous n'êtes pas adoptez la méthode déléguée droite:

Il est:

- (void) centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *) peripherals 

Non ceci:

- (void) centralManager:(CBCentralManager *)central didRetrievePeripherals:(CBPeripheral *)peripheral 

Aussi je ne vois pas pourquoi vous faites ce cfbridgingrelease. Il suffit de le transmettre en tant que @[(id)yourCfuuidref]. Vous n'avez pas créé ce cfuuid.

+0

J'ai copié didRetrievePeripherals: (périphérique CBPeripheral *) à partir de l'exemple des pommes temp_sensor. Cependant, le thermomètre de santé et le moniteur de fréquence cardiaque d'Apple utilisent le format NSArray. –

+0

Je pense que le problème est dans la façon dont je stocke l'UUID. Je suis préoccupé par le fait que je stocke un pointeur, qui en quelque sorte change, et devrait stocker l'UUID ASCII. –

+0

Ce que vous voulez faire est ceci: Stockez la version NSString de votre UUID dans NSUserDefaults. Lorsque vous en avez besoin, récupérez la chaîne UUID et utilisez CFUUIDCreateFromString pour créer votre CFUUIDRef. Puis passez ce CFUUIDRef dans retrievePeripherals –

Questions connexes