Android 蓝牙广播发送数据

随着智能设备的普及,蓝牙技术在手机、电脑等设备间的数据传输变得愈发重要。Android 提供了丰富的 API,使得开发者能够轻松实现蓝牙的广播功能。在本文中,我们将探讨如何在 Android 中发送蓝牙广播数据,并通过代码示例来进行展示。

一、蓝牙广播的基本概念

什么是蓝牙广播?

蓝牙广播是一种数据传输方式,允许设备(如智能手机、传感器等)通过无线电波在一定范围内发送信息。广播数据可以被周围的蓝牙设备接收,这种方式特别适用于小型数据传输。

Android 中的蓝牙广播

Android 为蓝牙广播提供了 BluetoothLeAdvertiser 类。通过这个类,开发者可以进行蓝牙低能耗(BLE)的广播。BLE 广播具有耗电量低、连接速度快等优点。

二、准备工作

在开始编写代码之前,我们需要确保项目中已添加蓝牙权限。在 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

注意,自 Android 6.0 以后,访问蓝牙设备需要获取位置权限。

三、广播数据发送流程

步骤 1: 初始化蓝牙适配器

首先,我们需要获取设备的蓝牙适配器。以下是如何初始化蓝牙适配器的代码示例:

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

步骤 2: 创建广播数据

接下来,我们需要定义要广播的数据。这可以通过构建一个 AdvertiseData 对象来实现。以下是一个示例:

// 创建广告数据
AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
dataBuilder.addManufacturerData(12345, "Hello World".getBytes());
AdvertiseData advertiseData = dataBuilder.build();

在这个示例中,我们向广播中添加了一个制造商数据(Manufacturer Data)。

步骤 3: 创建广告设置

设定广播参数,通常需要定义广播模式、广播间隔等。以下是一个示例:

AdvertiseSettings settings = new AdvertiseSettings.Builder()
        .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
        .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
        .setConnectable(true)
        .setTimeout(0)
        .build();

步骤 4: 开始广播

我们现在可以正式开始广播数据。在这个步骤中,使用 BluetoothLeAdvertiser 来启动广播:

BluetoothLeAdvertiser advertiser = bluetoothAdapter.getBluetoothLeAdvertiser();
advertiser.startAdvertising(settings, advertiseData, new AdvertiseCallback() {
    @Override
    public void onStartSuccess(AdvertiseSettings settingsInEffect) {
        Log.i("Bluetooth", "Advertising started successfully");
    }

    @Override
    public void onStartFailure(int errorCode) {
        Log.e("Bluetooth", "Advertising failed: " + errorCode);
    }
});

四、完整的代码示例

下面是一个完整的示例代码,展示了如何在 Android 中实现蓝牙广播数据的发送:

public class MainActivity extends AppCompatActivity {
    private BluetoothAdapter bluetoothAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // Initialize Bluetooth Adapter
        BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        bluetoothAdapter = bluetoothManager.getAdapter();
        
        // Start advertising
        startAdvertising();
    }

    private void startAdvertising() {
        AdvertiseData advertiseData = new AdvertiseData.Builder()
                .addManufacturerData(12345, "Hello World".getBytes())
                .build();

        AdvertiseSettings settings = new AdvertiseSettings.Builder()
                .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
                .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
                .setConnectable(true)
                .setTimeout(0)
                .build();

        BluetoothLeAdvertiser advertiser = bluetoothAdapter.getBluetoothLeAdvertiser();
        advertiser.startAdvertising(settings, advertiseData, new AdvertiseCallback() {
            @Override
            public void onStartSuccess(AdvertiseSettings settingsInEffect) {
                Toast.makeText(MainActivity.this, "Advertising started successfully", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onStartFailure(int errorCode) {
                Toast.makeText(MainActivity.this, "Advertising failed: " + errorCode, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

五、类图

以下是该蓝牙广播功能的类图,展示了主要类及其关系。

classDiagram
    class MainActivity {
        +BluetoothAdapter bluetoothAdapter
        +void onCreate(Bundle savedInstanceState)
        +void startAdvertising()
    }
    class AdvertiseData {
        +static class Builder
        +addManufacturerData(int manufacturerId, byte[] data)
        +build()
    }
    class AdvertiseSettings {
        +static class Builder
        +setAdvertiseMode(int mode)
        +setTxPowerLevel(int level)
        +setConnectable(boolean connectable)
        +setTimeout(int timeout)
        +build()
    }
    class BluetoothLeAdvertiser {
        +startAdvertising(AdvertiseSettings settings, AdvertiseData data, AdvertiseCallback callback)
    }
    class AdvertiseCallback {
        +void onStartSuccess(AdvertiseSettings settingsInEffect)
        +void onStartFailure(int errorCode)
    }

    MainActivity --> BluetoothAdapter
    MainActivity --> AdvertiseData
    MainActivity --> AdvertiseSettings
    AdvertiseSettings --> AdvertiseData
    BluetoothLeAdvertiser --> AdvertiseCallback

结尾

通过本文,我们了解了 Android 中蓝牙广播的基本概念、实现步骤以及完整的代码示例。蓝牙广播是一项非常实用的技术,适用于各种场景,如设备定位、数据同步等。随着蓝牙技术的不断发展,我们可以预见其在未来的智慧生活中将发挥更加重要的作用。希望本文能对您理解和使用 Android 蓝牙广播有所帮助!