蓝牙链路断开的原因

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

蓝牙链路也就是蓝牙专业人士说的ACL链路,所有的蓝牙操作都是在此基础上进行的,一旦ACL断开,那蓝牙功能必定无法使用。但蓝牙断开的原因很多,具体是啥原因?我们从何获取?带着这些疑问我们开始吧。

BluetoothDevice类中定义了ACL断开的广播为:

    /**
     * Broadcast Action: Indicates a low level (ACL) disconnection from a
     * remote device.
     * <p>Always contains the extra field {@link #EXTRA_DEVICE}.
     * <p>ACL connections are managed automatically by the Android Bluetooth
     * stack.
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive.
     */
    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    public static final String ACTION_ACL_DISCONNECTED =
            "android.bluetooth.device.action.ACL_DISCONNECTED";

广播里的内容包含了远端设备BluetoothDevice,无法知道ACL断开的具体原因,那就让我们从底层到上层梳理下ACL断开完成事件上报流程中是否有reason这个参数。

查看蓝牙协议Core_v5.0.pdf里Vol 2, Part E中的7.7.5的HCI事件Disconnection Complete Event:
在这里插入图片描述

协议里详细规定了上报ACL断开完成事件时是必须带有断开原因的参数,所有我们跟着ACL断开完成事件的上报流程来追踪reason参数存储在何处,下图为详细的上报时序图:

在这里插入图片描述

ACL断开完成事件的处理在bluedroid中有将reason保存,但最后回调上报JNI时却没带上该参数,导致蓝牙服务层没法知道断开原因。

到这里我们大致清楚ACL断开的reason还被保存在bluedroid中,没有上报给服务层,只需在合适的地方将该参数通过回调的方式上报给蓝牙服务即可。蓝牙服务广播ACL断开时添加reason参数就可被应用获取到断开原因,应用根据不同的断开原因采取不同的操作来完善蓝牙功能。

更多互联互通技术,欢迎关注微信公众号:Connectivity
在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值