使用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];
-
创造特色
self.writeableCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:CBUUIDWriteableCharacteristicCodeString] properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable];
-
将其添加到服务和PeripheralManager
CBMutableService *gameTransferService = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:CBUUIDServiceCodeString] primary:YES]; gameTransferService.characteristics = @[self.notifierCharacteristic, self.writeableCharacteristic]; [self.peripheralRoleManager addService:gameTransferService];
-
确保你已经连接到另一个设备
[self.service connectToPerephiral:self.dataSource[indexPath.row]];
-
在连接的外设中发现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]; } } } }
-
添加委托方法
- (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]; } } }