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?
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
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
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