2 蓝牙代理模块
Note
1. 此模块只使用于
内置蓝牙代理实现2.
JL_BluetoothManager 是蓝牙接口管理, 1 蓝牙处理接口3.
BluetoothOperationImpl 是蓝牙功能具体实现, 1.2 蓝牙操作接口2.1 扫描蓝牙设备
2.1.1 开始扫描设备
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
//蓝牙事件监听器
final BTEventCallback btEventCallback = new BTEventCallback() {
@Override
public void onDiscoveryStatus(boolean bBle, boolean bStart) {
//回调发现设备状态
}
@Override
public void onDiscovery(BluetoothDevice device, BleScanMessage bleScanMessage) {
//回调发现的设备
}
};
//注册蓝牙事件监听器
btManager.addEventListener(btEventCallback);
int scanType = BluetoothConstant.SCAN_TYPE_BLE; //扫描设备类型 --- BLE设备
// BluetoothConstant.SCAN_TYPE_CLASSIC --- 经典蓝牙设备
int timeout = 30 * 1000; //搜索超时 --- 30秒
//执行扫描设备
btManager.scan(scanType, timeout);
//注销蓝牙事件监听器
// btManager.removeEventListener(btEventCallback);
Important
扫描蓝牙设备,需要确保
蓝牙已开启扫描蓝牙设备,需要确保
权限Android 6.0+,
蓝牙权限和位置权限Android 12.0+,
蓝牙搜索权限
扫描蓝牙设备,需要确保
位置服务已启用扫描蓝牙设备配置,参考 1.2.1 BluetoothOption
2.1.2 停止扫描设备
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
//执行停止扫描设备
btManager.stopScan();
2.2 连接设备
Important
连接设备操作,需要确保
蓝牙已打开连接设备操作,需要确保
权限已授予Android 6.0+, 需要
蓝牙权限和位置权限Android 12.0+, 需要
蓝牙连接权限
连接设备操作,不允许并发执行,必须线性进行。
连接设备操作,是指连接通讯协议(BLE/SPP), 不包括经典蓝牙服务。
2.2.1 连接设备的通讯方式
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
if (btManager.getBluetoothOperation().isConnecting()) return; //正在连接设备
final BluetoothDevice device = BluetoothUtil.getRemoteDevice("目标设备地址");
if (null == device) return;
//蓝牙事件监听器
final BTEventCallback btEventCallback = new BTEventCallback() {
@Override
public void onConnection(BluetoothDevice device, int status) {
//回调蓝牙连接状态
}
};
//注册蓝牙事件监听器
btManager.addEventListener(btEventCallback);
//执行连接设备
btManager.connect(device);
//执行断开设备
// btManager.disconnect(device);
//注销蓝牙事件监听器
// btManager.removeEventListener(btEventCallback);
2.2.2 连接设备的BLE
新版本
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
if (btManager.getBluetoothOperation().isConnecting()) return; //正在连接设备
final BluetoothDevice device = BluetoothUtil.getRemoteDevice("目标设备地址");
if (null == device) return;
//蓝牙事件监听器
final BTEventCallback btEventCallback = new BTEventCallback() {
@Override
public void onConnection(BluetoothDevice device, int status) {
//回调蓝牙连接状态
}
};
//注册蓝牙事件监听器
btManager.addEventListener(btEventCallback);
//执行连接设备的BLE
btManager.connect(device, BluetoothConstant.PROTOCOL_TYPE_BLE);
//执行断开BLE
// btManager.disconnect(device);
//注销蓝牙事件监听器
// btManager.removeEventListener(btEventCallback);
Note
SDK_V4.0.0以后支持
旧版本
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
final BluetoothDevice device = BluetoothUtil.getRemoteDevice("目标设备地址");
if (null == device) return;
//获取蓝牙功能实现对象
final IBluetoothOperation btOp = btManager.getBluetoothOperation();
//蓝牙事件回调
final BluetoothCallbackImpl bluetoothCallback = new BluetoothCallbackImpl() {
@Override
public void onBleConnection(BluetoothDevice device, int status) {
//回调BLE设备连接成功
}
};
//注册蓝牙事件回调
btOp.registerBluetoothCallback(bluetoothCallback);
//执行连接BLE操作
//result --- 操作结果
int result = btOp.connectBLEDevice(device);
//执行断开BLE
// btOp.disconnectBLEDevice(device);
//注销蓝牙事件回调
// btOp.unregisterBluetoothCallback(bluetoothCallback);
2.2.3 连接设备的SPP
新版本
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
final BluetoothDevice device = BluetoothUtil.getRemoteDevice("目标设备地址");
if (null == device) return;
//蓝牙事件监听器
final BTEventCallback btEventCallback = new BTEventCallback() {
@Override
public void onConnection(BluetoothDevice device, int status) {
//回调蓝牙连接状态
}
};
//注册蓝牙事件监听器
btManager.addEventListener(btEventCallback);
//执行连接设备的SPP
btManager.connect(device, BluetoothConstant.PROTOCOL_TYPE_SPP);
//执行断开SPP
// btManager.disconnect(device);
//注销蓝牙事件监听器
// btManager.removeEventListener(btEventCallback);
Note
SDK_V4.0.0以后支持
旧版本
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
final BluetoothDevice device = BluetoothUtil.getRemoteDevice("目标设备地址");
if (null == device) return;
//获取蓝牙功能实现对象
final IBluetoothOperation btOp = btManager.getBluetoothOperation();
//蓝牙事件回调
final BluetoothCallbackImpl bluetoothCallback = new BluetoothCallbackImpl() {
@Override
public void onSppStatus(BluetoothDevice device, int status) {
//回调SPP设备连接成功
}
};
//注册蓝牙事件回调
btOp.registerBluetoothCallback(bluetoothCallback);
//执行连接SPP操作
//result --- 操作结果
int result = btOp.connectSPPDevice(device);
//执行断开SPP
// btOp.disconnectSPPDevice(device);
//注销蓝牙事件回调
// btOp.unregisterBluetoothCallback(bluetoothCallback);
2.2.4 连接设备的经典蓝牙服务
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
final BluetoothDevice device = BluetoothUtil.getRemoteDevice("目标设备地址");
if (null == device) return;
//蓝牙事件监听器
final BTEventCallback btEventCallback = new BTEventCallback() {
@Override
public void onA2dpStatus(BluetoothDevice device, int status) {
//回调A2DP连接状态
}
@Override
public void onHfpStatus(BluetoothDevice device, int status) {
//回调HFP连接状态
}
};
//注册蓝牙事件监听器
btManager.addEventListener(btEventCallback);
//执行连接经典蓝牙设备
btManager.startConnectByBreProfiles(device);
//执行断开经典蓝牙
// btManager.disconnectByProfiles(device);
//注销蓝牙事件监听器
// btManager.removeEventListener(btEventCallback);
2.2.5 连接设备的Gatt Over BR/EDR
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
if (btManager.getBluetoothOperation().isConnecting()) return; //正在连接设备
//经典蓝牙地址
final BluetoothDevice device = BluetoothUtil.getRemoteDevice("目标设备地址");
if (null == device) return;
//蓝牙事件监听器
final BTEventCallback btEventCallback = new BTEventCallback() {
@Override
public void onConnection(BluetoothDevice device, int status) {
//回调蓝牙连接状态
}
};
//注册蓝牙事件监听器
btManager.addEventListener(btEventCallback);
//执行连接设备的Gatt Over BR/EDR
btManager.connect(device, BluetoothConstant.PROTOCOL_TYPE_GATT_OVER_BR_EDR);
//执行断开设备的连接
// btManager.disconnect(device);
//注销蓝牙事件监听器
// btManager.removeEventListener(btEventCallback);
Note
V4.2.0+ 版本才支持
2.3 数据读写
2.3.1 接收数据
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
//获取蓝牙功能实现对象
final IBluetoothOperation btOp = btManager.getBluetoothOperation();
//蓝牙事件回调
final BluetoothCallbackImpl bluetoothCallback = new BluetoothCallbackImpl() {
@Override
public void onBleDataNotification(BluetoothDevice device, UUID serviceUuid, UUID characteristicsUuid, byte[] data) {
//回调接收到的BLE数据
}
@Override
public void onSppDataNotification(BluetoothDevice device, byte[] data) {
//回调接收到的SPP数据
}
};
//注册蓝牙事件回调
btOp.registerBluetoothCallback(bluetoothCallback);
//注销蓝牙事件回调
// btOp.unregisterBluetoothCallback(bluetoothCallback);
Note
Gatt Over BR/EDR接收数据与BLE接收数据操作相同
2.3.2 发送数据
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
final BluetoothDevice device = BluetoothUtil.getRemoteDevice("目标设备地址");
if (null == device) return;
//data --- 发送数据
byte[] data = new byte[0];
//执行发数操作
//ret --- 操作结果
boolean ret = btManager.sendDataToDevice(device, data);
2.3.2.1 通过BLE发送数据
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
//获取蓝牙功能实现对象
final IBluetoothOperation btOp = btManager.getBluetoothOperation();
final BluetoothDevice device = BluetoothUtil.getRemoteDevice("目标设备地址");
if (null == device) return;
//data --- 发送数据
byte[] data = new byte[0];
//执行发数操作
//ret --- 操作结果
boolean ret = btOp.writeDataToBLEDevice(device, UUID.fromString("服务UUID"), UUID.fromString("写特征UUID"), data);
Note
Gatt Over BR/EDR发送数据与BLE发送数据操作相同,输入设备地址不同,分别为经典蓝牙地址和BLE地址
2.3.2.2 通过SPP发送数据
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
//获取蓝牙功能实现对象
final IBluetoothOperation btOp = btManager.getBluetoothOperation();
final BluetoothDevice device = BluetoothUtil.getRemoteDevice("目标设备地址");
if (null == device) return;
//data --- 发送数据
byte[] data = new byte[0];
//执行发数操作
//ret --- 操作结果
boolean ret = btOp.writeDataToSppDevice(device, UUID.fromString("通讯SPP的UUID"), data);
2.4 历史记录管理
2.4.1 获取历史记录列表
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
//获取历史记录列表
final List<HistoryBluetoothDevice> historyDevices = btManager.getHistoryBluetoothDeviceList();
2.4.2 回连历史记录
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
HistoryBluetoothDevice history = null; //历史记录, 不能为空
int timeout = 45 * 1000; //回连超时
//执行回连历史记录操作
btManager.reconnectHistoryBluetoothDevice(history, timeout, new OnReconnectHistoryRecordListener() {
@Override
public void onSuccess(HistoryBluetoothDevice history) {
//回调回连历史记录成功
}
@Override
public void onFailed(HistoryBluetoothDevice history, BaseError error) {
//回调回连历史记录失败
//history --- 历史记录
//error --- 错误信息
}
});
Note
2.4.2.1 HistoryBluetoothDevice
历史记录
public class HistoryBluetoothDevice implements Parcelable {
/**
* 蓝牙设备名称
*/
private String name;
/**
* 通讯方式类型
* <p>
* {@link BluetoothConstant#PROTOCOL_TYPE_BLE} --- BLE方式<br/>
* {@link BluetoothConstant#PROTOCOL_TYPE_SPP} --- SPP方式<br/>
* {@link BluetoothConstant#PROTOCOL_TYPE_GATT_OVER_BR_EDR} -- Gatt Over BR/EDR方式
* </p>
*/
@ConnectWay
private int type;
/**
* 设备地址
*/
@NonNull
private String address;
/**
* 映射地址
*/
private String mappedAddress;
/**
* 升级地址
*/
private String otaAddress;
/**
* 芯片类型
*/
private int chipType;
/**
* 设备类型
*/
private int deviceType;
/**
* 广播包协议的版本号
*/
private int advVersion;
/**
* 厂商ID
*/
private int vid;
/**
* 客户ID
*/
private int uid;
/**
* 产品ID
*/
private int pid;
/**
* 是否支持LE Audio
*/
private boolean isSupportLeAudio;
//left device gps(默认是左侧设备,也默认左侧设备是主机)
/**
* 左耳纬度
*/
private double leftDevLatitude;
/**
* 左耳经度
*/
private double leftDevLongitude;
/**
* 左耳GPS更新时间
*/
private long leftDevUpdateTime;
//right device gps
/**
* 右耳纬度
*/
private double rightDevLatitude;
/**
* 右耳经度
*/
private double rightDevLongitude;
/**
* 右耳GPS更新时间
*/
private long rightDevUpdateTime;
}
2.4.3 删除历史记录
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
HistoryBluetoothDevice history = null; //历史记录, 不能为空
//执行删除历史记录操作
btManager.removeHistoryDevice(history, new IActionCallback<HistoryBluetoothDevice>() {
@Override
public void onSuccess(HistoryBluetoothDevice message) {
//回调删除历史记录成功
}
@Override
public void onError(BaseError error) {
//回调删除历史记录失败
//error --- 错误信息
}
});
Note
2.4.4 清除所有历史记录
//获取蓝牙操作对象
final JL_BluetoothManager btManager = RCSPController.getInstance().getBluetoothManager();
if (null == btManager) return; //自定义蓝牙实现,btManager为空
//执行清除所有历史记录操作
btManager.clearHistoryDeviceRecord();
//注意,清除完成后,需要重新更新历史记录列表
final List<HistoryBluetoothDevice> historyDevices = btManager.getHistoryBluetoothDeviceList();