使用CoreBluetooth(BLE)将数据从CentralManager发送到PeripheralManager

我有我的应用程序运行在两个iOS设备(都有6.1.4),其中一个设备作为中央和一个作为外设。

我已经成功地从外围设备到中心获得通知(设置通知的特征)。

然而,我想要从中央写入一个具有可写特性的价值,但总是失败。

peripheral:didWriteValueForCharacteristic:error:委托的方法立即被调用的地方的错误说明:

“一个或多个参数无效”

我一直在寻找networking的任何线索,但还没有拿出什么是错的。

这就是我如何在外围设置特性:

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

我看到,当我发现中央的特点,我的可写的特点是在那里。 我在那个时候储存了一个参考资料,以后我会在写我的价值时尝试使用。 我正在写的价值只是一个文本string,我转换为一个NSData像这样:

 NSString *payloadMessage = @"Hello"; NSData *payload = [payloadMessage dataUsingEncoding:NSUTF8StringEncoding]; [peripheral writeValue:payload forCharacteristic:<myCharacteristic> type:CBCharacteristicWriteWithResponse]; 

我能看到的唯一奇怪的是,我的特性的属性设置为138.它看起来既可写,也具有扩展的属性。 不知道为什么这是由CoreBluetooth框架自动添加。 不知道是否重要。

我试图发送的特性或数据似乎有些不对,但对于我的生活我无法弄清楚。 如果有人有任何build议或想法,我将不胜感激的帮助

我在Bluetooh-dev列表中收到了一个解决我的问题的答案。

我没有创build正确的权限我的特点。

这是我原来的:

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

这是应该的:

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

当我意外地在discoverCharacteristics:forService:中提供了一个string数组而不是CBUUID时,我得到了同样的错误。

不正确:

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

正确:

 [peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:NOTIFY_CHARACTERISTIC_UUID], [CBUUID UUIDWithString:WRITE_WO_RESPONSE_CHARACTERISTIC_UUID]] forService:service]; 
  1. 创造特色

     self.writeableCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:CBUUIDWriteableCharacteristicCodeString] properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable]; 
  2. 将其添加到服务和PeripheralManager

     CBMutableService *gameTransferService = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:CBUUIDServiceCodeString] primary:YES]; gameTransferService.characteristics = @[self.notifierCharacteristic, self.writeableCharacteristic]; [self.peripheralRoleManager addService:gameTransferService]; 
  3. 确保你已经连接到另一个设备

     [self.service connectToPerephiral:self.dataSource[indexPath.row]]; 
  4. 在连接的外设中发现u特性并写入数据

     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. 添加委托方法- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray<CBATTRequest *> *)requests并find你的特性

     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]; } } }