Send Data from CentralManager to PeripheralManager using CoreBluetooth (BLE)

安稳与你 提交于 2019-12-05 20:49:52
mobbe

I did receive an answer in the Bluetooh-dev list that solved my problem.

I didn't create my characteristic with the right permissions.

This is what I originally had:

[[CBMutableCharacteristic alloc] initWithType:<CBUUID> properties:CBCharacteristicPropertyWrite value:nil permissions:0];

This is what it should be:

[[CBMutableCharacteristic alloc] initWithType:<CBUUID> properties:CBCharacteristicPropertyWrite value:nil permissions: **CBAttributePermissionsWriteable**];  

I got the same error when I accidentally provided an array of strings instead of CBUUIDs in discoverCharacteristics:forService:.

Incorrect:

[peripheral discoverCharacteristics:@[NOTIFY_CHARACTERISTIC_UUID, WRITE_WO_RESPONSE_CHARACTERISTIC_UUID]
                         forService:service];

Correct:

[peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:NOTIFY_CHARACTERISTIC_UUID],
                                      [CBUUID UUIDWithString:WRITE_WO_RESPONSE_CHARACTERISTIC_UUID]]
                         forService:service]; 
  1. Create characteristic

    self.writeableCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:CBUUIDWriteableCharacteristicCodeString] properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable];
    
  2. Add it to service and to PeripheralManager

    CBMutableService *gameTransferService = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:CBUUIDServiceCodeString] primary:YES];
    gameTransferService.characteristics = @[self.notifierCharacteristic, self.writeableCharacteristic];
    [self.peripheralRoleManager addService:gameTransferService];
    
  3. Make sure u are connected to another device

    [self.service connectToPerephiral:self.dataSource[indexPath.row]];
    
  4. Found u characteristic in connected peripheral and write data

    for(CBService *service in self.discoveredPeripheral.services) {
            if([service.UUID isEqual:[CBUUID UUIDWithString:<CBUUIDServiceCodeString>]]) {
                for(CBCharacteristic *charac in service.characteristics) {
                    if([charac.UUID isEqual:[CBUUID UUIDWithString:<CBUUIDWriteableCharacteristicCodeString>]]) {
                        [self.discoveredPeripheral writeValue:data forCharacteristic:charac type:CBCharacteristicWriteWithResponse];
                }
            }
        }
    }
    
  5. Add delegate method - (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray<CBATTRequest *> *)requests and found u'r characteristic like

    for (CBATTRequest *request in requests) {
        if ([request.characteristic.UUID isEqual:[CBUUID UUIDWithString:CBUUIDNotifierCharacteristicCodeString]]) {
    #ifdef DEBUG
            NSString *dataString = [[NSString alloc] initWithData:request.value encoding:NSUTF8StringEncoding];
            NSLog(@"Received from manager - %@", dataString);
    #endif
            if (self.delegate && [self.delegate respondsToSelector:@selector(BLEServiceDidReceiveData:peripheral:service:)]) {
                [self.delegate BLEServiceDidReceiveData:request.value peripheral:nil service:self];
            }
        }
    }
    
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!