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);
}
InformationsquelleAutor Abhinav | 2013-07-24
Schreibe einen Kommentar