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蓝牙扫描的两种方式。