2013-05-17 23 views
3

我的应用程序在两台iOS设备上运行(均为6.1.4),其中一台设备充当中央设备,另一台充当外设。使用CoreBluetooth(BLE)将数据从CentralManager发送到PeripheralManager

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

但是,我想从中央写入一个值到外设给特定的可写特性,但总是失败。

peripheral:didWriteValueForCharacteristic:error:委托的方法是直接调用其中的错误描述说:

“一个或多个参数无效”

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

这是我如何设置在周侧的特点:

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

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

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

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

似乎有什么特征或我试图发送的数据有问题,但对于我的生活我无法弄清楚。如果有人有任何建议或想法,我将不胜感激

回答

4

我确实收到了Bluetooh-dev列表中的答案,它解决了我的问题。

我没有用正确的权限创建我的特征。

这是我本来有:

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

这是它应该是什么:

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

我有同样的问题 - 谢谢你!非常误导性的错误信息!怪苹果。 –

3

我得到了同样的错误,当我无意中提供字符串而非CBUUIDs的discoverCharacteristics数组:forService :.

错误:

[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]; 
+0

我有这个问题。感谢您的解决方案。 –

0
  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. 确保u的连接到另一设备

    [self.service connectToPerephiral:self.dataSource[indexPath.row]]; 
    
  4. 实测值ü在所连接的外围特征和写入数据

    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,发现u'r特性像

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