1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论
2. 欢迎大家关注和订阅,【精讲蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待!
目录
1. 蓝牙的开关状态
2. 蓝牙扫描广播
3. 蓝牙配对广播
4. 蓝牙连接状态广播
5. 蓝牙设备名称变化广播
5.1 BluetoothAdapter 广播
5.2 BluetoothDevice
前言
监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和BluetoothDevice这两个类中。可以通过在AndroidManifest.xml中注册静态广播,也可以通过在代码中注册动态广播,这两种形式的广播都可以监听到。
涉及到Bluetooth的广播,需要申请对应的权限
1. 蓝牙的开关状态
我们在开启和关闭蓝牙的时候,定义了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 StringACTION_REQUEST_ENABLE = "android.bluetooth.adapter.action.REQUEST_ENABLE";
// STATE_TURNING_OFF && STATE_OFF
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final StringACTION_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的方法,这个方法返回的就是对应的蓝牙状态值;
蓝牙状态值和状态机的映射关系:
STATE | VALUE | STATEMACHINE |
---|---|---|
STATE_OFF | 10 | OffState |
STATE_TURNING_ON | 11 | TurningOnState |
STATE_ON | 12 | OnState |
STATE_TURNING_OFF | 13 | TurningOffState |
STATE_BLE_TURNING_ON | 14 | TurningBleOnState |
STATE_BLE_ON | 15 | TurningBleOnState |
STATE_BLE_TURNING_OFF | 16 | TurningBleOffState |
开启/关闭蓝牙的广播发送之后,应用层可以通过监听广播 BluetoothAdapter.ACTION_STATE_CHANGED 来判断蓝牙是否打开/关闭;
2. 蓝牙扫描广播
蓝牙开启之后,我们就可以调用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();
//还有其他相关的信息
3. 蓝牙配对广播
在监听到可见的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); //配对的设备信息
4. 蓝牙连接状态广播
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); //连接的设备信息
5. 蓝牙设备名称变化广播
String ACTION_LOCAL_NAME_CHANGED = "android.bluetooth.adapter.action.LOCAL_NAME_CHANGED" ; //本地设备的蓝牙设备的名称变化 `BluetoothAdapter`
String ACTION_NAME_CHANGED = "android.bluetooth.device.action.NAME_CHANGED" ;// 远程设备的名称的变化 `BluetoothDevice`
5.1 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(低功耗蓝牙)状态下才会收到;
5.2 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
略