2013-08-25 9 views
5

Używam iOS 6 Corebluetooth z usługą Alert Alert.Usługi iOS Corebluetooth nigdy nie zostały wykryte, ale są widoczne w reklamie Data delegowania metody

Usługi nie pojawiają się na urządzeniach peryferyjnych z jakiegoś powodu, chociaż metoda advertisingData in delegate wygląda poprawnie.

Oto metoda delegat:

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


} 

Oto co dziennika wygląda następująco:

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 

Sposób delegat do wykrywania usług:

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

dzienniku od ta metoda:

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

Są to dwa identyfikatory UUID dla BLE GATT i GAP. Usługi dla urządzeń peryferyjnych widoczne w reklamie Dane nigdy się nie wyświetlają. Co ja robię źle?

Odpowiedz

2

Odnośnie kodu: czy wykonujesz wywołanie zwrotne peripheral:didDiscoverServices: i jak sobie z tym radzisz? W najprostszym przypadku powinno to być coś takiego:

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

Ponadto, co jest w danych reklamowych i jakie jest to dwie różne historie. Obwodowego można reklamować żadnych usług, nawet tych, które nie są przewidziane mogę łatwo rozpocząć reklamę w iOS tak:

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

bez dodawania żadnego z tych usług.

Proponuję spróbować najpierw odkryć urządzenie peryferyjne za pomocą działającej aplikacji, takiej jak BLEUtility lub BLExplr, i sprawdzić, czy urządzenie peryferyjne rzeczywiście dostarcza te usługi.

+0

Dziękuję, faktycznie wdrażam urządzenie peryferyjne: didDiscoverServices: Kopiowałem-wkleiłem zły kod. Będę edytować pytanie. Spróbuję BLEUtility i BLExplr i wrócę. Urządzenie peryferyjne to urządzenie inne niż iOS (jeśli to ma znaczenie). – Stpn

+0

Poinformuj mnie o wynikach testów i dodaj kod, w którym wywołasz metodę "discoverServices:" na urządzeniu peryferyjnym. – allprog

+0

Dodano kod do pytania (zamiast didDiscoverCharaceristisc :) i sprawdzono BLEUtility. Urządzenie rzeczywiście reklamuje jedną usługę, ale zapewnia tylko te najbardziej podstawowe. Myślę, że rozwiązanie, które wymagałoby nurkowania w kod urządzenia C? – Stpn

Powiązane problemy