简介

自从Android-BLE库开源了一段时间以来,越来越多的小伙伴问到了各种各样的关于BLE的奇怪问题,在这里我想跟大家分享一下本人对于Android BLE蓝牙的一些看法和解决方式,避免刚接触的小伙伴再次踩坑。

题外话

很多人曾问过我这个问题,为什么其他手机都没什么问题,就华为的一些手机老是连接不稳定,经常连接的很慢,而且连接上还经常断开。的确,在这里强调一下华为的一部分手机确实很容易出现这种问题,有时候软件、硬件都搞不定,而且经常性收到客户投诉关于华为手机连接稳定性问题,这个的确没有完全解决的办法,只能靠App和硬件的优化,并不是想甩锅给华为,咱也不敢问到底是什么原因,而且我们公司专门针对各个Android版本的手机做过测试,包括蓝牙传输速率的测试,最后发现华为P20的速度竟然跟小米8的速度差了好几倍,按理说P20手机也不便宜啊,为什么手机蓝牙芯片不能做的再好一点呢?

问题集锦

一、扫描问题

1、扫描不到设备

先确定下列几项是否满足:
1、蓝牙是否打开
2、蓝牙相关权限是否授权(6.0以上位置权限)
3、7.0以上手机很多需要手动打开GPS

2、有时候刚开始扫描还正常,过段时间扫描不到设备?

原因:
出现这个问题的很多是Android7.0以上手机,为什么呢?
因为Google为了防止Android7中的BLE扫描滥用,从而做了一些限制,即不要在30s内对蓝牙扫描
重复开启-关闭超过5次。
建议:
设置扫描周期>6s, 用户点击扫描后不要重复进行扫描,可以做一个是否正在扫描的标志位,如果
正在扫描就不做重复扫描动作了。

BLE扫描滥用预防

AOSP-BLE扫描滥用说明

3、为什么有些手机退到后台扫描不到设备

Android8.0以上退到后台息屏后,为了保证省电等原因,如果不设置ScanFilters的话是默认扫不到设备的,
所以解决办法就是设置如下:mScannerSetting = new ScanSettings.Builder()//退到后台时设置扫描模式为低功耗.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build();mFilters.add(new ScanFilter.Builder()//过滤扫描蓝牙设备的主服务.setServiceUuid(ParcelUuid.fromString("0000ffff-0000-1000-8000-00805f9bfffb")).build());mScanner.startScan(mFilters, mScannerSetting, mScannerCallback);

息屏状态下,蓝牙扫描日志,因为扫描周期是12s,所以打印的时间戳间隔是12s,这里的日志为系统日志。

image

image

翻译:
启动蓝牙扫描。扫描结果将通过回调传递。对于未经过滤的扫描,扫描是停止在屏幕上关闭,以节省
电力。再次打开屏幕时,将恢复扫描。为了避免这种情况,请使用适当的扫描过滤器进行文件扫描。

二、连接问题

1、为什么同时多个设备连接时经常连接不成功?

可能原因:
在使用 BluetoothDevice.connectGatt() 或者 BluetoothGatt.connect() 等建立 BluetoothGatt
连接的时候,在任何时刻都只能最多一个设备在尝试建立连接。如果同时对多个蓝牙设备发起建立 Gatt
连接请求。如果前面的设备连接失败了,后面的设备请求会被永远阻塞住,不会有任何连接回调。
建议:
如果要对多个设备发起连接请求,最好建立一个请求队列,前一个设备请求建立连接,后面请求在队列中等待
。如果连接成功了,就处理下一个连接请求。如果连接失败了(例如出错,或者连接超时失败),就马上调用
BluetoothGatt.disconnect()/close()来释放建立连接请求,然后处理下一个设备连接请求。

2、为什么有时候连接成功了,但是发现不了服务及特征值,进而影响数据的接收和发送。

连接成功后,会进行BluetoothGatt.discoverServices()去发现服务,进而设置特征值等,因为该方法是在主
线程中执行的,所以为了连接过程的可靠性,建议不要在该过程中,在主线程中不要处理太多的操作(尤其是频
繁绘制操作)。

3、为什么连接成功后,过不一会又断开了?

这个问题其实并不主要是客户端的问题,所以不要一味的在代码中找问题了,建议与硬件沟通,让其进行优化
,如可以调整设备的连接参数(ConnectionInterval(连接间隔)、SlaveLatency(从设备延迟或者从设备时
延)、SupervisionTimeout(超时时间或者监控超时)),这三个参数是低功耗蓝牙中十分重要的连接参数,
一起决定了BLE的功耗,一般硬件设备会在APP连接成功时主动去更新一下这三个参数,以保证不同手机的差异
性得到一致,但是APP端是没办法控制这三个参数的。

4、最大连接数问题

标准答案是7个,为什么是7个,这个我们可以从如下图所示的底层蓝牙源码中找到依据。

https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/master/include/bt_target.h#1428

stackoverflow问答社区

image

5、连接api的使用问题

发起蓝牙Gatt连接 BluetoothDevice.connectGatt(Context context, boolean autoConnect,
BluetoothGattCallback callback),这里有一个参数autoConnect,如果为 true
的话,系统就会发起一个后台连接,等到系统发现了一个设备,就会自动连上,通常这个过程是非常慢的。为
false 的话,就会直接连接,通常会比较快。同样,BluetoothGatt.connect()只能发起一个后台连接,不是直
接连接,所以连接时设置autoConnect参数设置为false,如果想实现重连功能的话,自己去手动实现吧,实在不
想手动写,那就用Android-BLE库吧,你想要的基本都有。

6、为什么连接总是报133、19之类的非0异常

原因:可能由于首次连接蓝牙后没有释放掉gatt资源导致的蓝牙协议栈异常,从而出现133或257
19等值不为0:由于协议栈,连接建立失败建议:在onConnectionStateChange()回调中判断,若state非0(连接断开),调用gatt.close(),手动释放掉
gatt相关资源

三、数据发送问题

1、为什么连接成功了,发送数据总是失败?

原因:
1、首先确定主服务是否正确,再看设置的读、写特征值是否正确2、因为BLE发现服务和设置特征、通知等是需要耗时的,所以你并不能连接成功后立马发送数据,可以等到在
onDescriptorWrite()回调时,或者手动延迟一段时间再去做发送操作。

2、为什么要分包发送

BLE4.0蓝牙发送数据,单次最大传输20个byte,如果是一般的协议命令,如:开关灯、前进左右等等,是不需要
分包的,如果是需要发送如:图片、BIN文档、音乐等大数据量的文件,则必须进行分包发送,BLE库中已经提
供了发送大数据包的接口,需要的小伙伴可以去下载DEMO查看用法。

作者:f2a928cacb8d
链接:https://www.jianshu.com/p/ea63a1d674ef
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Android BLE蓝牙踩坑总结相关推荐

  1. Android Ble蓝牙开发总结

    Android Ble蓝牙开发总结 前言 本文总结了ble的搜索,连接,读写操作.以及在开发过程中可能遇到的坑. 首先我们需要知道,什么是ble. 蓝牙发展至今经历了8个版本的更新.1.1.1.2.2 ...

  2. Android Studio安装踩坑

    title: Android Studio安装踩坑 date: 2018-09-07 19:31:32 updated: tags: [Android,Android Studio,坑] descri ...

  3. Android BLE蓝牙详细解读

    代码地址如下: http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能 ...

  4. android蓝牙设置特征属性,Android BLE蓝牙详细解读(二)

    上篇文章主要介绍了关于BLE的一些基础操作,我们能够大概了解到蓝牙操作的一些流程,上文末介绍了本人的一个BLE开源库,支持蓝牙一对多的连接方式,该库封装了蓝牙的开启.扫描.连接.断开.连接超时...一 ...

  5. Android BLE蓝牙开发知识总结

    Android BLE蓝牙开发知识总结 1.蓝牙介绍 1.1什么是蓝牙?    蓝牙( Bluetooth® ):是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换(使用2 ...

  6. android 字体文件压缩,Android 字体使用踩坑指南

    Android 字体使用踩坑指南 最近项目改版,根据ui的设计,需要使用到三字体.在使用过程中遇到一些坑,于是有了这个避坑指南! 字体压缩 第一个坑!字体库的体积太大. 字体压缩的前提是要使用的内容是 ...

  7. Android google翻译踩坑之旅

    # Android google翻译踩坑之旅   最近由于工作需求,需要为游戏Android平台接入Google翻译的SDK,由于关于翻译的文章非常少,访问官方文档又需要翻墙,更可气的是找到的博客写了 ...

  8. android ble蓝牙接收不到数据_Android蓝牙4.0 Ble读写数据详解 -2

    Android蓝牙4.0 Ble读写数据详解 -2 上一篇说了如何扫描与链接蓝牙 这篇文章讲讲与蓝牙的数据传输,与一些踩到的坑. 先介绍一款调试工具,专门调试Ble蓝牙的app.名字叫:nRF-Con ...

  9. Android BLE 蓝牙开发指南(三)外围设备端开发详解

    Android BLE开发指南(一)入门基础 Android BLE开发指南(二)中心设备端程序开发详解 这篇文章将会详细讲解低功耗蓝牙外围设备端程序开发的主要流程.对于Android开发者而言,或许 ...

最新文章

  1. ORACLE中的imp和exp
  2. HDU5443(ST表)
  3. java考察代码_一段简单的关于字符串的 Java 代码竟考察了这么多东西
  4. WPF 使用DrawingVisual绘制高性能曲线图
  5. Mysql-索引的基础和类型
  6. 【无码专区13】最小公倍数(线段树)
  7. Mybatis_day2_Mybatis的CRUD操作
  8. python程序如何执行死刑_哪些Python库让你相见恨晚?
  9. Mysql-connector-java驱动包(最新版下载详细教程)
  10. Brother DCP-1608 Printer共享打印机防坑指南
  11. c语言中正方形的周长,长方形 正方形面积 和周长的公式
  12. 360安全浏览器强制使用极速模式打开
  13. FFMPEG AvFilter使用实例(实现视频缩放,裁剪,水印等)
  14. 卷积神经网络 图像识别,卷积神经网络处理图片
  15. 单片机数字滤波c语言程序,单片机系统中数字滤波的算法【C程序整理】
  16. 很不错的免费杀毒软件
  17. DS18B20温度传感器——测试环境温度及代码
  18. 计算机无法安装蓝牙设备,笔记本蓝牙无法添加设备解决方法
  19. IDEA new project
  20. 道客巴巴 文档下载方法

热门文章

  1. python生成热度图_Python - 场景热力图绘制[转]
  2. 原神 Android 教程 —安卓版
  3. 【shell】Cshell
  4. ZYNQ产品生产拷机问题思考
  5. 二叉树遍历 递归/非递归/morris
  6. 如何提升广告ROI?转化跟踪了解一下
  7. info testing mysql_sqlmap新手注入
  8. 街灯变成了平台,世界将会怎样
  9. UiPath之数据透视表
  10. 计算机软件专业河南省专科学校,计算机相关专业河南省哪个学校好