Ios 尝试订阅CBCharacteristic时不允许写入错误

Ios 尝试订阅CBCharacteristic时不允许写入错误,ios,objective-c,bluetooth,bluetooth-lowenergy,core-bluetooth,Ios,Objective C,Bluetooth,Bluetooth Lowenergy,Core Bluetooth,我正在开发一个与蓝牙LE设备通信的应用程序,所以我使用CoreBooth来实现这一点 我正在使用的外设公开了一个服务,它有两个特性:一个是串行端口FIFO特性,支持指示/通知/写入/写入无响应;以及支持写入的串行端口信用特性 从我的阅读中,我收集到我需要订阅的特性是FIFO特性,但是当我调用[\u connectedPeripheral setNotifyValue:yesforcharacteristic:characteristic]时我得到一个写入是不允许的错误 我检查了特征的属性,它具有

我正在开发一个与蓝牙LE设备通信的应用程序,所以我使用CoreBooth来实现这一点

我正在使用的外设公开了一个服务,它有两个特性:一个是串行端口FIFO特性,支持指示/通知/写入/写入无响应;以及支持写入的串行端口信用特性

从我的阅读中,我收集到我需要订阅的特性是FIFO特性,但是当我调用
[\u connectedPeripheral setNotifyValue:yesforcharacteristic:characteristic]时我得到一个
写入是不允许的
错误

我检查了特征的属性,它具有
读取
写入而不响应
通知
,以及
指示
属性

这是我第一次使用CoreBluetooth,我有点像一个蓝牙noob,所以这可能是我忽略了的东西,但如果有任何帮助,我将不胜感激

编辑:以下是代码:

#define SDL440S_SERVICE @"2456E1B9-26E2-8F83-E744-F34F01E9D701"
#define SDL440S_CHARACTERISTIC @"2456E1B9-26E2-8F83-E744-F34F01E9D703"

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    NSLog(@"Did connect %@", peripheral.name);
    // _connectedPeripheral is a property...
    if (_connectedPeripheral != peripheral) {
        _connectedPeripheral = peripheral;
    }
    _connectedPeripheral.delegate = self;
    [_connectedPeripheral discoverServices:@[[CBUUID UUIDWithString:SDL440S_SERVICE]]];
}

#pragma mark - <CBPeripheralManager>

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
    if (peripheral == _connectedPeripheral) {
        for (CBService *service in _connectedPeripheral.services) {
            if ([service.UUID.UUIDString isEqualToString:SDL440S_SERVICE]) {
                [_connectedPeripheral discoverCharacteristics:@[[CBUUID UUIDWithString:SDL440S_CHARACTERISTIC]] forService:service];
            }
        }
    }
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    for (CBCharacteristic *characteristic in service.characteristics) {
        if ([characteristic.UUID.UUIDString isEqualToString:SDL440S_CHARACTERISTIC]) {
            // Subsribe to characteristic
            [_connectedPeripheral setNotifyValue:YES forCharacteristic:characteristic];
        }
    }
}

// Getting values

- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
    if (error) {
        NSLog(@"Error changing note state for char: %@.\nError: %@", characteristic, error.localizedDescription);
    }
}
#定义SDL440S#U服务@“2456E1B9-26E2-8F83-E744-F34F01E9D701”
#定义SDL440S_特性@“2456E1B9-26E2-8F83-E744-F34F01E9D703”
-(无效)中央管理器:(CBCentralManager*)中央数据连接外围设备:(CBPeripheral*)外围设备
{
NSLog(@“Did connect%@”,peripheral.name);
//\u connectedPeripheral是一个属性。。。
如果(_connectedPeripheral!=外设){
_连接的外围设备=外围设备;
}
_connectedPeripheral.delegate=self;
[_connectedperipheraldiscoverservices:@[[CBUUID uuiddithstring:SDL440S_SERVICE]];
}
#布拉格标记-
-(无效)外围设备:(CBPeripheral*)外围设备DID发现服务:(N错误*)错误
{
如果(外围设备==\u连接的外围设备){
用于(CBService*服务在_connectedPeripheral.services中){
if([service.UUID.UUIDString IsequalString:SDL440S\u服务]){
[_connectedperipheraldiscovercharacteristics:@[[CBUUID uuid with string:SDL440S_characteristics]]用于服务:服务];
}
}
}
}
-(void)外围设备:(CBPeripheral*)外围设备DID发现特性服务:(CBService*)服务错误:(NSError*)错误
{
用于(CBCharacteristic*在用特性。特性){
if([characteristic.UUID.UUIDString IsequalString:SDL440S_characteristic]){
//归入特征
[_ConnectedPeripheralSetNotifyValue:YES for characteristic:characteristic];
}
}
}
//获取价值
-(void)外围设备:(CBPeripheral*)外围设备didUpdateNotificationStateForCharacteristic:(CBCharacteristic*)特征错误:(NSError*)错误
{
如果(错误){
NSLog(@“更改字符的注释状态时出错:%@。\n错误:%@”,特征,错误。localizedDescription);
}
}

供将来参考如果有人遇到此问题,这与设备的信用特性有关

我感兴趣的服务揭示了两个特征,一个是信用特征,一个是先进先出特征。(我理解信用特征是标准问题。)问题是,我必须将我想要接收的最大数据量写入信用特征,然后才能接收数据并将数据写入FIFO特征

即:


您是如何获得
特性的
?从
didiscovercharacteristics
delegate方法?准确地说。我发现我感兴趣的外围设备,然后发现我感兴趣的服务,然后服务的特性使用该特性的引用来订阅通知。我使用的是公司定义的协议,该协议使组件哪个委托方法向您提供错误消息?。关于写入的错误对于setNotify操作没有意义。这是
didUpdateNotificationStateForCharacteristic:错误:
CBPeripheralDelegate的委托:
-(void)peripheral:(CBPeripheral*)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic*)特征错误:(NSError*){if(error){NSLog(@“error changing note state for char:%@.\error:%@”,characteristic,error.localizedDescription);}}
您能对此进行扩展吗?我不明白这一点。我正在与暴露了两个特征的设备通信().FIFO特性是处理我感兴趣的数据的特性,但是,您必须通知设备(通过信用特性)你想开始交流。我能把我的代码发给你让你看一下吗?这太令人沮丧了,因为它有50%的时间都在工作!!!我想最好的办法是你打开一个新的so问题。把你的代码贴在那里,然后把这个问题的链接作为评论放在这里。我怎样才能确定是哪个特征你的先进先出?
unsigned char buf[1] = {/*relevant data here...*/};
NSData *data = [NSData dataWithBytes:buf length:1];
[peripheral writeValue:data forCharacteristic:creditCharacteristic type:CBCharacteristicWriteWithoutResponse];