核心蓝牙内的可写特性

Posted

技术标签:

【中文标题】核心蓝牙内的可写特性【英文标题】:Writable characteristic inside the core bluetooth 【发布时间】:2013-04-16 10:34:06 【问题描述】:

我正在使用核心蓝牙。我添加了在特性上写入/读取的功能。在此之前,我想检查特征是否可写。为此我使用了characteristic.properties 我的代码是:

    if (characteristic.properties==CBCharacteristicPropertyRead)
    
        [peripheralDevice readValueForCharacteristic:characteristic];
    
    else if(characteristic.properties==CBCharacteristicPropertyWrite)
    
        [peripheralDevice setNotifyValue:YES forCharacteristic:characteristic];
    
  NSLog(@"the property :%d",currentCharacteristic.properties );

这里是文档中 Characteristic.properties 的枚举:

typedef NS_ENUM(NSInteger, CBCharacteristicProperties) 
    CBCharacteristicPropertyBroadcast                                               = 0x01,
    CBCharacteristicPropertyRead                                                    = 0x02,
    CBCharacteristicPropertyWriteWithoutResponse                                    = 0x04,
    CBCharacteristicPropertyWrite                                                   = 0x08,
    CBCharacteristicPropertyNotify                                                  = 0x10,
    CBCharacteristicPropertyIndicate                                                = 0x20,
    CBCharacteristicPropertyAuthenticatedSignedWrites                               = 0x40,
    CBCharacteristicPropertyExtendedProperties                                      = 0x80,
    CBCharacteristicPropertyNotifyEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0)     = 0x100,
    CBCharacteristicPropertyIndicateEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0)   = 0x200
;

它可以很好地从特征中读取值。但问题是在写入值时它不会进入第二个循环。我已经用可写属性设置了特性。我得到了我检查过的两个外围设备的 136 in print 语句。请提出一些解决方案来解决这个问题?

【问题讨论】:

我没有完全理解,但是:你的属性是可写和可读的吗?因为,在您的if...ELSE if 中,您将进入第一个循环,但不会进入第二个循环... 你从那个 NSLog 语句中得到了什么?得到 136 看起来很奇怪,因为这个枚举的最大值应该是 9。另外,如果你一直得到 136,那么读取部分也不起作用。 【参考方案1】:

通过使用 ANDing 操作解决了这个问题:

 if (characteristic.properties&CBCharacteristicPropertyRead!=0)
 
      [peripheralDevice readValueForCharacteristic:characteristic];
 

【讨论】:

【参考方案2】:

这是 Swift 3 的解决方案:

if characteristic.properties.contains(.write) 
    ...

【讨论】:

以上是关于核心蓝牙内的可写特性的主要内容,如果未能解决你的问题,请参考以下文章

核心蓝牙特性不更新值

使用核心蓝牙时的问题

核心蓝牙无法发现外围设备

蓝牙核心技术概述

低功耗蓝牙LE Audio Profile 详细介绍

连接核心蓝牙或经典蓝牙设备是不是需要 CoreLocation 框架