Los services iOS Corebluetooth nunca se descubrieron, pero son visibles en la publicidadDatos del método delegado

Estoy usando iOS 6 Corebluetooth con el service de notificación de alertas.

Los services no aparecen en el periférico por alguna razón, aunque el método publicitarioData in delegate parezca correcto.

Aquí está el método delegado:

(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]; } } 

Aquí es cómo se ve el logging:

 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 

El método delegado para el descubrimiento del service:

 - (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]; } } 

El logging de ese método:

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

Estos son dos UUID para BLE GATT y GAP. Los services para el periférico que se ven en advertisementData nunca aparecen. ¿Qué estoy haciendo mal?

Con respecto a su código: ¿implementa el peripheral:didDiscoverServices: callback y cómo lo maneja? En el caso más simple debería ser algo como esto:

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

Además, lo que está en los datos publicitarios y lo que se proporciona son dos historias diferentes. El periférico puede anunciar cualquier service, incluso aquellos que no se proporcionan. Puedo iniciar fácilmente anuncios en iOS así:

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

Sin agregar ninguno de estos services.

Le sugiero que intente descubrir el periférico primero con una aplicación que funcione, como la BLEUtility o BLExplr y vea si el periférico realmente proporciona esos services.