CoreBlueTooth: Immer Fehler, auch wenn Daten geschrieben, in die beschreibbaren Merkmale
Bin ich mit dem CoreBlueTooth framework zu schreiben, in einem der beschreibbaren Merkmale der Peripherie. Ich bin der Implementierung des "didWriteValueForCharacteristic:Fehler:" Stellvertretung in der zentrale, die immer wiederkehrenden mir folgende Fehlermeldung. Wenn ich die empfangenen Daten auf meinem peripheren.
Error Domain=CBErrorDomain Code=0 "Unknown error." UserInfo=0x166762e0 {NSLocalizedDescription=Unknown error.}
In meinem code meines selbst.Daten ist ein NSDictionary mit 3 Schlüsseln und Werten.
//Central
- (void)centralManagerDidUpdateState:(CBCentralManager *)iCentral {
if (iCentral.state != CBCentralManagerStatePoweredOn) {
return;
}
[self.centralManager scanForPeripheralsWithServices:self.peripheralServices options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)iPeripheral advertisementData:(NSDictionary *)iAdvertisementData RSSI:(NSNumber *)iRSSI {
if (self.discoveredPeripheral != iPeripheral) {
//Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it
self.discoveredPeripheral = iPeripheral;
//Connect to the discovered peripheral
[self.centralManager connectPeripheral:iPeripheral options:nil];
}
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)iPeripheral advertisementData:(NSDictionary *)iAdvertisementData RSSI:(NSNumber *)iRSSI {
if (self.discoveredPeripheral != iPeripheral) {
//Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it
self.discoveredPeripheral = iPeripheral;
//Connect to the discovered peripheral
[self.centralManager connectPeripheral:iPeripheral options:nil];
}
}
//We've connected to the peripheral, now we need to discover the services and characteristics to find the 'writeable' characteristic.
- (void)centralManager:(CBCentralManager *)iCentral didConnectPeripheral:(CBPeripheral *)iPeripheral {
//Stop scanning
[self.centralManager stopScan];
//Make sure we get the discovery callbacks
iPeripheral.delegate = self;
//Search only for services that match our UUID
[iPeripheral discoverServices:self.peripheralServices];
}
- (void)peripheral:(CBPeripheral *)iPeripheral didDiscoverServices:(NSError *)iError {
if (iError) {
[self cleanup];
return;
}
//Loop through the newly filled peripheral.services array, just in case there's more than one.
for (CBService *service in iPeripheral.services) {
[iPeripheral discoverCharacteristics:@[self.writeableCharactersticsUUID] forService:service];
}
}
//Write the data into peripheral's characterstics
- (void)peripheral:(CBPeripheral *)iPeripheral didDiscoverCharacteristicsForService:(CBService *)iService error:(NSError *)iError {
if (iError) {
[self cleanup];
return;
}
//Find out the writable characterstics
for (CBCharacteristic *characteristic in iService.characteristics) {
if ([characteristic.UUID isEqual:self.writeableCharactersticsUUID]) {
NSData *dataToWrite = [NSJSONSerialization dataWithJSONObject:self.data options:0 error:nil];
NSInteger dataSize = [[NSByteCountFormatter stringFromByteCount:dataToWrite.length countStyle:NSByteCountFormatterCountStyleFile] integerValue];
if (dataSize > 130) {
NSLog(@"Cannot send more than 130 bytes");
return;
}
[self.discoveredPeripheral writeValue:dataToWrite forCharacteristic:self.centralWriteableCharacteristic type:CBCharacteristicWriteWithResponse];
break;
}
}
}
- (void)peripheral:(CBPeripheral *)iPeripheral didWriteValueForCharacteristic:(CBCharacteristic *)iCharacteristic error:(NSError *)iError {
NSLog(@"Error = %@", iError);
}
- (void)cleanup {
//Don't do anything if we're not connected
if (self.discoveredPeripheral.state != CBPeripheralStateConnected) {
return;
}
//If we've got this far, we're connected, but we're not subscribed, so we just disconnect
[self.centralManager cancelPeripheralConnection:self.discoveredPeripheral];
}
//Peripheral
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)iPeripheral {
if (iPeripheral.state != CBPeripheralManagerStatePoweredOn) {
return;
}
CBMutableCharacteristic *characteristic = [[CBMutableCharacteristic alloc] initWithType:iCID properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable];
CBMutableService *writableService = [[CBMutableService alloc] initWithType:iServiceId primary:YES];
writableService.characteristics = @[characteristic];
//[self.peripheralManager removeAllServices];
[self.peripheralManager addService:writableService];
[self.peripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey : @[iServiceId]}];
}
- (void)peripheralManager:(CBPeripheralManager *)iPeripheral didReceiveWriteRequests:(NSArray *)iRequests {
CBATTRequest *aRequest = iRequests[0];
NSData *aData = aRequest.value;
NSDictionary *aResponse = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:aData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"Received Data = %@", aResponse);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe es herausgefunden. Das Problem war mit den Eigenschaften geben. Statt "CBCharacteristicWriteWithResponse" ich "CBCharacteristicWriteWithoutResponse" und es hat funktioniert.
Habe ich diese nach dem Lesen dieser:
writeValue forCharacteristic writeType, diese Funktion ist die wichtigste Funktion für das schreiben einer Eigenschaft auf einem Gerät. die writeType Eigenschaft ist entweder zu schreiben, auf die keine Reaktion oder schreiben mit response. Beim schreiben mit der Reaktion verwendet wird, werden alle Schreibvorgänge auf die peripheren zwischengespeichert werden, während das iOS-Gerät wartet auf den Empfang der Antwort " ok " und der Rückruf. Wenn schreiben keine Reaktion verwendet wird, werden die Daten nicht zwischengespeichert werden. Dies ist wichtig, wenn Sie Dinge, die brauchen niedrige Latenz, wie ein RC Auto oder Hubschrauber etc. bei der Verwendung von schreiben, mit der Antwort, das iOS-Gerät kann irgendwann zurückzubleiben, die das nicht machen, tolle Antwort ... Für jedes schreiben die didWriteCharacteristic callback wird aufgerufen.
didReceiveWriteRequests
Methode der PeripheralManager. bin ich richtig ?Aufnahme dieses für die Nachwelt: man MUSS reagieren, um zu verhindern, dass die Fehler:
Verlassen Sie diese hier für andere Leute, aber die OP ' s Antwort ist nicht korrekt.
Den Fehler, das wurde hier gemacht ist, dass er nicht aktualisieren Merkmal in dieser Funktion:
Da keine Eigenschaft, die aktualisiert werden, das OS meint etwas schief ging und ein Fehler generiert.
Dieser code ist eigentlich so eingerichtet, dass das Merkmal beschreibbar mit einer Antwort, die Enumeration, die angibt, keine Antwort ist:
Hoffe, dies hilft anderen Menschen, die stolpern auf dieser.