ios蓝牙封装以及优化

作者: LotusLee | 来源:发表于2018-03-06 12:27 被阅读0次

    文章结构

    • 蓝牙封装
    • 自动连接
    • 后台运行
    • 优化注意事项
    • 声明

    本篇不对蓝牙的基本使用做介绍,网上多得跟米一样。

    蓝牙封装

    对蓝牙进行封装时候我选择的是基于代理,有人使用基于block的,我认为不好,结构不够清晰,蓝牙是一系列操作的集合,本人觉得不大适合使用block进行处理;并且蓝牙的基本机制,比如扫描设备、连接等封装成一个类,在本demo中该类为LTSBTManager;而基于项目的使用蓝牙进行读写数据的使用另外一个类来封装接口,在本dmeo中该类为TaiJianYiService。
    这样做的好处是容易根据不同项目进行复用,至于LTSBTManager基本不用针对 不同项目改变多少,TaiJianYiService(根据自己项目重命名)类的话可根据不同项目修改代理以满足项目需求。

    自动连接

    本人采用的是自动连接上次连接过的设备,如果是手动断开则取消自动连接, 但是在连接上后如果是由于蓝牙距离太远导致的断开连接,则接近时采用自动连接。

    为了实现自动连接,可以使用NSUserDefaults保存上次连接过的peripheral的UUID。

    断开连接后自动连接,只需要在蓝牙的代理didDisconnectPeripheral中调用

    - (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;
    

    即可。

    后台运行

    网上有一些使用音乐后台无限播放或者不短刷新地理位置,这其实是不行的,如果想要保持后台长时间运行,应该间歇性地和设备保持数据通信,比如每隔30秒发送一次数据,协议自己定。

    优化注意事项

    1. 只有在必要的时候才打开扫描,因为蓝牙扫描是比较耗电的。
    2. 在搜索服务和特征时候,只搜索关心的服务和特征,而不应该全局搜索,不管是从程序性能还是电池使用上都是不好的。
    3. 当peripheral发现了特征(characteristic),需要监测某个特征值时,如果特征值基本不会改变或者不经常性改变,则调用以下接口:
    - (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;
    

    如果某个特征值经常性改变,则应该采用订阅方式监测该特征值,调用以下接口:

    - (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;
    
    1. 重连方式:(1)重新获取已发现的设备列表(搜索到的或是连接过的设备),使用 retrievePeripheralsWithIdentifiers: 。如果列表中有想要寻找的设备,那么发起连接。
      注意:可能有多种原因导致设备不能被连接上。比如,设备不在附近。还有一种可能,一些低功耗蓝牙使用随机设备地址,在重新连接时,它的地址可能已经变了。因此,即使设备就在附近,设备的地址也已经变了,这种情况下,你想要连接的设备与实际设备已经不匹配了。这种情况,你只有重新搜索了。
      (2)重新获取当前连接着的设备列表,使用retrieveConnectedPeripheralsWithServices:。 如果列表中有想要寻找的设备,发起本地连接,使得应用与之连接上。检查你想要连接的设备是否已经连接到系统了(即可能其他应用正连着呢)。

    声明

    1. 这只是一个demo,不可能拿过来就能用,而且我已经把蓝牙的数据封装部分去掉了,但是里面引用的类以及头文件没有删除,因项目需要的话,替换成自己定义的类即可。
    2. demo里的自动连接时候,没有进行扫描,如果项目需要的话,需要自行扫描然后刷新UI。

    demo

    谢谢你的垂阅,欢迎下载交流!

    相关文章

      网友评论

        本文标题:ios蓝牙封装以及优化

        本文链接:https://www.haomeiwen.com/subject/usphfftx.html