在 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 的开发!如果有任何问题或需要进一步的帮助,请随时交流。祝您开发顺利!