2013-08-25 11 views
5

Sto utilizzando iOS 6 Corebluetooth con il servizio di notifica degli avvisi.Servizi iOS Corebluetooth mai rilevati, ma sono visibili in pubblicitàDati del metodo delegato

I servizi non vengono visualizzati in periferica per qualche motivo, anche se i dati della pubblicità in modo delegato sembrano corretti.

Ecco il metodo delegato:

(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 
{ 
    bool ourGuy = NO; 
    NSLog(@"DATA: %@", advertisementData); 

    NSArray *keys = [advertisementData allKeys]; 
    for (int i = 0; i < [keys count]; ++i) { 
     id key = [keys objectAtIndex: i]; 
     NSString *keyName = (NSString *) key; 
     NSObject *value = [advertisementData objectForKey: key]; 
     if ([value isKindOfClass: [NSArray class]]) { 

      printf(" key: %s\n", [keyName cStringUsingEncoding: NSUTF8StringEncoding]); 

      if ([keyName isEqualToString: @"kCBAdvDataServiceUUIDs"]){ 

       NSArray *values = (NSArray *) value; 
       for (int j = 0; j < [values count]; ++j) { 
        if ([[values objectAtIndex: j] isKindOfClass: [CBUUID class]]) { 
         CBUUID *uuid = [values objectAtIndex: j];       

         NSString *uuidString = [uuid representativeString]; 

         NSLog(@"FOUND SERVICE UUID %@", uuidString); 

         if ([uuidString isEqualToString:kalertNotificationServiceUUIDString]){ 

          NSLog(@"Connecting"); 

          if (![foundPeripherals containsObject:peripheral]) { 

           ourGuy = YES;         
          }        
         } 

        } else { 
         const char *valueString = [[value description] cStringUsingEncoding: NSUTF8StringEncoding]; 
         printf("  value(%d): %s\n", j, valueString); 
        } 
       } 

      } 
     } else { 
      const char *valueString = [[value description] cStringUsingEncoding: NSUTF8StringEncoding]; 
      printf(" key: %s, value: %s\n", [keyName cStringUsingEncoding: NSUTF8StringEncoding], valueString); 
     } 
    } 

    if (ourGuy){ 
     [foundPeripherals addObject:peripheral]; 
       peripheral.delegate = self; 
     [centralManager connectPeripheral:peripheral options:nil]; 
    } 


} 

Ecco quello che sembra il registro come:

2013-08-25 23:30:17.417 myControl[688:907] DATA: { 
    kCBAdvDataLocalName = myTEST; 
    kCBAdvDataServiceUUIDs =  (
     "Unknown (<1811>)", 
     "Unknown (<180f>)" 
    ); 
} 
    key: kCBAdvDataServiceUUIDs 


2013-08-25 23:30:17.419 myControl[688:907] FOUND SERVICE UUID 1811 
2013-08-25 23:30:17.421 myControl[688:907] Connecting 
2013-08-25 23:30:17.422 myControl[688:907] FOUND SERVICE UUID 180f 
    key: kCBAdvDataLocalName, value: myTEST 
    key: kCBAdvDataTxPowerLevel, value: -8 

Il metodo delegato per la scoperta di servizio:

- (void) peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{ 

    for (int i=0; i < peripheral.services.count; i++) { 
     CBService *s = [peripheral.services objectAtIndex:i]; 
     NSLog(@" UUUID %@", [s.UUID representativeString]); 
     //  [peripheral discoverCharacteristics:nil forService:s]; 
    } 
} 

Il registro da quel metodo:

2013-08-25 23:30:18.266 myControl[688:907] UUUID 1800 
2013-08-25 23:30:18.269 myControl[688:907] UUUID 1801 

Questi sono due UUID per BLE GATT e GAP. I servizi per la periferica che vengono visualizzati nella pubblicità non vengono mai visualizzati. Che cosa sto facendo di sbagliato?

risposta

2

Per quanto riguarda il codice: implementate il callback peripheral:didDiscoverServices: e come lo gestite? Nel caso più semplice dovrebbe essere qualcosa di simile:

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { 
    /* Find all characteristics for all discovered services */ 
    for (CBService *service in peripheral.services) 
    { 
    [peripheral discoverCharacteristics:nil forService:service]; 
    } 
} 

Inoltre, ciò che è nei dati pubblicità e quanto previsto sono due storie diverse. La periferica può pubblicizzare tutti i servizi, anche quelli che non sono forniti posso facilmente iniziare pubblicità in iOS come questo:

NSDictionary *data = @{CBAdvertisementDataServiceUUIDsKey: 
     @[[CBUUID UUIDWithString:@"180D"], [CBUUID UUIDWithString:@"FFBC"]]}; 
[peripheralManager startAdvertising:data]; 

Senza aggiungere uno di questi servizi.

Suggerisco di provare a scoprire la periferica prima con un'app funzionante, come BLEUtility o BLExplr e verificare se la periferica fornisce realmente tali servizi.

+0

Grazie, in realtà sto implementando la periferica: didDiscoverServices: ho copiato il codice errato. Modificherò la domanda. Proverò BLEUtility e BLExplr e tornerò. La periferica è periferica non iOS a proposito (se questo è importante). – Stpn

+0

Fammi sapere i risultati dei test e aggiungi il codice dove invochi il metodo 'discoverServices:' sulla periferica. – allprog

+0

Aggiunto il codice alla domanda (invece di didDiscoverCharaceristisc :) e controllato la BLEUtility. Il dispositivo pubblicizza effettivamente un servizio, ma fornisce solo quelli di base. Immagino che risolvere ciò richiederebbe l'immersione nel codice C del dispositivo? – Stpn

Problemi correlati