Android BLE-与外围设备连接后出现的问题

时间:2018-12-21 19:53:47

标签: android bluetooth-lowenergy

当前,我能够扫描蓝牙设备,找到合适的外围设备,连接到该外围设备,并写入特征/读取其响应。与外围设备连接后,问题开始发生。更糟糕的是,此行为在发生时是不一致的。随着时间的推移,它最终会遇到此问题,但有时是在第一次连接到外围设备之后,而有时是在多次交互之后。每当我停止并重新启动该应用程序时,单击“扫描”,就可以再次找到该设备,进行连接等。

我有一个想法是,重新扫描发生时,应用程序可能没有完全断开连接。这对于为什么应用程序找不到外围设备很有意义。但是,我不确定从外围设备断开连接时还要做什么。我认为扫描问题是发生另一种问题的征兆。

这是我的断开连接逻辑

public void stopService() {
    if (bluetoothGatt != null) {
        Log.d(BLE.TAG, "Closing bluetooth gatt connection...");
        bluetoothGatt.close();
    }

    bluetoothGatt = null;
    Log.d(BLE.TAG, "Updating service status...");
    updateState(BluetoothStatus.NONE);
}

更新状态是一种在状态更改时引发事件的方法

我要重写onConnectionStateChange方法

@RequiresPermission(Manifest.permission.BLUETOOTH)
    @Override
    public void onConnectionStateChange(final BluetoothGatt gatt, int status, final int newState) {
        super.onConnectionStateChange(gatt, status, newState);
        Log.v(BLE.TAG, "onConnectionStateChange: status: " + status + " newState: " + newState);
        if (status != BluetoothGatt.GATT_SUCCESS || newState == BluetoothProfile.STATE_DISCONNECTED) {
            gatt.close();
            stopService();
            updateState(BluetoothStatus.NONE);
        } else {
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                gatt.discoverServices();
            } else if (newState == BluetoothProfile.STATE_CONNECTING) {
                updateState(BluetoothStatus.CONNECTING);
            }
        }
    }

扫描逻辑

final BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {

    @RequiresPermission(Manifest.permission.BLUETOOTH)
    @Override
    public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
        List<UUID> uuids = parseUUIDs(scanRecord);
        if(uuids.contains(mConfig.uuid)) {
            if(!foundDeviceAddressList.contains(device.getAddress())) {
                Log.v(TAG, "onLeScan " + device.getName() + " mac address: " + device.getAddress() + " uuids: " + uuids);
                foundDeviceAddressList.add(device.getAddress());
                if (onScanCallback != null && (mConfig.uuid == null || uuids.contains(mConfig.uuid))) {
                    threadManager.runOnMainThread(new Runnable() {
                        @Override
                        public void run() {
                            onScanCallback.onDeviceDiscovered(device, rssi);
                        }
                    });
                }
            }
        }
    }
};

更新: 因此,即使调用stopService(),我也可以验证连接状态是否保持连接状态。有没有办法确定连接状态是否已回收?

0 个答案:

没有答案