在iOS上的BLE上写入数据时出现未知错误

Pra*_*ari 10 iphone objective-c ios core-bluetooth bluetooth-lowenergy

我正在尝试开发iOS应用程序,它正在检测BLE设备并需要调用写入命令.我可以成功连接到BLE设备并发现其服务和特性.但是在连接的外围设备上写入数据时出现未知错误.以下是我写的代码:

发现特点:

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
  NSArray *characteristics = [service characteristics];

  if (peripheral != self.peripheral) {
    NSLog(@"Wrong Peripheral.\n");
    return ;
  }

  if (error != nil) {
    NSLog(@"Error %@\n", error);
    return ;
  }

  for (CBCharacteristic *characteristic in characteristics) {

    if ([[characteristic UUID] isEqual:RWT_POSITION_CHAR_UUID]) {
      self.positionCharacteristic = characteristic;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是在BLE设备上写入数据的功能

- (void)writeCommand{

    // See if characteristic has been discovered before writing to it
    if (!self.positionCharacteristic) {
        return;
    }
    NSString *cmd1=@"CQ+WHORU\r";

    NSData *dataToWrite = [cmd1 dataUsingEncoding:NSUTF8StringEncoding];

    CBCharacteristic *chr = self.positionCharacteristic;
    NSLog(@"%@,%lu...%@",chr.UUID,chr.properties,chr);

    NSInteger dataSize = [[NSByteCountFormatter stringFromByteCount:dataToWrite.length countStyle:NSByteCountFormatterCountStyleFile] integerValue];
    if (dataSize > 130) {
        NSLog(@"Cannot send more than 130 bytes");
    }
    else
    {
        [self.peripheral writeValue:dataToWrite forCharacteristic:self.positionCharacteristic type:CBCharacteristicWriteWithResponse];
    }
}

- (void)peripheral:(CBPeripheral *)peripheral
didWriteValueForCharacteristic:(CBCharacteristic *)characteristic
         error:(NSError *)error
{
    if (error)
    {
        NSLog(@"Error writing characteristic value: %@", [error localizedDescription]);
    }
    else
    {
        NSLog(@"Successfully writing characteristic value");
    }
}
Run Code Online (Sandbox Code Playgroud)

在"didWriteValueForCharacteristic"委托方法中我得到以下错误:

写入特征值时出错:未知错误.

可能是这个错误的原因是什么?

另外如果我试图定义在BLE设备上发送数据的特性,例如:

CBMutableCharacteristic *writeChar = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:@"ffe1"] properties:CBCharacteristicPropertyWriteWithoutResponse|CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsWriteable|CBAttributePermissionsReadable];
int8_t cmd = *[cmd1 UTF8String];

NSData *data = [NSData dataWithBytes:&cmd length:sizeof(cmd)];

NSInteger dataSize = [[NSByteCountFormatter stringFromByteCount:dataToWrite.length countStyle:NSByteCountFormatterCountStyleFile] integerValue];
if (dataSize > 130) {
    NSLog(@"Cannot send more than 130 bytes");
}
else
{
    [self.peripheral writeValue:dataToWrite forCharacteristic:writeChar type:CBCharacteristicWriteWithResponse];
    //        [self.peripheral writeValue:dataToWrite forCharacteristic:writeChar type:CBCharacteristicWriteWithResponse];
}
Run Code Online (Sandbox Code Playgroud)

然后我收到这个错误:

**CoreBluetooth[WARNING] CBMutableCharacteristic: 0x1552a270 UUID = Unknown (<ffe1>),Value = (null), Properties = 0x14, Permissions = 0x3, Descriptors = (null), SubscribedCentrals = (
)> is not a valid characteristic for peripheral <CBPeripheral: 0x15549930 identifier = FC71890D-9F71-5E16-086D-D491E1EF7599, Name = " DEMOBLE1", state = connected**
Run Code Online (Sandbox Code Playgroud)

Mor*_*ast 9

当您编写数据时,您正在请求响应(CBCharacteristicWriteWithResponse).

如果您要写入的特性没有CBCharacteristicPropertyWrite设置属性,则写入将失败,但仅支持不带response(CBCharacteristicPropertyWriteWithoutResponse)的写入.

if ((self.positionCharacteristic.properties & CBCharacteristicPropertyWrite) == CBCharacteristicPropertyWrite) {
    // Responses are available, so write with response.
    [self.peripheral writeValue:dataToWrite forCharacteristic:self.positionCharacteristic type:CBCharacteristicWriteWithResponse];
}
else if ((self.positionCharacteristic.properties & CBCharacteristicPropertyWriteWithoutResponse) == CBCharacteristicPropertyWriteWithoutResponse) {
    // Responses are not available.
    // Write with response is going to fail, so write without response.
    [self.peripheral writeValue:dataToWrite forCharacteristic:self.positionCharacteristic type:CBCharacteristicWriteWithoutResponse];
}
Run Code Online (Sandbox Code Playgroud)