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