CoreBluetooth: Attempt to write to device

倖福魔咒の 提交于 2019-12-24 14:26:09

问题


I have a connected & paired up Bluetooth LE bracelet (Service ID: FF20), which have 2 characteristics:

  • 0xFF21 : Write without Response
  • 0xFF22 : Notify

Now I try to write data via CoreBluetooth Framework to 0xFF21 with the following code:

I defined 2 constants at header file:

#define TRANSFER_SERVICE_UUID @"FF20"
#define TRANSFER_SERVICE_CHARACTERISTIC_UUID @"FF21"

.m

- (void)viewDidLoad {
    [super viewDidLoad];
    _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    if (central.state != CBCentralManagerStatePoweredOn) {
        return;
    }

    if (central.state == CBCentralManagerStatePoweredOn) {
        NSArray* connectedDevices = [_centralManager retrieveConnectedPeripheralsWithServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]];
        for (CBPeripheral *peripheral in connectedDevices) {
            NSLog(@"Device Found. CBPeripheral = %@", peripheral);
            peripheral.delegate = self;
            if(peripheral.services.count == 0) {
                NSLog(@"No service found");
            }
            for (CBService *service in peripheral.services) {
                if(service.characteristics != nil) {
                    for (CBCharacteristic *characteristic in service.characteristics) {
                        if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]]) {
                            // check notifying ?
                            NSData *data = [@"Testing" dataUsingEncoding:NSUTF8StringEncoding];
                            [peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
                        } else {
                            NSLog(@"Specific Characteristic Not found");
                        }
                    }
                } else {
                    NSLog(@"Characteristic is NULL");
                }
            }
        }
    }
}

The log appears:

Device Found. CBPeripheral = <CBPeripheral: 0x1740f5080, identifier = 4EFF694C-017A-536F-9301-2EB2CC316CBE, name = Bracelet-0366, state = disconnected>

No service found

What did I miss?


回答1:


You need to issue a connect to the discovered peripheral and get a call to your didConnectPeripheral delegate method before you can issue read/write requests.

When you reach the poweredOn state you should issue a scanForDevicesWithServices call, wait for the call back to your delegate, then connect, discover the service and characteristics, then you can issue a write.

-(void) centralManagerDidUpdateState:(CBCentralManager *)central {
    switch (central.state) {
        case CBCentralManagerStatePoweredOn:
            [central scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]] options:nil];
            break;
    }
}

-(void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
    NSLog(@"Discovered peripheral %@ (%@)",peripheral.name,peripheral.identifier.UUIDString);

    if (self.connectedPeripheral == nil) {
        [central connectPeripheral:peripheral options:nil];
    }
}

-(void) centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
    self.connectedPeripheral=peripheral;
    NSLog(@"Connected to %@(%@)",peripheral.name,peripheral.identifier.UUIDString);
    peripheral.delegate=self;
    [peripheral discoverServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]];
}

-(void) peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
    for (CBService *service in peripheral.services) {
        NSLog(@"Discovered service %@",service.description);
        [peripheral discoverCharacteristics:nil forService:service];
    }
}

-(void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
    for (CBCharacteristic *characteristic in service.characteristics ) {
        NSLog(@"Discovered characteristic %@(%@)",characteristic.description,characteristic.UUID.UUIDString);
        if ([characteristic.UUID.UUIDString isEqualToString:TRANSFER_SERVICE_CHARACTERISTIC_UUID) {
            NSData *data = [@"Testing" dataUsingEncoding:NSUTF8StringEncoding];
            [peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse];
        }
    }
}

Note, that from your previous question the characteristic only supports write without response, so you can't use CBCharacteristicWriteWithResponse



来源:https://stackoverflow.com/questions/30480928/corebluetooth-attempt-to-write-to-device

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!