4. 建立经典蓝牙连接
任务说明
本案例目标是在Linux环境下,使用BlueZ协议栈实现经典蓝牙(BR/EDR)的设备发现、配对与连接,并最终建立一条RFCOMM通道用于数据通信。你需要在一台具备蓝牙适配器的Linux主机上完成全部操作,并通过实际的数据收发验证连接成功。
实现方案
采用BlueZ提供的标准工具链完成整个流程:使用bluetoothctl完成设备扫描与配对,使用rfcomm工具绑定并监听RFCOMM通道,最后通过串口工具进行数据收发验证。该方案不依赖额外编程,仅使用系统自带工具,确保最小可复现性。
操作步骤与代码
1. 环境准备与依赖检查
确保系统已安装BlueZ工具包,并确认蓝牙适配器正常工作:
# 检查bluez是否安装(Debian/Ubuntu)
dpkg -l | grep bluez
# 若未安装,执行:
sudo apt update && sudo apt install bluez bluez-tools
# 查看蓝牙适配器状态
hciconfig -a
# 预期输出应包含 hci0 设备,且 State: UP
2. 设备发现与配对
启动bluetoothctl交互工具,执行设备扫描与配对流程:
# 进入交互式命令行
bluetoothctl
# 在bluetoothctl提示符下依次执行:
power on
agent on
default-agent
scan on
# 等待数秒,观察目标设备(如手机或另一台蓝牙主机)出现在列表中
# 记录目标设备的MAC地址,格式如 XX:XX:XX:XX:XX:XX
# 找到后执行:
scan off
pair XX:XX:XX:XX:XX:XX
# 若设备需要PIN码,根据提示输入(通常为0000或1234)
# 配对成功后,建立信任关系并连接:
trust XX:XX:XX:XX:XX:XX
connect XX:XX:XX:XX:XX:XX
# 查看连接状态
info XX:XX:XX:XX:XX:XX
# 预期输出中 Connected: yes
# 退出bluetoothctl
exit
3. 建立RFCOMM通道
配对并建立ACL连接后,使用rfcomm工具绑定RFCOMM通道。以下命令在服务端(接收方)执行:
# 绑定RFCOMM通道1到虚拟串口设备/dev/rfcomm0
sudo rfcomm bind /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1
# 验证绑定状态
rfcomm show
# 预期输出包含:rfcomm0: XX:XX:XX:XX:XX:XX channel 1
客户端(发起方)执行相同绑定命令,但MAC地址替换为服务端地址:
sudo rfcomm bind /dev/rfcomm0 YY:YY:YY:YY:YY:YY 1
4. 数据收发验证
两端绑定成功后,通过虚拟串口进行数据通信验证。在服务端打开一个终端监听:
# 读取RFCOMM串口数据
cat /dev/rfcomm0
在客户端打开另一个终端发送测试数据:
# 向RFCOMM串口写入数据
echo "RFCOMM connection test" > /dev/rfcomm0
预期在服务端的cat终端中看到字符串RFCOMM connection test显示,证明RFCOMM通道已成功建立并双向可用。
验证方法与判定标准
按以下顺序逐项验证,全部满足即判定案例通过:
- 配对成功:
bluetoothctl中info命令显示Paired: yes; - ACL连接建立:
info命令显示Connected: yes; - RFCOMM绑定成功:
rfcomm show列出绑定的虚拟串口及对应远端地址; - 数据通路正常:客户端写入的数据在服务端
cat终端中完整显示,无乱码或丢失。
故障排查指引
若连接失败,按以下顺序检查:
- 适配器未开启:执行
hciconfig hci0 up后重试; - 配对超时:确保两端设备均处于可发现模式,且距离在10米内;
- RFCOMM绑定失败:先确认ACL连接已建立(
hcitool con查看),再检查通道号是否被占用(rfcomm show); - 数据无法收发:检查
/dev/rfcomm0是否存在且具有读写权限,必要时执行sudo chmod 666 /dev/rfcomm0。