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

9

我有两个应用程序,一个作为外围设备(在运行iOS 7的iPad第四代上),另一个作为中央设备(在运行iOS 7的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];
        }
    }
 }

我收到了一个回调,指示错误:

Error Domain=CBATTErrorDomain Code=14 "不太可能的错误。"

但这并不是很有帮助。

有人能发现问题或提供任何解决方案吗?

谢谢,Rich


通过谷歌搜索此问题,似乎我不是唯一遇到这个问题的人。我还发现蓝牙LE堆栈非常不稳定,需要经常重新启动设备来解决问题。此外,如果我在iPhone 5c上运行外围设备,则无法连接到它,只有在iPad上运行外围设备时才能连接。我快速得出结论,Core Bluetooth库中的外围设备支持存在问题。 - Richard Baxter
你是否找到更多信息和/或解决方案?我也遇到了可怕的“不太可能的错误”。(它似乎并不那么不太可能。8) ) - AndrewCr
3个回答

0
尝试在收到以下回调之前不要添加您的服务:
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral

然后您需要检查外围设备的状态,以获取CBPeripheralManagerStatePoweredOn。在外围设备未开启电源时添加服务是无效的。


0

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

  1. 只有在收到 peripheralManager:didAddService:error: 回调后才应该开始广告。
  2. 您能否附上相应的设备控制台日志?(使用组织者->电话->控制台)

大家好,Allprog,是的,我很快尝试了你的建议,但我仍然收到相同的错误。不幸的是,在我附加日志之前,我需要对应用程序的日志输出进行一些修改,因为这是一个受保密协议约束的项目,我需要确保日志中没有机密信息 - 我将尽力在本周晚些时候回到办公室后发布日志。感谢您的帮助。 - Richard Baxter

0

当我在外设端误输入委托时,我也遇到了同样的错误,请仔细检查已实现的委托签名。

例如,我写成了

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

替代

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

(在第一个版本中看到了缺失的“s”)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接