微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > Android蓝牙开发遇到问题?笔者总结了一些TTC常见的Android BLE开发问题及解决方法

Android蓝牙开发遇到问题?笔者总结了一些TTC常见的Android BLE开发问题及解决方法

时间:10-02 整理:3721RD 点击:

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

1、APP搜索不到蓝牙设备

先确定设备正在广播,且没有被其他 APP 或手机连着(用多个手机使用TTC-BLE 搜索,至少有一个手机可以搜索到),如果确定设备在广播后还是搜索不到,那么可能是工程设置的 targetSdkVersion 大于或等于 23(Android6.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 则不加密数据。

 

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

情况1:

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

情况2:

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

情况3:

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

 

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

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

 

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

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

 

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

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

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

 

7、OAD通道刷新

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

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

谢谢分享!

谢谢分享,很受用!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top