Android 低功耗蓝牙扫描除去重复MAC

引言

在开发低功耗蓝牙(BLE)应用程序时,一个常见的需求是扫描附近的BLE设备并获取它们的MAC地址。然而,在扫描过程中,我们可能会遇到重复的MAC地址,这对于我们后续处理设备可能会造成困扰。因此,本文将介绍如何在Android中进行低功耗蓝牙扫描,并去除重复的MAC地址。

Android 低功耗蓝牙扫描

在Android中,我们可以使用BluetoothLeScanner类来进行低功耗蓝牙扫描。首先,我们需要获取BluetoothAdapter来获取BluetoothLeScanner实例,并注册一个ScanCallback来处理扫描结果。

BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();

ScanCallback scanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        // 处理扫描结果
    }
};

接下来,我们可以调用startScan方法来启动扫描,并在需要停止扫描时调用stopScan方法。

bluetoothLeScanner.startScan(scanCallback);

// 在需要停止扫描时调用
bluetoothLeScanner.stopScan(scanCallback);

去除重复MAC地址

为了去除重复的MAC地址,我们可以使用Set数据结构来存储扫描到的MAC地址。Set是一个不允许重复元素的集合,因此,当我们将扫描到的MAC地址添加到Set中时,重复的MAC地址将被自动去除。

Set<String> macSet = new HashSet<>();

ScanCallback scanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        String macAddress = result.getDevice().getAddress();
        macSet.add(macAddress);
    }
};

完整示例代码

下面是一个完整的示例代码,展示了如何进行低功耗蓝牙扫描并去除重复的MAC地址。

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothLeScanner;
import android.bluetooth.BluetoothManager;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanResult;
import android.content.Context;

import java.util.HashSet;
import java.util.Set;

public class BluetoothScanner {

    private Set<String> macSet;
    private ScanCallback scanCallback;

    public BluetoothScanner(Context context) {
        macSet = new HashSet<>();
        BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
        BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
        BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();

        scanCallback = new ScanCallback() {
            @Override
            public void onScanResult(int callbackType, ScanResult result) {
                String macAddress = result.getDevice().getAddress();
                macSet.add(macAddress);
            }
        };
    }

    public void startScan() {
        bluetoothLeScanner.startScan(scanCallback);
    }

    public void stopScan() {
        bluetoothLeScanner.stopScan(scanCallback);
    }

    public Set<String> getUniqueMacAddresses() {
        return macSet;
    }
}

类图

下面是该示例代码的类图:

classDiagram
    BluetoothScanner -- BluetoothManager
    BluetoothScanner -- BluetoothAdapter
    BluetoothScanner -- BluetoothLeScanner

序列图

下面是一个扫描并去除重复MAC地址的序列图示例:

sequenceDiagram
    participant App
    participant BluetoothScanner
    participant BluetoothManager
    participant BluetoothAdapter
    participant BluetoothLeScanner
    
    App->>+BluetoothScanner: 创建实例
    BluetoothScanner->>BluetoothManager: 获取BluetoothManager
    BluetoothScanner->>BluetoothAdapter: 获取BluetoothAdapter
    BluetoothScanner->>BluetoothLeScanner: 获取BluetoothLeScanner
    App->>+BluetoothScanner: 启动扫描
    BluetoothScanner->>BluetoothLeScanner: 调用startScan
    BluetoothLeScanner->>BluetoothScanner: 扫描结果
    BluetoothScanner->>+macSet: 添加MAC地址
    BluetoothScanner-->>-macSet: 返回去除重复MAC地址的集合
    App->>+BluetoothScanner: 停止扫描
    BluetoothScanner->>BluetoothLeScanner: 调用stopScan