美文网首页调调侃侃蓝牙的那点事
蓝牙开发遇到问题?不慌,看看本文收集的问题能否为你提供解决方法

蓝牙开发遇到问题?不慌,看看本文收集的问题能否为你提供解决方法

作者: ff75cdf4bdf3 | 来源:发表于2017-11-06 15:47 被阅读0次

    在蓝牙开发过程中,我们常常遇到这样那样的零星问题,有时候遇到的其实是一些很简单的问题但也找不到原因,着实是难受,那为了帮助开发者在打造基于蓝牙无线技术的产品,笔者总结了一些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()方法即可。

    相关文章

      网友评论

        本文标题:蓝牙开发遇到问题?不慌,看看本文收集的问题能否为你提供解决方法

        本文链接:https://www.haomeiwen.com/subject/nfplmxtx.html