第一次写CSDN博客,多多关照

公司APP的业务是做蓝牙mesh组网的,具体协议我就不提了,具体通讯方式是Gatt连接和非连接,非连接是通过扫描与广播进行通讯的。

分享一下几个坑与心得:

1.BLE广播 BluetoothLeAdvertiser
广播设置 AdvertiseSettings有一项是timeout,这个timeout千万不要用,有很严重的bug,会导致广播无法关闭(disconnect),甚至即使把APP给杀死然后重启也无济于事!设置了timeout不等于0的话,只能成功广播一次,之后的所有广播,都会失败,即使重启APP,也是失败,只能重启蓝牙!
解决方法:timeout设置为0,或者不设置,写一个新的线程控制它的关闭(disconnect)

2.GATT每次写操作之前确保回调
不仅是写操作,还有notify,以及设置mtu,在收到回调之前,不能够进行下一个方法的调用!否则会直接回调失败!

3.扫描和广播是可以同时进行的!
虽然蓝牙设备并不是双工(发送和接收(扫描)同时进行),但是我估计手机蓝牙设备底层做了处理,因此我在做非连接状态的通信的时候,用的是边发送,边扫描的方式,大大增加了通信的成功率。

4.Android6.0以下的手机的Gatt连接
6.0以下的手机调用Gatt的connect很可能会失败,直接返回status133,无法连接。
看起来好像是没有办法解决,但是我用一款调试软件nrfConnect的时候,发现该软件可以连接,然后我将代码反编译下来,发现它是这样连接的

 Class localClass = bleDevice.getDevice().getClass();Class[] arrayOfClass = new Class[4];arrayOfClass[0] = Context.class;arrayOfClass[1] = Boolean.TYPE;arrayOfClass[2] = BluetoothGattCallback.class;arrayOfClass[3] = Integer.TYPE;Method localMethod = localClass.getMethod("connectGatt", arrayOfClass);if (localMethod != null) {Object[] arrayOfObject = new Object[4];arrayOfObject[0] = BleManager.getInstance().getContext();boolean bool2 = false;arrayOfObject[1] = Boolean.valueOf(bool2);arrayOfObject[2] = gattCallback;\\这个是BluetoothGattCallback的实例arrayOfObject[3] = Integer.valueOf(2);bluetoothGatt = (BluetoothGatt) localMethod.invoke(bleDevice.getDevice(), arrayOfObject);

他是通过反射来调用系统的方法。
亲测可行

5.多次启动Scan的问题
在多次连接启动、终止Scan 后,蓝牙会处于一种无法扫描的状态,方法已经回调了,但是却没有设备被扫描出来,因此,最好不要多次startScan 和cancelScan,如果需要保持多次scan,最好保持在scan状态,即使这样耗电会比较高。

蓝牙BLE 的几个坑与心得!相关推荐

  1. 蓝牙BLE(BlueTooth BLE)入门及爬坑指南

    前言 最近比较忙,两三周没有更新简书了,公司正好在做蓝牙BLE的项目,本来觉得挺简单的东西从网上找了个框架,就咔咔地开始搞,搞完以后才发现里面还有不少坑呢,故而写一篇蓝牙BLE入门及爬坑指南,旨在帮助 ...

  2. 汇承4.0蓝牙BLE串口助手HC-COM的使用方法及出错的原因和改正方法

       本文主要介绍在使用汇承4.0蓝牙BLE串口助手HC-COM,通过手机向蓝牙模块发送数据.或者通过手机向与蓝牙模块连接的单片机发送指令时,串口中断函数的编写方法及出错的原因和改正方法    我们怎 ...

  3. 【蓝牙Mesh笔记 ①】ESP32-C3 模组上实现天猫精灵蓝牙 BLE Mesh AliGenie 接入,无需WiFi 连接也可以实现天猫精灵语音控制。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 系列一:ESP32系列模组基础学习系列笔记 1. 爬坑学习新旅程,虚 ...

  4. 微信小程序蓝牙BLE开发实战——案例(二)

    微信小程序蓝牙BLE开发实战(二) 上篇主要介绍在开发过程中应用到相关API操作.接下来介绍个人在项目开发中应用蓝牙BLE一些事情. 由于时间比较仓促, 有些注释没那么详细.请理解~写的不好欢迎各位大 ...

  5. 安卓蓝牙BLE设备开发

     前段时间做了一个有关于安卓蓝牙BLE设备的开发项目,主要的功能包括了搜索蓝牙ble设备和ble设备的数据读写等等,本篇博客用于记录安卓蓝牙ble设备的通信的细节.  其实关于BLE设备的通信在API ...

  6. 【笔记】蓝牙BLE的简单总结

    做蓝牙BLE已经有段时间了,从最初的看文档到项目中的使用,再到后面尝试着去实现一个简单的module,整个过程想想都感觉心累.自己做下简单的总结,也是重新整理下思路,再度回顾下踩过的各种坑. 查看An ...

  7. Android 蓝牙BLE开发详解

    Android 蓝牙BLE开发详解 由于年初接手了个有关蓝牙BLE的项目,开始了对蓝牙ble的学习,经过长时间的慢慢学习(学得太慢,太拖了),终于了解了该怎么写蓝牙BLE,现在就给大家分享一下. 一. ...

  8. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

    本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...

  9. java 协议栈_深入浅出讲解低功耗蓝牙(BLE)协议栈

    详解BLE连接建立过程 https://www.cnblogs.com/iini/p/8972635.html 详解BLE 空中包格式-兼BLE Link layer协议解析 https://www. ...

最新文章

  1. 【洛谷 P3469】[POI2008]BLO-Blockade(割点)
  2. caioj 1158 欧拉函数
  3. Session对象的清空
  4. python生成表格文件_python读取和生成excel文件
  5. oracle end backup,oracle-backup-hot backup
  6. android xml获取指定,android:如何从xml文件中获取信息?
  7. java完全解耦_java-完全解耦 - osc_bc7dotjc的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. mysql 删除过期日志_【转】对mysql日志进行操作的总结包括 启用,过期自动删除 等...
  9. (原)MobileNetV1
  10. java复习【笔试可能常见】
  11. DataFormatString格式字符串
  12. 数据总线、地址总线、控制总线
  13. 爆料!爆料!亚马逊跨境电商店铺骗局被骗真相曝光!不要在上当了!
  14. proposal中文翻译_proposal是什么意思_ proposal的翻译_音标_读音_用法_例句_爱词霸在线词典...
  15. 水浴的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  16. c语言求解三角形的重心,计算几个三角形的重心
  17. 关于Unity发布的WebGL项目出现问题的解决方法和本地网站部署
  18. Service Testing
  19. Django 文档 | DjangoAdmin 文档 | Django
  20. AutoCAD中程序创建Ribbon界面执行AutoCAD命令

热门文章

  1. Ios精品源码,tableview下载视频直播源播放器图片位置3D立体旋转相册屏风动画...
  2. 如何专业地命名嵌入式软件版本?
  3. 政协委员:最大愿望是让小学生步行上学
  4. 思科模拟器 --- 配置交换机的端口聚合
  5. 思科设备端口聚合配置命令
  6. 竖杠|作为字符串分隔符的使用方法
  7. python脚本中sparksql split |竖杠竖线
  8. 2ccc.com的去45秒等待油猴脚本
  9. SDK armature 和 animation spine
  10. 利用列表 查找学生信息 #if 与if else 的区别#列表数据对应捆绑