云里物里的个人空间 https://www.eechina.com/space-uid-139189.html [收藏] [复制] [RSS]

博客

蓝牙开发中经常遇到的问题有哪些?

已有 345 次阅读2020-3-26 11:45 | 蓝牙开发

1.应用如何做自动重连
其实自动重连比想象的要简单许多,无论是Android还是ios端,只需要在设备断开连接的委托方法中,重新调用gatt.connet或者是centralManager.connet方法就可以了,无论当时设备是否有点,是否在周围,当设备再次开会或者连接到可连接范围内,都会自动被连上。

2.连接失败处理
分两个平台来说,iOS端有连接失败的委托,但几乎不会发生这种情况;而对于同款设备,android常常会出现连接失败的情况,status != BluetoothGatt.GATT_SUCCESS ,android端开发请不要把连接失败和断开连接放在一块处理,因为断开连接可以直接尝试重新连接,而连接失败后尝试重新连接,需要加一些延时,并且需要gatt.close,清空一下状态,否则会把gatt阻塞导致手机不重启蓝牙就再也无法连接任何设备的情况。

3.后台运行
iOS后台运行,需要设备中info.Plist权限,key:Required background modes,value: bluetooth-central(手机作为central) , bluetooth-peripheral(手机作为外设)

4.同时连接多个设备
Android很简单,创建多个gattCallback,每个gattCallback单独管理设备连接后的操作,而iOS也最好不要创建多个CBCentralManager,多个CBCentralManager理论上可以用,但是会存在多个手机版本存在不同的行为,还有一些很容易出错的问题,这块内容不细说了。使用同一个CBCentralManager,通过进入委托的peripheral的identifier区分不同的设备,进行不同的操作和处理。

5.扫描广播包
所有外设,只有在发出广播包的情况下,才能被central发现,绝大多数情况下,外设被连接后就不会发出广播(也有例外),很多人遇到无法找到设备的问题,大多属于这种情况。

6.提高蓝牙连接速度
无论是iOS,还是Android,都可以通过已绑定的设备,在不开启扫描的情况下进行快速连接,iOS需要的参数是peripheral的identifier,Android需要mac地址。但Android和iOS还是有一些区别的,比如iOS不能拿到已绑定的设备list,但是可以通过UUID去拿到peripheral的实例。而Android可以拿到已绑定的设备list。Android绑定过程需要手动调用createBond的方法,而iOS在连接成功一次后会自动绑定。Android在处理createBond时,常常会因为不同手机平台,不同设备,会产生兼容性的问题,这点需要注意。

7.定向扫描
在扫描时候可以传入serviceUUID,这样可以扫描到特定条件的设备,提高扫描的速度,排除干扰。

8.如何获取mac地址
Android可以直接通过getAddress得到mac地址;而iOS出于苹果的安全策略问题,无法直接获得mac地址,只能得到一个mac地址换算出来的identifier。不过在智能设备开发时,一般都会考虑到这个问题,大多数智能设备会把mac地址保存在广播数据中,不同设备可能会存在不同的位置。

9.Babybluetooth蓝牙库的使用
Babybluetooth是iOS的蓝牙库的封装,iOS蓝牙委托层级特别讨厌,一个委托接着一个委托,比如先进入扫描的委托,在进入链接的委托,在进入连接成功,发现服务,发现特征,读写操作,一套操作被拆分的很散,容易出错,代码不易维护,上手慢等缺点,Babybluetooth对CoreBluetooth进行了封装,把委托回调进行方法调用的方式,改成了链式方法顺序调用,直接调用baby.enjoy()方法,完成一整套操作,简化了上手难度和代码维护成本。如需蓝牙模块请找云里物里https://www.minewtech.com,本文来源网络。

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部