核心蓝牙 - 中心无法写入外设

时间:2013-11-09 09:34:00

标签: ios bluetooth-lowenergy core-bluetooth

我有两个应用程序,一个作为外围设备(在运行iOS 7的iPad第四代)和一个作为中心(运行iOS7的iPhone 5c)。

我希望在外围设备中有一个可写特性,即中心写入少量字节(大约4个字节但可能因执行而异)。

我按如下方式配置外围设备:

-(void)startPeripheral
{
    CBMutableService *service = [[CBMutableService alloc]initWithType:[CBUUID UUIDWithString:kMyServiceUUID] primary:YES];
    CBMutableCharacteristic *ch = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:kMyWriteUUID] properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable];
    service.characteristics = @[ch];

    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@[[CBUUID UUIDWithString:kMyServiceUUID]], CBAdvertisementDataServiceUUIDsKey, @"My Peripheral", CBAdvertisementDataLocalNameKey, nil];

    [self.peripheralManager addService:service];
    [self.peripheralManager startAdvertising:dict];

    NSLog(@"Service = %@",service);
}

这一切似乎首先起作用,外围设备宣传服务,我的中心可以扫描,查找,发现服务和特征,并找到它感兴趣的特性。当我尝试写入特征时出现问题。

在中央,我有以下方法:

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    NSLog(@"Service/Characteristics = %@",service.characteristics);
    for(CBCharacteristic *ch in service.characteristics)
    {
        NSLog(@"Characteristic properties = %x",ch.properties);
        NSLog(@"Characterisctic = %@",ch.UUID);
        if([ch.UUID isEqual:[CBUUID UUIDWithString:kMyWriteUUID]])
        {
            // We've found our write characteristic
            NSLog(@"Writing data to characteristic %@",ch.UUID);
            NSData *data = [NSData dataWithBytes:(Byte[]){1,2,3,4} length:4];
            [peripheral writeValue:data forCharacteristic:ch type:CBCharacteristicWriteWithResponse];
        }
    }
 }

我收到didWriteValueForCharacteristic的回调,表示错误:

错误域= CBATTErrorDomain代码= 14“不太可能出错。”

哪个不是很有帮助。

任何人都可以发现并发布或建议任何解决方案吗?

谢谢,Rich

3 个答案:

答案 0 :(得分:0)

对我来说,错误是什么并不明显,但是:

  1. 您应该在收到peripheralManager:didAddService:error:回拨后才开始投放广告。
  2. 您可以附加相应的设备控制台日志吗? (使用Organizer-> Phone->控制台)

答案 1 :(得分:0)

在获得以下回调之前,请尝试不添加您的服务:

- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral

然后检查CBPeripheralManagerStatePoweredOn的外围设备状态。在外围设备未通电的情况下添加服务无效。

答案 2 :(得分:0)

当我在外围设备上错过键入委托时,我得到了同样的错误,仔细检查已实现的委托签名

f.e。我已经写过

-(void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequest:(NSArray *)requests

而不是

-(void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests

(请参阅第一版中缺少的'

相关问题