蓝牙acl 链路建立过程,蓝牙频繁断开连接怎么解决

蓝牙链路断开的原因蓝牙连接是使用蓝牙的基础,那蓝牙断开可能就不完全是我们能够控制的 。也就是说蓝牙链路的断开可能因为各种各样的原因,那本篇就带大家详解蓝牙断开的原因 。

蓝牙acl 链路建立过程,蓝牙频繁断开连接怎么解决

文章插图
蓝牙链路也就是蓝牙专业人士说的ACL链路,所有的蓝牙操作都是在此基础上进行的,一旦ACL断开,那蓝牙功能必定无法使用 。但蓝牙断开的原因很多,具体是啥原因?我们从何获?。看耪庑┮晌饰颐强及?。
BluetoothDevice类中定义了ACL断开的广播为:
蓝牙acl 链路建立过程,蓝牙频繁断开连接怎么解决

文章插图
广播里的内容只包含了远端设备BluetoothDevice,无法知道ACL断开的具体原因 , 那就让我们从底层到上层梳理下ACL断开完成事件上报流程中是否有reason这个参数 。
查看蓝牙协议Core_v5.0.pdf里Vol 2, Part E中的7.7.5的HCI事件Disconnection Complete Event:
蓝牙acl 链路建立过程,蓝牙频繁断开连接怎么解决

文章插图
协议里详细规定了上报ACL断开完成事件时是必须带有断开原因的参数 , 所有我们跟着ACL断开完成事件的上报流程来追踪reason参数存储在何处,下图为详细的上报时序图:
蓝牙acl 链路建立过程,蓝牙频繁断开连接怎么解决

文章插图
ACL断开完成事件的处理在bluedroid中有将reason保存 , 但最后回调上报JNI时却没带上该参数,导致蓝牙服务层没法知道断开原因 。
到这里我们大致清楚ACL断开的reason还被保存在bluedroid中 , 没有上报给服务层 , 只需在合适的地方将该参数通过回调的方式上报给蓝牙服务即可(参照下图在 btif_dm_upstreams_evt() 中的一种获取方式) 。蓝牙服务广播ACL断开时添加reason参数就可被应用获取到断开原因 , 应用根据不同的断开原因采取不同的操作来完善蓝牙功能 。
蓝牙acl 链路建立过程,蓝牙频繁断开连接怎么解决

文章插图
如何获取蓝牙ACL链路的断开原因就总结到这,期望能给大家一点启发 。感兴趣的小伙伴也欢迎私信留言一起讨论 。
蓝牙acl 链路建立过程,蓝牙频繁断开连接怎么解决

文章插图
为什么我的蓝牙耳机老自动断开连接?现在有不少朋友都在使用无线鼠标键盘、蓝牙耳机或其他无线设备,主要是足够的方便和便携 。但是不少人都经历过无线设备没反应或者延迟卡顿等烦人问题,简直能让人疯掉 。今天小编就教大家一招,轻松解决无线连接设备的延迟卡顿等问题 。
首先说明一点,这其实并不全是键盘鼠标或蓝牙耳机的质量问题 , 其最大的原因在于蓝牙受到无线路由器 WiFi 2.4Ghz 信号的影响干扰导致的……
蓝牙信号与 WiFi 一样都是工作在 2.4Ghz 频道上 , 而绝大部分有 USB 接收器的无线键鼠同样也是使用 2.4G 无线信号连接,因此如果你附近的无线路由器的 WiFi 2.4G 信号发射功率较高的话,就不可避免地对蓝设备或无线接收器造成干扰了,一天下来总有那么几次感到鼠标键盘或耳机短暂失灵 。
其实这个问题很多厂商都是知道的,因此不少专业一点的无线路由器上都提供有「Bluetooth Coexistence」(蓝牙共存模式) 的优化设置项,开启它之后可以大大缓解蓝牙无线的信号被 WiFi 干扰的问题?。ㄔ诓煌穆酚善骼锩? ,这个蓝牙共存模式的选项和名称不尽相同,需要细心找找,如果找不到 , 那就没办法了,要么忍,要么换!)
以小编的华硕 RT-AC88U 路由器 为例
首先进入「无线网络」的设置页,找到「专业设置」,频段选择「2.4Ghz」,之后就能找到 Bluetooth Coexistence 的选项了,启用它并应用即可