22. FIND MY设备回连兼容处理
FIND MY设备必现支持RAP地址(可解析随机地址),每15分钟变化一次,需要通过 IRK值 判断设备的地址,从而回连设备。
22.1. 流程图
22.2. 同步IRK信息
//获取手表实现类
WatchManager watchManager = WatchManager.getInstance();
//获取操作设备
final BluetoothDevice device = watchManager.getConnectedDevice();
if (null == device) return; //设备未连接
targetAddress = device.getAddress(); //缓存目标设备地址
//注册手表事件监听器
watchManager.registerOnRcspEventListener(new OnRcspEventListener() {
@Override
public void onIrkMessage(BluetoothDevice device, IrkMessage irkMessage) {
//回调IRK信息(设备主动推送 或者 APP端主动请求)
//移除手表事件监听器
watchManager.unregisterOnRcspEventListener(this);
//缓存IRK信息
final IHistoryRecordOp dbHelper = BluetoothManager.getInstance().getHistoryRecordHelper();
final HistoryRecord historyRecord = dbHelper.getHistoryRecord(device.getAddress());
if (null == historyRecord) return;
final String cacheIrkMsg = historyRecord.getIrkValue();
String irkValue = CHexConver.byte2HexStr(irkMessage.getIrkValue());
if (!TextUtils.equals(cacheIrkMsg, irkValue)) {
historyRecord.setIrkValue(irkValue);
//更新数据库
dbHelper.updateHistoryRecord(historyRecord);
}
}
});
//执行同步IRK信息
watchManager.syncIrkMessage(new OnWatchOpCallback<IrkMessage>() {
@Override
public void onSuccess(IrkMessage result) {
//回调操作成功
//也会触发 OnRcspEventListener#onIrkMessage 的回调
//result --- IRK信息
}
@Override
public void onFailed(BaseError error) {
//回调操作失败
//error --- 错误信息
}
});
22.3. 回连FIND MY设备
if (!CHexConver.checkBluetoothAddress(targetAddress)) return; //没有目标设备地址
final BluetoothManager btManager = BluetoothManager.getInstance();
final HistoryRecord historyRecord = btManager.getHistoryRecord(targetAddress);
final String irkValue = null == historyRecord ? "" : historyRecord.getIrkValue();
if (TextUtils.isEmpty(irkValue)) return; //没有IRK信息
final byte[] irkInfo = CHexConver.hexStr2Bytes(irkValue);
BluetoothEventCallback callback = new BluetoothEventCallback() {
@Override
public void onDiscoveryStatus(boolean bBle, boolean bStart) {
super.onDiscoveryStatus(bBle, bStart);
if (!bStart) {
btManager.unregisterBluetoothCallback(this);
}
}
@Override
public void onDiscovery(BluetoothDevice device, BleScanMessage bleScanMessage) {
if (null == device) return;
// 检查设备是否回连设备
if (ParseDataUtil.isRightRPA(device.getAddress(), irkInfo)) {
//停止蓝牙搜索
btManager.stopBLEScan();
//回连设备
btManager.connectBtDevice(device, BluetoothConstant.PROTOCOL_TYPE_BLE);
}
}
};
//注册蓝牙事件监听
btManager.registerBluetoothCallback(callback);
//开始搜索BLE设备
if (!btManager.startBLEScan(30 * 1000)) {
//开始搜索BLE设备失败
btManager.unregisterBluetoothCallback(callback);
}