iOS学习,蓝牙,读取数据方式
2014-06-11 16:08
204 查看
最近开始学IOS开发,正做蓝牙测试。我们有4.0外设,用pad连接,接收数据。在接收数据过程中,还是遇到了问题:用readValue后读不到value的值。困扰了大半天,现在分享下解决心得,供其他新手参考。由于本人也是水货,写的不好的地方请提出讨论,勿喷。
程序中,搜索设备,搜service UUID ,找characteristic 等就不讲了,这方面网上资料还是挺多的。现在就说下数据接收:
前过程省略,假设我们一直做到了这里,
当发现了我们所需要的characteristic,我们最想做的就是查看下这个characteristic的value是多少。也就是说,我们需要一个接收数据的操作。
在CoreBluetooth中,提供了两种方法:
1. [peripheral readValueForCharacteristic:characteristic];
peripheral是我们程序中的外设,characteristic是我们那个感兴趣的characteristic
当调用这个方法后,程序会回调一个方法:
上面的第二个参数:(CBCharacteristic *)characteristic -----我们直接用characteristic.value就获取到了感兴趣的characteristic的value,类型是NSData的,之后就可以对值进行操作了。
PS:回调的前提是要设置代理,不要忘了。
这个方法比较直接,也符合我们的一般逻辑,下面介绍第二种方法
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2. Subscribe,不知道怎么翻译好,就当是“订阅”---吧。
把上面
[peripheral readValueForCharacteristic:characteristic]
换成
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
第一个参数设置为YES,至于为啥,后面我说说我的理解。第二个参数同样是我们感兴趣的characteristic。
调用这个方法后,程序会回调一个方法:
这方法能做什么?我觉得主要是一些错误判断,利用上面第三个参数error,如果出错,系统把错误信息放在error中,可以打印显示。
之后在这个方法中调用[peripheral readValueForCharacteristic:characteristic]同样会回调1中那个回调方法,
我们同样在这里处理数据,跟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:
当为read(0x02)的时候,我们用1方法可以查看,用2就会出错。当为notify(0x10)的时候我们就得用2方法。其他就不说明了,比如write就只能写value······
所以当我们想查看value的时候,先了解一下这个characteristic的property,看是不是能让我们读的。怎么查看?找BLE外设的设备厂商或者查看外设的说明书。
推荐将value经常变化的characteristic的property设为notify。
程序中,搜索设备,搜service UUID ,找characteristic 等就不讲了,这方面网上资料还是挺多的。现在就说下数据接收:
前过程省略,假设我们一直做到了这里,
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
当发现了我们所需要的characteristic,我们最想做的就是查看下这个characteristic的value是多少。也就是说,我们需要一个接收数据的操作。
在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. Subscribe,不知道怎么翻译好,就当是“订阅”---吧。
把上面
[peripheral readValueForCharacteristic:characteristic]
换成
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
第一个参数设置为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外设的设备厂商或者查看外设的说明书。
推荐将value经常变化的characteristic的property设为notify。
相关文章推荐
- iOS学习,蓝牙,读取数据方式
- ios网络学习------4 UIWebView的加载本地数据的三种方式
- iOS学习笔记3—NSKeyedUnarchiver进行本地数据的读取|存储
- ios1学习笔记-保存数据的4种方式
- ios网络学习------4 UIWebView的加载本地数据的三种方式
- iOS学习笔记-032.数据的读取——plist写入
- ios网络学习------4 UIWebView的加载本地数据的三种方式
- IOS学习之四种保存数据的方式
- ios网络学习-- UIWebView的加载本地数据的三种方式
- ios网络学习------4 UIWebView的加载本地数据的三种方式
- IOS学习笔记之获取Plist文件读取数据
- ios网络学习------4 UIWebView的加载本地数据的三种方式
- ios蓝牙开发学习笔记(六)作为Peripheral端的最佳方式
- IOS学习之ios应用数据存储方式(XML属性列表-plist)
- IOS开发---菜鸟学习之路--(二十三)-直接利用键值对的方式来处理数据的感想
- 用蓝牙方式读取GPS数据.
- IOS 沙盒两种数据读取方式&NSUserDefaults读取方式
- iOS学习笔记-033.数据的读取——NSString和UIImage的保存
- 【IOS学习】 IOS的四种数据存储方式及优劣
- ios网络学习------4 UIWebView的加载本地数据的三种方式