介绍TTC常见的Android BLE开发常见问题及提供解决方法

发布日期:2017.11.06     浏览次数:283

在蓝牙开发过程中,我们常常遇到这样那样的零星问题,有时候遇到的其实是一些很简单的问题但也找不到原因,着实是难受,那为了帮助开发者在打造基于蓝牙无线技术的产品,笔者总结了一些TTC常见的Android BLE开发常见问题及提供解决方法。


1APP搜索不到蓝牙设备.

先确定设备正在广播,且没有被其他 APP 或手机连着(用多个手机使用TTC-BLE 搜索,至少有一个手机可以搜索到),如果确定设备在广播后还是搜索不到,那么可能是工程设置的 targetSdkVersion 大于或等于 23Android6.0),由于 Android 6.0 开始,权限管理发生了变化,APP 安装成功后用户也可以随时撤销已授权的权限,而 Android 5.0 开始扫描蓝牙设备还需要位置权限并开启手机的位置服务,这类情况,要么把 targetSdkVersion 设低一些,要么 APP 去动态的检测位置权限,再引导用户授权并开启位置服务。

 

2设备接收不到APP发的数据.

情况1

可能是发送数据的时间早于onServicesDiscovered()方法的触发时间,比如在onConnected()这个回调方法触发时进行发送,这种情况需要将发送数据的时间控制在 onServicesDiscovered()方法之后,要兼容大部分手机的话最好延迟个300ms

情况2

SDK版本低于V1.1.1,有些手机会在连接后又断开,导致发送失败,这种情况将SDK更新到V1.1.1,再参照问题3的情况1增加代码就可以了;

情况3

APP 快速向同一个设备发送多次数据,发送间隔小于连接间隔,导致数据丢失,这时候需要使用定时器来控制发送间隔,不得低于连接间隔;

情况4

模块启用了数据加密,但是 APP 发送数据时未进行加密处理,在我司提供的SDK 中,发送数据的方法都有个 boolean 型的参数,true 表示加密数据,false 则不加密数据。

 

3APP接收不到设备发的数据.

情况1

SDK版本高于V1.1.0V1.1.1之前,SDK连线后会马上打开数据接收通道的 Notify,但这样会导致有些手机断线,新的SDK需要开发者增加打开Notify的代 TTC_BLE_DEMO util LeProxy ServicesDiscoveredTask);

情况2

模块未启用数据加密,且模块发送的数据长度小于 4,可能是 APP 端经过解密处理后数据为空了,解决方法是:在初始化 BleService 的时候,调用 BleService setDecode()方法,参数传 fasle 即可;

情况3

BleCallBack 的回调方法中有代码阻塞了回调线程。

 

4APP修改模块广播名称不成功.

如果是 CC2541 模块首先要确保没开启快速连接功能,在此前提下如果还是无法修改成功,可能您使用了魅族手机,魅族手机需要重启手机蓝牙才会刷新设备名称。开发中如果发现 Android 手机与 ios 手机搜索到同一个设备时名称不一样,也可能是 ios 端没刷新,可以重启 ios 手机蓝牙并连接设备,再次断开,名称就可以刷新过来了。

 

5APP连线后只触onConnected()方法,不走onServicesDiscovered()方法.

这种情况发生在CC2541模块上,要依据软件版本采取相应的办法:V2.3~V2.5 需要模块那边启用快速连接功能,V2.6 及以上版本需要模块那边开启 android 适配功能。

 

6APP接收的数据参差不齐.

开发中可能模块会持续向APP发送多笔数据,而每发送两笔数据,之间的间隔又比较短(一般小于等于30ms),且每笔数据不满20字节(模块数据加密的话不满17字节),这时候APP接收的数据可能是被拆分并重新组装后的数据。

比如非加密模块,每次发送17字节,快速发送5次,APP第一次可能会收到 20字节,而多出来的3字节是模块端第二次发送的前3字节,后面的数据也可能被类似这样拆分,APP接收数据的次数便小于5,而APP接收的数据整体顺序是没问题的,这种情况要避免数据被拆分,要么模块增大发送间隔,要么模块每次发送的数据补足20字节(数据加密的话补足17字节)。

 

7OAD通道刷新.

APP进行OAD固件升级时,模块端的服务特征会发生变化,而Android系统每连接一个设备会将设备上的服务特征UUID缓存起来,以便提升再次连接的速度,这时候就需要手机端刷新才能正常数据交互,这类情况APP在断线的时候调用BleServicerefresh(String mac)方法即可刷新,该方法要在断线的回调方法即onDisconnected(String mac) 中调用,且不能放到其他线程调用。

如果APP没有使用我司提供的Android BLE SDK,在断线释放连接之前利用反射调用BluetoothGattrefresh()方法即可。