BT_ 广播

179 阅读7分钟

基于Android P版本分析

BT 广播

监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和BluetoothDevice这两个类中。可以通过在AndroidManifest.xml中注册静态广播,也可以通过在代码中注册动态广播,这两种形式的广播都可以监听到。

涉及到Bluetooth的广播,需要申请对应的权限;

蓝牙开关状态广播

蓝牙的开关状态

我们在开启和关闭蓝牙的时候,定义了7种蓝牙的开光状态,在BluetoothAdapter中定义,其中包含了3种低功耗下的蓝牙状态:

public static final int STATE_OFF = 10;
public static final int STATE_TURNING_ON = 11;
public static final int STATE_ON = 12;
public static final int STATE_TURNING_OFF = 13;
​
public static final int STATE_BLE_TURNING_ON = 14;
public static final int STATE_BLE_ON = 15;
public static final int STATE_BLE_TURNING_OFF = 16;

4种蓝牙状态分别对应的广播为:

// STATE_TURNING_ON && STATE_ON
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String
    ACTION_REQUEST_ENABLE = "android.bluetooth.adapter.action.REQUEST_ENABLE";
​
// STATE_TURNING_OFF && STATE_OFF
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String
    ACTION_REQUEST_DISABLE = "android.bluetooth.adapter.action.REQUEST_DISABLE";

这里我们需要注意一下,在这两个广播之前都注解了@SdkConstant,标注了该广播是通过Activity的intent action方式启动的,即通过startActivityForResult的方式就可以发送广播;

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, Constants.REQUEST_ENABLE_BT);

在开启/关闭蓝牙的时候,在每一个状态机中都存在一个对应的状态,其中有一个getStateValue的方法,这个方法返回的就是对应的蓝牙状态值;

蓝牙状态值和状态机的映射关系:

STATEVALUESTATEMACHINE
STATE_OFF10OffState
STATE_TURNING_ON11TurningOnState
STATE_ON12OnState
STATE_TURNING_OFF13TurningOffState
STATE_BLE_TURNING_ON14TurningBleOnState
STATE_BLE_ON15TurningBleOnState
STATE_BLE_TURNING_OFF16TurningBleOffState

开启/关闭蓝牙的广播发送之后,应用层可以通过监听广播 BluetoothAdapter.ACTION_STATE_CHANGED 来判断蓝牙是否打开/关闭;

蓝牙扫描广播

蓝牙开启之后,我们就可以调用BluetoothAdapter的startDiscovery方法来扫描设备周围可见的蓝牙设备,而startDiscovery会触发下面的广播:

String ACTION_DISCOVERY_STARTED = "android.bluetooth.adapter.action.DISCOVERY_STARTED";  //开始扫描
String ACTION_DISCOVERY_FINISHED = "android.bluetooth.adapter.action.DISCOVERY_FINISHED"; //扫描结束

这两个广播同样是定义在BluetoothAdapter中,用于触发扫描动作;

在扫描到可用的设备后,还会触发广播:

String ACTION_FOUND = "android.bluetooth.device.action.FOUND"

这个广播就属于BluetoothDevice中定义的广播了,意为找到可见蓝牙设备,同时监听中也会返回该Device包含的一些信息,用于后续的配对和连接操作;

在监听到ACTION_FOUND广播之后,应用层可以通过如下的方式获取到BluetoothDevice的信息:

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String name = device.getName();
String addr = device.getAddress();
//还有其他相关的信息

蓝牙配对广播

在监听到可见的BluetoothDevice之后,会通过BluetoothDevice来进行配对操作,而在配对过程中,会监听如下广播:

String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST";

同样,这个广播也是定义在BluetoothDevice,一是因为这个过程是发生在扫描操作之后的,此时已经获取到了可见的蓝牙设备,二是该操作主要是针对蓝牙设备进行操作的;

对应的还有一个监听蓝牙配对状态的广播,意为用于监听绑定状态:

String ACTION_BOND_STATE_CHANGED = "android.bluetooth.device.action.BOND_STATE_CHANGED";

配对的状态值,包含3个状态:

public static final int BOND_NONE = 10 // 未配对
public static final int BOND_BONDING = 11 // 正在配对
public static final int BOND_BONDED = 12 // 已配对

同时,BluetoothDevice也支持主动获取配对的状态值:

int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE); //当前的配对的状态
​
int state = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.BOND_NONE); //前一次的配对状态
​
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); //配对的设备信息

蓝牙连接状态广播

BluetoothDevice配对成功之后,就可以进行设备连接了,连接设备可以通过监听下面的广播来判断设备是否连接成功:

String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED";

对应的连接状态值:

int STATE_DISCONNECTED = 0; //未连接
int STATE_CONNECTING = 1; //连接中
int STATE_CONNECTED = 2; //连接成功

同样,也可以获取连接的一些状态信息:

int state = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, BluetoothAdapter.ERROR); //当前的连接状态
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_CONNECTION_STATE, BluetoothAdapter.ERROR); //前一次的连接状态
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); //连接的设备信息

蓝牙设备名称变化广播

String ACTION_LOCAL_NAME_CHANGED = "android.bluetooth.adapter.action.LOCAL_NAME_CHANGED" ; //本地设备的蓝牙设备的名称变化 `BluetoothAdapter`
String ACTION_NAME_CHANGED = "android.bluetooth.device.action.NAME_CHANGED" ;// 远程设备的名称的变化 `BluetoothDevice`

BluetoothAdapter 广播

ACTION_STATE_CHANGED

本地蓝牙适配器变化,如蓝牙打开、关闭;

  • EXTRA_STATE:int类型,表示当前状态,值域为STATE_OFF、STATE_TURNING_ON、STATE_ON、STATE_TURNING_OFF,不包含BLE类型的状态值;
  • EXTRA_PREVIOUS_STATE:int类型,表示之前的状态值

ACTION_SCAN_MODE_CHANGED

本地适配器的扫描模式改变;

  • EXTRA_SCAN_MODE:int类型,表示扫描模式,有3个值定义:

    • SCAN_MODE_NONE:不能被发现,不能被连接
    • SCAN_MODE_CONNECTABLE:不能被发现,但是之前已经发现该设备的其他设备可以主动连接
    • SCAN_MODE_CONNECTABLE_DISCOVERABLE:可以被发现和连接
  • EXTRA_PREVIOUS_SCAN_MODE:int类型,表示之前的扫描模式

ACTION_DISCOVERY_STARTED

开始扫描远程设备;

ACTION_DISCOVERY_FINISHED

扫描结束;

ACTION_LOCAL_NAME_CHANGED

本地蓝牙设备名称改变;

  • EXTRA_LOCAL_NAME:String类型,改变后的名称;

ACTION_CONNECTION_STATE_CHANGED

当所有连接都断开或者是初次建立连接时发出此广播;

  • EXTRA_CONNECTION_STATE:int类型,表示当前连接状态,值域为STATE_DISCONNECTED、STATE_CONNECTING、STATE_CONNECTEDSTATE_DISCONNECTING;
  • EXTRA_PREVIOUS_CONNECTION_STATE:表示之前的连接状态;
  • EXTRA_DEVICE:返回的一个远程设备对象;

ACTION_BLE_STATE_CHANGED

蓝牙适配器状态改变为LE模式,或者从LE模式改变为其他模式;

ACTION_BLUETOOTH_ADDRESS_CHANGED

表示本地蓝牙适配器地址改变;

  • EXTRA_BLUETOOTH_ADDRESS:String类型,表示改变后的地址;

ACTION_BLE_ACL_CONNECTED

表示一个acl连接建立,这个广播只有蓝牙适配器在STATE_BLE_ON(低功耗蓝牙)状态下才会收到;

ACTION_BLE_ACL_DISCONNECTED

表示一个acl连接断开,这个广播只有蓝牙适配器在STATE_BLE_ON(低功耗蓝牙)状态下才会收到;

BluetoothDevice

ACTION_FOUND

表示发现远程设备

  • EXTRA_DEVICE:返回一个BluetoothDevice对象;
  • EXTRA_CLASS:返回一个BluetoothClass对象;
  • EXTRA_NAME:String类型,表示蓝牙设备名称;
  • EXTRA_RSSI:short类型,表示信号强度;

ACTION_DISAPPEARED

表示远程设备消失,当之前发现的设备在当前未发现时发出;

  • EXTRA_DEVICE:表示该远程设备;

ACTION_CLASS_CHANGED

表示远程设备的蓝牙class改变;

  • EXTRA_DEVICE:返回一个BluetoothDevice对象
  • EXTRA_CLASS:返回一个BluetoothClass对象,代表改变后的class对象

ACTION_ACL_CONNECTED

表示已建立一个低级连接(ACL连接是由蓝牙栈自动管理的)

  • EXTRA_DEVICE:代表建立低级连接的Device;

ACTION_ACL_DISCONNECT_REQUESTED

表示远程设备请求断开ACL连接,而且这个ACL连接很快要断开;

  • EXTRA_DEVICE:代表与之有关联的Device;

ACTION_ACL_DISCONNECTED

表示与远程设备的ACL连接断开

  • EXTRA_DEVICE:代表与之有关联的Device;

ACTION_NAME_CHANGED

表示第一次获取远程设备名称或者远程设备名称改变;

  • EXTRA_DEVICE:与之关联的远程设备;
  • EXTRA_NAME:name的首次获取或变更后的name;

ACTION_ALIAS_CHANGED

表示远程设备别名改变;

  • EXTRA_DEVICE:代表与之有关联的Device;

ACTION_BOND_STATE_CHANGED

表示某个远程设备的绑定状态的改变;

  • EXTRA_DEVICE:绑定的远程设备
  • EXTRA_BOND_STATE:int类型,代表当前绑定状态,值域为BOND_NONE、BOND_BONDING、BOND_BONDED
  • EXTRA_PREVIOUS_BOND_STATE:int类型,之前的绑定状态
  • EXTRA_REASON:int类型,如果EXTRA_BOND_STATE为BOND_NONE,则会出现此extra,表示原因;

ACTION_SDP_RECORD

ACTION_UUID

表示扫描时获取到远程设备的UUID;

  • EXTRA_DEVICE:与之关联的远程设备;
  • EXTRA_UUID:该远程设备对应的UUID

ACTION_MAS_INSTANCE

ACTION_PAIRING_REQUEST

表示发现一个配对请求

  • EXTRA_REASON:int类型,代表断开连接的原因;

  • EXTRA_PAIRING_VARIANT:int类型,表示配对使用的方法,值域有两个:

    • PAIRING_VARIANT_PIN:使用密码配对
    • PAIRING_VARIANT_PASSKEY_CONFIRMATION:使用配对码配对
  • EXTRA_PAIRING_KEY:int类型,表示配对码的值

ACTION_PAIRING_CANCEL

ACTION_CONNECTION_ACCESS_REQUEST

ACTION_CONNECTION_ACCESS_REPLY

ACTION_CONNECTION_ACCESS_CANCEL