完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
` 在蓝牙开发过程中,我们常常遇到这样那样的零星问题,有时候遇到的其实是一些很简单的问题但也找不到原因,着实是难受,那为了帮助开发者在打造基于蓝牙无线技术的产品,笔者总结了一些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()方法即可。 ` |
|
相关推荐
3 个讨论
|
|
只有小组成员才能发言,加入小组>>
3103 浏览 3 评论
1553 浏览 3 评论
4706 浏览 1 评论
2044 浏览 1 评论
3298 浏览 2 评论
538浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 11:16 , Processed in 0.570959 second(s), Total 50, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号