文章结构
- 蓝牙封装
- 自动连接
- 后台运行
- 优化注意事项
- 声明
本篇不对蓝牙的基本使用做介绍,网上多得跟米一样。
蓝牙封装
对蓝牙进行封装时候我选择的是基于代理,有人使用基于block的,我认为不好,结构不够清晰,蓝牙是一系列操作的集合,本人觉得不大适合使用block进行处理;并且蓝牙的基本机制,比如扫描设备、连接等封装成一个类,在本demo中该类为LTSBTManager;而基于项目的使用蓝牙进行读写数据的使用另外一个类来封装接口,在本dmeo中该类为TaiJianYiService。
这样做的好处是容易根据不同项目进行复用,至于LTSBTManager基本不用针对 不同项目改变多少,TaiJianYiService(根据自己项目重命名)类的话可根据不同项目修改代理以满足项目需求。
自动连接
本人采用的是自动连接上次连接过的设备,如果是手动断开则取消自动连接, 但是在连接上后如果是由于蓝牙距离太远导致的断开连接,则接近时采用自动连接。
为了实现自动连接,可以使用NSUserDefaults保存上次连接过的peripheral的UUID。
断开连接后自动连接,只需要在蓝牙的代理didDisconnectPeripheral中调用
- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;
即可。
后台运行
网上有一些使用音乐后台无限播放或者不短刷新地理位置,这其实是不行的,如果想要保持后台长时间运行,应该间歇性地和设备保持数据通信,比如每隔30秒发送一次数据,协议自己定。
优化注意事项
- 只有在必要的时候才打开扫描,因为蓝牙扫描是比较耗电的。
- 在搜索服务和特征时候,只搜索关心的服务和特征,而不应该全局搜索,不管是从程序性能还是电池使用上都是不好的。
- 当peripheral发现了特征(characteristic),需要监测某个特征值时,如果特征值基本不会改变或者不经常性改变,则调用以下接口:
- (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;
如果某个特征值经常性改变,则应该采用订阅方式监测该特征值,调用以下接口:
- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;
- 重连方式:(1)重新获取已发现的设备列表(搜索到的或是连接过的设备),使用 retrievePeripheralsWithIdentifiers: 。如果列表中有想要寻找的设备,那么发起连接。
注意:可能有多种原因导致设备不能被连接上。比如,设备不在附近。还有一种可能,一些低功耗蓝牙使用随机设备地址,在重新连接时,它的地址可能已经变了。因此,即使设备就在附近,设备的地址也已经变了,这种情况下,你想要连接的设备与实际设备已经不匹配了。这种情况,你只有重新搜索了。
(2)重新获取当前连接着的设备列表,使用retrieveConnectedPeripheralsWithServices:。 如果列表中有想要寻找的设备,发起本地连接,使得应用与之连接上。检查你想要连接的设备是否已经连接到系统了(即可能其他应用正连着呢)。
声明
- 这只是一个demo,不可能拿过来就能用,而且我已经把蓝牙的数据封装部分去掉了,但是里面引用的类以及头文件没有删除,因项目需要的话,替换成自己定义的类即可。
- demo里的自动连接时候,没有进行扫描,如果项目需要的话,需要自行扫描然后刷新UI。
谢谢你的垂阅,欢迎下载交流!