Android 蓝牙主动扫描与被动扫描
在Android开发中,蓝牙技术是实现设备间无线通讯的重要方式。蓝牙扫描可分为两种方式:主动扫描和被动扫描。本文将介绍这两种扫描方式的概念、原理及其实现方法,包括示例代码和流程图。
主动扫描与被动扫描
主动扫描
主动扫描是指设备主动作出操作,通过发送扫描请求,主动寻找附近的蓝牙设备。扫描请求可以根据特定的条件进行过滤,从而只获取符合条件的设备信息。
被动扫描
被动扫描是设备在监听其他蓝牙设备的广播信号。当有设备发送广播信息时,蓝牙适配器将被动接收这些信息。这种方式的优点是可节省资源,因为设备不需要频繁地发送请求。
二者的对比
特性 | 主动扫描 | 被动扫描 |
---|---|---|
设备控制 | 高 | 低 |
资源消耗 | 高 | 低 |
适用场景 | 需要精准获取设备信息 | 需要低功耗状态 |
实现流程
主动扫描流程
flowchart TD
A[开始主动扫描] --> B[获取蓝牙适配器]
B --> C[设置扫描参数]
C --> D[发起扫描请求]
D --> E[处理扫描结果]
E --> F[停止扫描]
F --> G[结束]
被动扫描流程
flowchart TD
A[开始被动扫描] --> B[获取蓝牙适配器]
B --> C[注册广播接收器]
C --> D[接收广播信息]
D --> E[处理接收到的信息]
E --> F[结束接收]
F --> G[结束]
主动扫描代码示例
以下是一个简单的主动扫描实现示例:
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanResult;
import android.content.Context;
import android.os.ParcelUuid;
public class BluetoothScanner {
private BluetoothAdapter bluetoothAdapter;
public BluetoothScanner(Context context) {
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
public void startScanning() {
if (bluetoothAdapter.isEnabled()) {
bluetoothAdapter.getBluetoothLeScanner().startScan(new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
// 处理扫描结果
System.out.println("Device found: " + result.getDevice().getName());
}
});
}
}
public void stopScanning() {
bluetoothAdapter.getBluetoothLeScanner().stopScan(new ScanCallback() {});
}
}
被动扫描代码示例
被动扫描通常通过注册广播接收器来接收蓝牙广播信号。以下是被动扫描的简单实现:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.bluetooth.BluetoothDevice;
public class BluetoothReceiver {
private Context context;
public BluetoothReceiver(Context context) {
this.context = context;
}
public void registerReceiver() {
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
context.registerReceiver(bluetoothReceiver, filter);
}
private final BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// 处理接收到的设备信息
System.out.println("Device found: " + device.getName());
}
}
};
public void unregisterReceiver() {
context.unregisterReceiver(bluetoothReceiver);
}
}
旅行图示例
journey
title 蓝牙扫描体验
section 主动扫描
用户启动扫描: 5: 用户
用户接收设备信息: 3: 用户
section 被动扫描
用户注册接收器: 4: 用户
用户接收广播信息: 3: 用户
结论
蓝牙扫描在安卓设备间的通讯中起着重要的作用。主动扫描和被动扫描各有其优缺点,开发者可以根据具体需求选择合适的方式。不论选择哪种方式,理解背后的原理和有效实现都是确保蓝牙功能正常工作的关键。希望本文能够帮助你更深入地理解Android蓝牙扫描的两种方式。