一、前言
接触BLE开发也有一段时间了,一直想找个时间记录一下BLE开发中遇到的问题和和自己的一些理解,
硬件设备使用的都是低功耗蓝牙,讲真 BLE开发坑还是挺多的,废话不多说,进入正题。
二、注意事项:
1.判断是否支持BLE蓝牙、是否打开系统蓝牙
2.在一些高版本机型上, 用户还需打开位置信息(不光要位置权限,还需要打开位置信息)才能通过蓝牙进行扫描 。
3.开启搜索设备时要定时的主动停止搜索 ,不然时间久了会搜索不到设备。
4.在连接或通信过程中比如出现133、8、19、22、62等,马上调用 Gatt.disconnect(), Gatt.close() 。
三 、权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
四、设备通信
1.发送和接收数据,默认20字节,超过20字节需要分包发送或者接收。
2.在设备通信过程中,容易发生设备断开或者133等错误,举个栗子,比如硬件设备一直给APP发送大量数据,过一段时间 蓝牙设备会自动断开或者刚连接时候就连接不上设备,解决办法:建议硬件工程师修改一下 连接间隔 、连接参数等,设置的值必须是1.25ms的整数倍,或者调整发送速度等(注:不同手机兼容性不一样,所以硬件适配起来也麻烦,需要慢慢调和不断的测试)。
3.设备异常断开,比如突然断电,线路断了等,不知道各位同鞋有木有发现,蓝牙底层回调结果特别慢20s左右,我也抓包测试过,和Ios那边简直天壤之别,而且抓包发现,不同设备 响应的回调结果也有区别,解决办法:建议设备加个备用电源,低于多少电量主动给app发送断开指令,不让设备继续操作,经测试发现,由于底层栈问题,设备主动断开,APP 回调特别快和APP主动发送断开指令差不多,所以很多时候,可以让硬件主动加个断开指令,这样就避免回调结果慢的问题,总而言之,比如硬件设备崩掉,断电(没有电池情况下),是无法发送断开广播的,还是有上面说的延迟回调特别慢的问题,要是有大佬知道如何解决,欢迎留言告知。
五、清除蓝牙缓存
BLE 文档没有直接清除蓝牙缓存的接口,但是我们可以通过反射方式获取,代码如下:
try {
Method localMethod = gatt.getClass().getMethod("refresh");
if (localMethod != null) {
return (Boolean) localMethod.invoke(gatt);
}
} catch (Exception localException) {
L.d("---", "An exception occurred while refreshing device");
}
return false;
总结:最后推荐一个BLE开源库:FastBle开源框架,后面还会不断完善该文章,若有笔误的地方,欢迎指正。
来源:oschina
链接:https://my.oschina.net/u/4332208/blog/4533910