2013-08-25 5 views
5

Ich verwende iOS 6 Corebluetooth mit Benachrichtigungsdienst.iOS-Corebluetooth-Dienste wurden nie entdeckt, sind aber in advertisingData der Delegiertenmethode sichtbar

Die Dienste werden aus irgendeinem Grund nicht in peripheren angezeigt, obwohl die advertisingData in Delegate-Methode korrekt aussieht. Hier

ist die delegierte Methode:

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


} 

Hier ist, was das Protokoll wie folgt aussieht:

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 

Die delegierte Methode für den Dienst Entdeckung:

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

Das Protokoll aus diese Methode:

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

Dies sind zwei UUIDs für BLE GATT und GAP. Dienste für das Peripheriegerät, die in advertisementData angezeigt werden, werden nie angezeigt. Was mache ich falsch?

Antwort

2

In Bezug auf Ihren Code: Implementieren Sie den Rückruf peripheral:didDiscoverServices:, und wie gehen Sie damit um? Im einfachsten Fall sollte es so etwas wie dieses:

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

Darüber hinaus, was in den Werbedaten und was vorgesehen ist, sind zwei verschiedene Geschichten. Die periphere können alle Dienste an, auch solche, die nicht vorgesehen sind, ich leicht Werbung in iOS wie folgt beginnen:

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

Ohne einen dieser Dienste hinzufügen.

Ich schlage vor, Sie versuchen, das Peripheriegerät zuerst mit einer funktionierenden App zu entdecken, wie die BLEUtility oder BLExplr und sehen, ob das Peripheriegerät wirklich diese Dienste zur Verfügung stellt.

+0

Danke, eigentlich bin ich die Peripheriegeräte implementieren: didDiscoverServices: Ich kopierte falsch Code eingefügt. Ich werde die Frage bearbeiten. Ich werde die BLEUtility und BLExplr versuchen und werde zurückkommen. Das Peripheriegerät ist übrigens kein iOS-Gerät (wenn es darauf ankommt). – Stpn

+0

Lassen Sie mich wissen, die Ergebnisse der Tests und fügen Sie bitte den Code hinzu, wo Sie die 'discoverServices:' Methode auf dem Peripheriegerät aufrufen. – allprog

+0

Der Frage (statt didDiscoverCharaceriscisc :) wurde der Code hinzugefügt und die BLEUtility überprüft. Das Gerät wirbt tatsächlich für einen Dienst, bietet jedoch nur die grundlegendsten Dienste an. Ich denke, das würde das Eintauchen in den C-Code des Geräts erfordern. – Stpn

Verwandte Themen