在 Android Studio 中实现蓝牙 SPP (串行端口配置) 的全面指南

蓝牙串行端口配置 (Serial Port Profile, SPP) 是连接和交换数据的一种常用方式。在本篇文章中,我将逐步引导您通过 Android Studio 实现蓝牙 SPP。首先,我们将展示实现的流程,然后逐步解析每一步所需的代码。

实现流程

实现蓝牙 SPP 的一般步骤如下所示:

序号 步骤 描述
1 添加权限 在应用中添加必要的蓝牙权限
2 初始化蓝牙 获取 BluetoothAdapter 对象
3 发现设备 搜索可用的蓝牙设备
4 连接设备 与目标设备建立连接
5 发送和接收数据 通过输入输出流进行数据通信
6 断开连接 关闭蓝牙连接

创建旅程图

journey
    title 蓝牙 SPP 实现旅程
    section 初始化
      添加权限: 5: 您
      初始化蓝牙: 5: 您
    section 连接设备
      发现设备: 5: 您
      连接设备: 5: 您
    section 数据传输
      发送数据: 5: 您
      接收数据: 5: 您
    section 清理
      断开连接: 5: 您

每一步的详细说明

1. 添加权限

在 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 开始需要位置权限 -->

2. 初始化蓝牙

在您的 Activity 中获取 BluetoothAdapter 对象,以便与蓝牙设备进行交互。

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // 获取设备的蓝牙适配器
if (bluetoothAdapter == null) {
    // 蓝牙未支持
    Log.e("TAG", "该设备不支持蓝牙");
}

if (!bluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); // 请求打开蓝牙
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

3. 发现设备

使用 BroadcastReceiver 来监听蓝牙设备的发现过程。

private final BroadcastReceiver broadcastReceiver = 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);
            Log.i("TAG", "找到设备: " + device.getName() + ", " + device.getAddress());
            // 可以将设备添加到 ListView 或 RecyclerView
        }
    }
};

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(broadcastReceiver, filter); // 注册 BroadcastReceiver
bluetoothAdapter.startDiscovery(); // 开始发现设备

4. 连接设备

与选定的蓝牙设备建立连接。要连接设备,您需要一个 BluetoothSocket

BluetoothDevice device = bluetoothAdapter.getRemoteDevice(deviceAddress); // 获取远程设备
BluetoothSocket socket = null;

try {
    socket = device.createRfcommSocketToServiceRecord(MY_UUID); // 使用特定的 UUID 创建连接
    socket.connect(); // 连接到设备
} catch (IOException e) {
    Log.e("TAG", "连接失败: " + e.getMessage());
}

Note: MY_UUID 需要设置为与蓝牙设备服务相匹配的 UUID。

5. 发送和接收数据

使用输入输出流来进行数据传输。

OutputStream outputStream = socket.getOutputStream(); // 获取输出流
InputStream inputStream = socket.getInputStream(); // 获取输入流

// 发送数据
String message = "Hello, Bluetooth!";
outputStream.write(message.getBytes()); // 将字符串转换为字节并发送

// 接收数据
byte[] buffer = new byte[1024]; // 接收数据缓冲区
int bytes; // 接收到的字节数
bytes = inputStream.read(buffer); // 从输入流中读取
String receivedMessage = new String(buffer, 0, bytes); // 转换字节为字符串
Log.i("TAG", "收到消息: " + receivedMessage);

6. 断开连接

一旦完成数据传输,关闭连接以释放资源。

try {
    socket.close(); // 关闭 socket 连接
} catch (IOException e) {
    Log.e("TAG", "关闭连接失败: " + e.getMessage());
}

关系图

erDiagram
    BLUETOOTH_USER {
        string name
        string phone
        string email
    }
    BLUETOOTH_DEVICE {
        string name
        string macAddress
    }
    BLUETOOTH_COMMUNICATION {
        date dateTime
        string data
    }
    BLUETOOTH_USER ||--o{ BLUETOOTH_COMMUNICATION : "initiates"
    BLUETOOTH_DEVICE ||--o{ BLUETOOTH_COMMUNICATION : "receives"

结论

通过以上步骤,您可以成功实现 Android 应用程序中的蓝牙串口配置 (SPP)。本文涵盖了从添加权限到数据传输的每一个细节。确保在开发过程中妥善处理异常,做好用户体验。同时,注意在使用蓝牙时遵循设备的安全实践。

希望这篇文章能帮助您顺利入门蓝牙 SPP 的开发!如果有任何问题或需要进一步的帮助,请随时交流。祝您开发顺利!