iOS 学习笔记 三 (2015.03.05)

// 当发现了我们所需要的characteristic,我们最想做的就是查看下这个characteristic的value是多少。也就是说,我们需要一个接收数据的操作。

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error 

在CoreBluetooth中,提供了两种方法:
1. [peripheral readValueForCharacteristic:characteristic];

  peripheral是我们程序中的外设,characteristic是我们那个感兴趣的characteristic当调用这个方法后,程序会回调一个方法:
  - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error


  上面的第二个参数:(CBCharacteristic *)characteristic -----我们直接用characteristic.value就获取到了感兴趣的characteristic的value,类型是NSData的,之后就可以对值进行操作了。

  PS:回调的前提是要设置代理,不要忘了。这个方法比较直接,也符合我们的一般逻辑,下面介绍第二种方法

2. [peripheral setNotifyValue:YES forCharacteristic:characteristic];  Subscribe“订阅”
  第一个参数设置为YES,至于为啥,后面我说说我的理解。第二个参数同样是我们感兴趣的characteristic。
  调用这个方法后,程序会回调一个方法:
  - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
  这方法能做什么?我觉得主要是一些错误判断,利用上面第三个参数error,如果出错,系统把错误信息放在error中,可以打印显示。
  之后在这个方法中调用[peripheral readValueForCharacteristic:characteristic]同样会回调1中那个回调方法,
  - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
  我们同样在这里处理数据,跟1中一样。
  跟1相比,多走了一步,多了一个参数notifyValue,这个参数我感觉就是一个标志量,当为YES的时候,我要订阅这个characteristic,之后每当这个characteristic的value发生变化时,都会回调

  - (void)peripheral:(CBPeripheral *)peripheral  didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
  就好像我要订阅这个杂志(characteristic),每当有新版本的杂志发行时(value值改变),你就要给我送一本(回调方法),为啥给我送?因为我订阅了。
  所以呢,这种方法在某些情况下是比1更高效的,就是我们需要操作的characteristic的value经常发生变化时。比如心率仪这些设备的心率characteristic的value。

 

最后还有一个重要的补充,当我们已经找到了我们感兴趣的characteristic后,他的value并不一定通过1方法或者2方法就可以接收的,就算可以接收,有时候只能用1,有时候只能用2。

这牵扯到characteristic的一个property:

typedef enum
{
  CBCharacteristicPropertyBroadcast = 0x01,
  CBCharacteristicPropertyRead = 0x02,
  CBCharacteristicPropertyWriteWithoutResponse = 0x04,
  CBCharacteristicPropertyWrite = 0x08,
  CBCharacteristicPropertyNotify = 0x10,
  CBCharacteristicPropertyIndicate = 0x20,
  CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40,
  CBCharacteristicPropertyExtendedProperties = 0x80,
  CBCharacteristicPropertyNotifyEncryptionRequired = 0x100,
  CBCharacteristicPropertyIndicateEncryptionRequired = 0x200,
} CBCharacteristicProperties;

 

当为read(0x02)的时候,我们用1方法可以查看,用2就会出错。当为notify(0x10)的时候我们就得用2方法。其他就不说明了,比如write就只能写value······

所以当我们想查看value的时候,先了解一下这个characteristic的property,看是不是能让我们读的。

怎么查看?找BLE外设的设备厂商或者查看外设的说明书。

    "<CBCharacteristic: 0x1565ee50,   UUID = System ID,             properties = 0x2,   value = (null), notifying = NO>",

    "<CBCharacteristic: 0x156806b0,   UUID = Model Number String,       properties = 0x2,   value = (null), notifying = NO>",  

    "<CBCharacteristic: 0x1567f9e0,   UUID = Serial Number String,        properties = 0x2,   value = (null), notifying = NO>",

    "<CBCharacteristic: 0x1565a640,   UUID = Firmware Revision String,     properties = 0x2,   value = (null), notifying = NO>",    

    "<CBCharacteristic: 0x15682f70,   UUID = Hardware Revision String,     properties = 0x2,   value = (null), notifying = NO>",

    "<CBCharacteristic: 0x1564bdf0,   UUID = Software Revision String,       properties = 0x2,   value = (null), notifying = NO>",

    "<CBCharacteristic: 0x1565a8c0,   UUID = Manufacturer Name String,      properties = 0x2,   value = (null), notifying = NO>",

    "<CBCharacteristic: 0x15683cd0,   UUID = IEEE Regulatory Certification,    properties = 0x2,   value = (null), notifying = NO>",

    "<CBCharacteristic: 0x15683bf0,   UUID = PnP ID,                  properties = 0x2,   value = (null), notifying = NO>"

推荐将value经常变化的characteristic的property设为notify(CBCharacteristicPropertyNotify)。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。