22. FIND MY设备回连兼容处理

FIND MY设备必现支持RAP地址(可解析随机地址),每15分钟变化一次,需要通过 IRK值 判断设备的地址,从而回连设备。

22.1. 流程图

FIND MY设备回连流程图

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);
}