Android Ble开发总结和遇到的坑

淺唱寂寞╮ 提交于 2020-09-27 23:52:05

一、前言

接触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开源框架,后面还会不断完善该文章,若有笔误的地方,欢迎指正。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!