android ble 的各种坑

低功耗蓝牙通讯 C# WinForm 因为项目需要上位机软件与下位机的蓝牙模块进行通讯,所以上网查阅了很多关于蓝牙通讯的资料。刚开始以为使用现成的库就可以了,像InTheHand,发现无法搜索到蓝牙设备。后来查询资料知道,由于我们的下位机使用的是低功耗蓝牙,很多蓝牙通讯的库不适用低功耗蓝牙。再后来发现,我们的上位机软件是使用WinForm开发的,网上关于WinForm开发低功耗蓝牙的资料很少。整个开发过程挺不容易的,也踩了很多坑,终于可以正常与蓝牙模块进行通讯了。一、添加引用。......... 阅读详情

这段时间在做低功耗蓝牙 (BLE) 应用的开发(并不涉及蓝牙协议栈)。总体感觉 Android BLE 还是不太稳定,开发起来也是各种痛苦。这里记录一些杂项和开发中遇到的问题及其解决方法,避免大家踩坑。本文说的问题有些没有得到官方文档的验证,不过也有一些论坛帖子的支持,也可以算是有一定根据。

  1. Android 从 4.3(API Level 18) 开始支持低功耗蓝牙,但是只支持作为中心设备 (Central) 模式,这就意味着 Android 设备只能主动扫描和链接其他外围设备 (Peripheral)。从Android 5.0(API Level 21)开始两种模式都支持。BLE 官方文档在  这里 。 

  2. 在  BluetoothAdapter.startLeScan() 的时候,在 BluetoothAdapter.LeScanCallback.onLeScan() 中不能做太多事情,特别是周围的BLE设备多的时候,非常容易导致出现如下错误: 

    E/GKI  LINUX(17741): ##### ERROR : GKI exception: GKI  exception(): Task State Table E/GKI LINUX(17741): ##### 

    E/GKI  LINUX(17741): ##### ERROR : GKI exception: TASK ID [0] task name [BTU] state [1] 

    E/GKI 

    LINUX(17741): #####

    LINUX(17741): ##### ERROR : GKI 

    exception: TASK ID [1] task name [BTIF] state [1]

    LINUX(17741): ##### 

    E/GKI  LINUX(17741): ##### ERROR : GKI exception: TASK ID [2] task name [A2DP-MEDIA] state [1] 

    E/GKI 

    LINUX(17741): #####

    LINUX(17741): ##### ERROR : GKI   exception: GKI exception 65524 getbuf: out of buffers##### 

    E/GKI  LINUX(17741): ##### ERROR : GKI exception: 

    E/GKI_LINUX(17741):  * * * * * * * * * * * * * * * * * * * * * * 

    开发建议:在  onLeScan() 回调中只做尽量少的工作,可以把扫描到的设备,扔到另外一个线程中去处理,让  onLeScan() 尽快返回。  [  参考帖子 ] 

  3. 在使用  BluetoothDevice.connectGatt() 或者 BluetoothGatt.connect() 等建立  BluetoothGatt 连接的时候,在任何时刻都只能最多一个设备在尝试建立连接。如果同时对多个蓝牙设备发起建立 Gatt 连接请求。如果前面的设备连接失败了,后面的设备请求会被永远阻塞住,不会有任何连接回调。 

    开发建议:如果要对多个设备发起连接请求,最好是有一个同一个的设备连接管理,把发起连接请求序列化起来。前一个设备请求建立连接,后面请求在队列中等待。如果连接成功了,就处理下一个连接请求。如果连接失败了(例如出错,或者连接超时失败),就马上调用  BluetoothGatt.disconnect() 来释放建立连接请求,然后处理下一个设备连接请求。  [  参考帖子 ] 

  4. 对 BluetoothGatt 操作  (read/write)Characteristic() , (read/write)Descriptor() 和  readRemoteRssi() 都是异步操作。需要特别注意的是,同时只能有一个操作(有些贴这说只能同时有一个 writeCharacteristic() ,这个我并没有严格验证),也就是等上一个操作回调(例如  onCharacteristicWrite() )以后,再进行下一个操作。 

    开发建议:把这写操作都封装成同步操作,一个操作回调之前,阻塞主其他调用。  [  参考帖子 ] 

  5. BLE 设备的建立和断开连接的操作,例如 BluetoothDevice.connectGatt() ,  BluetoothGatt.connect() , BluetoothGatt.disconnect() 等操作最好都放在主线程中,否则你会遇到很多意想不到的麻烦。 

    开发建议:对  BluetoothGatt 的连接和断开请求,都通过发送消息到 Android 的主线程中,让主线程来执行具体的操作。例如创建一个  new Handler(context.getMainLooper()); ,把消息发送到这个  Handler中。  [  参考帖子 ] 

  6. 如果你在开发 BLE 应用的时候,有时候会发现系统的功耗明显增加了,查看电量使用情况,蓝牙功耗占比非常高,好像低功耗是徒有虚名。使用  adb bugreport 获取的了系统信息,分析发现一个名叫 BluetoothRemoteDevices 的  WakeLock 锁持有时间非常长,导致系统进入不了休眠。分析源代码发现,在连接 BLE 设备的过程中,系统会持有 (Aquire) 这个  WakeLock ,直到连接上或者主动断开连接(调用  disconnect() )才会释放。如果BLE设备不在范围内,这个超时时间大约为30s,而这时你可能又要尝试重新连接,这个  WakeLock 有被重新持有,这样系统就永远不能休眠了。 

    开发建议:对BLE设备连接,连接过程要尽量短,如果连接不上,不要盲目进行重连,否这你的电池会很快被消耗掉。这个情况,实际上对传统蓝牙设备连接也是一样。  [  参考帖子 ] 

  7. Android 作为中心设备,最多只能同时连接 6 个 BLE 外围设备(可能不同的设备这个数字不一样),超过 6 个,就会连接不上了。现在 BLE 设备越来越多,其实并不够用,所以在开发的过程中,需要特别的谨慎使用。

    开发建议:按照需要连接设备,如果设备使用完了,应该马上释放连接(调用 BluetoothGatt.close() ),腾出系统资源给其他可能的设备连接。  [  参考帖子 ] 

本文只是一些经验之谈,观点也比较琐碎。这里很多问题都看起来是蓝牙协议栈不完善导致的,或许在后面 Android 升级中会修复这些问题,我这里说的可能不适用了。

使用C#进行低功耗蓝牙BLE开发 本人在Windows11+Vs2022环境中实测,编译时无法通过,会出现无法引用System.Runtime.dll组件、IDisposable 没有实现等错误。2.引用 Windows.Devices、Windows.Foundation、Windows.Security、Windows.Services、Windows.Storage等组件进行环境搭建的。解决方案里引用处,右键选择管理NuGet程序包,浏览->搜索 Microsoft.Windows.SDK.Contracts并安装。 阅读详情

相关推荐

『uni-app、小程序』蓝牙连接、读写数据全过程

theme: smartblue 本文简介 点赞 + 关注 + 收藏 = 学会了 这是一次真实的 蓝牙收发数据 的全过程讲解。 本文使用 uni-app + Vue3 的方式进行开发,以手机app的方式运行(微信小程序同样可行)。 uni-app 提供了 蓝牙 和 低功耗蓝牙 的 api ,和微信小程序提供的 api 是一样的,所以本文的讲解也适用于微信小程序。 本文只实现 蓝牙收...

weixin_39415598的博客 8678

C#和低功耗蓝牙BLE通讯

以前都是用手机APP和蓝牙设备通信,现在在一个项目中需要更改为用电脑端上位机与蓝牙通讯的需求,在此记录自己走过的坑和积攒的经验。

weixin_40314351的博客 1万+

Android BLE蓝牙踩坑总结

简介 自从Android-BLE库开源了一段时间以来,越来越多的小伙伴问到了各种各样的关于BLE的奇怪问题,在这里我想跟大家分享一下本人对于Android BLE蓝牙的一些看法和解决方式,避免刚接触的小伙伴再次踩坑。 题外话 很多人曾问过我这个问题,为什么其他手机都没什么问题,就华为的一些手机老是连接不稳定,经常连接的很慢,而且连接上还经常断开。的确,在这里强调一下华为的一部分手机确实很容易出现这...

liulei823581722的博客 2840

uni-app 蓝牙开发

🔥 uniapp 蓝牙开发,蓝牙API分为通用蓝牙API和低功耗蓝牙的API,这里主要介绍低功耗蓝牙,应用场景广泛。

李赛赛的专栏 4210

C#ble低功耗蓝牙

弄了好久的C#WINFORM上的低功耗蓝牙,需要在WIN10上 VS2017上运行的。

opencv读取海康威视摄像头相关配置

1、开发环境 海康威视的网络摄像头使用: 开发工具:vs2015 C++ 海康SDK 2、相关操作 下载海康威视SDK:网址:http://www.hikvision.com/cn/download_61.html • 1:对照自己的开发平台可以下载设备网络SDK_Win32设备网络SDK_Win64,解压到本地文件下: • 2:VS配置 、Opencv配置。参考址 http://blog.youkuaiyun.com/poem_qianmo/article/details/19809337 (建议自己创

HMJ115的博客 984

android蓝牙ble发送广播,安卓源码中低功耗蓝牙BLE传统广播避坑指南

BLE广播避坑指南前几天和同事一起讨论基于蓝牙BLE实现的current time profile功能,发现不少安卓源码问题。那这篇文章我们就来扒一扒安卓源码中涉及BLE广播的那些坑,为蓝牙开发者少走些弯路尽点绵薄之力。对BLE传统广播还不了解的小伙伴建议提前了解相关知识,可以查看我前一篇文章《低功耗蓝牙BLE传统广播总结》。使能一个传统BLE广播,需要设置参数、数据,使能广播这几个流程,每个流程...

weixin_30019895的博客 2493

Zynq远程更新程序实战:从emmc到flash的完整方案解析

本文详细解析了Zynq远程更新程序的完整方案,重点探讨了从emmc到flash的实战操作。通过硬件连接限制破解、emmc配置技巧、flash擦写策略优化等关键技术点,提供了可靠的远程更新解决方案,特别适合需要频繁更新boot.bin的应用场景。

weixin_29163797的博客 179

android ble 的各种坑,再见,BLE的那些坑!

蓝牙,平常你用的多吗?上班路上戴着蓝牙耳机听音乐、看视频打开蓝牙分享个人热点给小伙伴们解锁共享单车时,打开蓝牙就能迅速解锁......BLE—蓝牙低能耗技术,方便了我们的生活,但是开发者在开发过程中却遇到了不少坑,尤其对小白用户来说坑真的太多了,都是安卓、iOS系统惹的祸。今天,柚子君给大家分享一个解决BLE那些坑的经验,希望能帮助更多人。项目中用到BLE模块时,要注意以下问题:❶ 用示例代码安卓...

weixin_36304352的博客 680

OTFS从零开始11 10

未来的无线网络有望提供全球覆盖,因此需要支持在恶劣环境下的各种新兴应用,例如飞机上的移动通信(MCA)、低地球轨道(LEO)卫星通信、车对车(V2V)通信、高速铁路(HSR)通信、无人驾驶飞机(UAV)通信和水下声学通信(UAC)。在这些恶劣环境中的无线信道通常被视为对通信不友好,其特点是严重的延迟和多普勒扩散,以及有限的路径寿命等。这些不利于通信的特性使目前移动网络中广泛采用的正交频分复用(OFDM)调制的性能恶化。

qq_46009045的博客 9851

《UDS协议从入门到精通》系列——图解0x14:清除诊断信息

图解0x14:清除诊断信息,简洁易懂,迅速上手!

车载系统攻城狮 4825

android ble 开发的各种坑

这段时间在做低功耗蓝牙 (BLE) 应用的开发(并不涉及蓝牙协议栈)。总体感觉 Android BLE 还是不太稳定,开发起来也是各种痛苦。这里记录一些杂项和开发中遇到的问题及其解决方法,避免大家踩坑。本文说的问题有些没有得到官方文档的验证,不过也有一些论坛帖子的支持,也可以算是有一定根据。Android 从 4.3(API Level 18) 开始支持低功耗蓝牙,但是只支持作为中心设备 (Cen...

王小_的博客 2026

PCL CSF布料模拟算法【2026最新版】

CSF布料模拟地面滤波算法的PCL实现,博客长期更新,本文最近更新时间为:2026年10月26日。

点云侠的博客 3917

Android BLE开发的各种坑

这段时间在做低功耗蓝牙 (BLE) 应用的开发(并不涉及蓝牙协议栈)。总体感觉 Android BLE 还是不太稳定,开发起来也是各种痛苦。这里记录一些杂项和开发中遇到的问题及其解决方法,避免大家踩坑。本文说的问题有些没有得到官方文档的验证,不过也有一些论坛帖子的支持,也可以算是有一定根据。 Android 从 4.3(API Level 18) 开始支持低功耗蓝牙,但是只支持作为中

breaknormal的博客 1436

迫零均衡前与迫零均衡后眼图对比附Matlab代码

迫零均衡(Decision Feedback Equalization,DFE)是一种常用的数字通信技术,用于抑制信号传输中的多径干扰。迫零均衡(Decision Feedback Equalization,DFE)是一种常用的数字通信技术,用于抑制信号传输中的多径干扰。眼图是一种常用的信号质量评估工具,通过绘制接收到的信号在时域上的波形,可以直观地观察到噪声、失真和干扰等问题。眼图是一种常用的信号质量评估工具,通过绘制接收到的信号在时域上的波形,可以直观地观察到噪声、失真和干扰等问题。

ByteSparkX的博客 459

RT-Thread Studio 使用笔记(七)| 配合STM32CubeMX添加裸机驱动(以ADC为例)

1. 配置STM32CubeMX 2. 复制stm32xxxx_hal_msp.c文件 将 CubeMx 生成的代码 stm32f7xx_hal_msp.c 函数复制到 RT-Thread Studio 生成的工程中,并参与工程编译: 由于我们并没有使用 CubeMx 生成的工程,所以这里需要将 stm32f7xx_hal_msp.c 文件中 #include “main.h” 替换为 #i...

Mculover666的博客(嵌入式) 9626

Android ble蓝牙开发介绍以及遇到的坑

Android ble蓝牙开发 BLE介绍 安卓4.3(API 18)为BLE的核心功能提供平台支持和API,App可以利用它来发现设备、查询服务和读写特性。相比传统的蓝牙,BLE更显著的特点是低功耗。这一优点使AndroidApp可以与具有低功耗要求的BLE设备通信,如近距离传感器、心脏速率监视器、健身设备等。 BLE开发 BLE权限添加 为了在app中使用蓝牙功能,必须声明蓝牙权限B

Mr_lu_的博客 6341

YOLO26训练自己的数据集,从代码下载到实例测试 (含YOLO26网络结构图)

在Windows10上配置CUDA环境教程2026年1月14日,YOLO26是最新发布的计算机视觉模型。支持多种任务,包括目标检测、实例分割、图像分类、姿态估计、有向目标检测以及物体跟踪等。以上就是YOLO26训练自己数据集的全部过程啦,欢迎大家在评论区交流~

Limiiiing的博客 6495

android10蓝牙搜不到ble设备_蓝牙欢乐爬坑行之一——为啥有的安卓手机搜索不到BLE设备...

对于Android6.0系统及以上的手机,需要添加定位权限,参考代码如下:并且需要在应用启动时候做下权限的检查,如果安装时候没有允许,需要代码主动去询问用户打开相关权限。参考代码如下:if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageM...

weixin_39954908的博客 589

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android ble notify,Android Ble notify功能踩坑

最近在研究Ble蓝牙相关的开发,在和蓝牙通信的时候,主动读取消息是ok的,但是就是无法收到蓝牙主动发送出来的消息,而且IOS是可以接收到消息的。这个就比较尴尬了。通过查阅文档和网上他人的博客找到开启notify功能的代码:private void setAutoReceiveData(BluetoothGatt gatt) {try {BluetoothGattService linkLossSe...

weixin_32227927的博客 1273

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android Ble notify功能踩坑

最近在研究Ble蓝牙相关的开发,在和蓝牙通信的时候,主动读取消息是ok的,但是就是无法收到蓝牙主动发送出来的消息,而且IOS是可以接收到消息的。这个就比较尴尬了。 通过查阅文档和网上他人的博客找到开启notify功能的代码: private void setAutoReceiveData(BluetoothGatt gatt) { try { ...

believer123的专栏 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

安卓蓝牙BLE开发实战:GATT协议避坑指南(附完整代码示例)

本文深入解析安卓蓝牙BLE开发中GATT协议的核心机制与常见陷阱,提供连接管理、数据读写及通知订阅的完整实战代码。重点剖析了状态机、重连策略和可靠通信细节,旨在帮助开发者构建稳定高效的蓝牙应用,有效规避连接断开、数据交互失败等典型问题。

gin88的博客 204
上一篇: 更改MAMP的mysql密码
下一篇: ECshop2.37开源程序 php5.6报错
myInterface
博客等级 码龄12年 2粉丝 17原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值