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通道已成功建立并双向可用。

验证方法与判定标准

按以下顺序逐项验证,全部满足即判定案例通过:

  1. 配对成功:bluetoothctl中info命令显示Paired: yes;
  2. ACL连接建立:info命令显示Connected: yes;
  3. RFCOMM绑定成功:rfcomm show列出绑定的虚拟串口及对应远端地址;
  4. 数据通路正常:客户端写入的数据在服务端cat终端中完整显示,无乱码或丢失。
经典蓝牙BR/EDR连接建立流程 设备A(客户端) AA:AA:AA:AA:AA:AA 设备B(服务端) BB:BB:BB:BB:BB:BB ① Inquiry Scan (查询扫描) ② Page (寻呼) → ACL连接建立 ③ 配对与认证 (Pairing & Authentication) PIN码/Just Works 方式 ④ SDP服务发现 (查询RFCOMM通道) ⑤ RFCOMM通道建立 (channel 1) 绑定 /dev/rfcomm0 ⑥ 数据收发验证 echo "test" > /dev/rfcomm0 cat /dev/rfcomm0 显示数据 BlueZ协议栈 (BR/EDR) BlueZ协议栈 (BR/EDR) 查询 连接 配对 SDP RFCOMM

故障排查指引

若连接失败,按以下顺序检查:

  • 适配器未开启:执行hciconfig hci0 up后重试;
  • 配对超时:确保两端设备均处于可发现模式,且距离在10米内;
  • RFCOMM绑定失败:先确认ACL连接已建立(hcitool con查看),再检查通道号是否被占用(rfcomm show);
  • 数据无法收发:检查/dev/rfcomm0是否存在且具有读写权限,必要时执行sudo chmod 666 /dev/rfcomm0。