在 Linux 系统中,HCI(Host Controller Interface) 是蓝牙协议栈中用于与底层蓝牙硬件(如 USB 蓝牙适配器或串口连接的蓝牙模块)通信的接口。如果你需要将 串口设备(如 UART 连接的蓝牙模块) 指定为 HCI 接口(例如 hci0),需要使用 hciattach 工具将其绑定到 BlueZ 协议栈。以下是详细操作步骤:
1. 确认硬件支持 HCI over UART
某些蓝牙模块(如基于 Broadcom (BCM)、Qualcomm (ATH3K) 或 Nordic (nRF) 的芯片)支持通过串口(UART)运行 HCI 协议。需确保:
- 蓝牙模块硬件支持 HCI 模式。
- 模块的串口已正确连接到主机(如通过 USB-UART 转换器)。
- 内核包含对应驱动(如
hci_uart)。
2. 加载内核驱动
加载 HCI over UART 所需的内核模块:
# 加载通用 HCI UART 驱动
sudo modprobe hci_uart
# 根据芯片类型加载特定驱动(例如 BCM 芯片)
sudo modprobe btbcm
sudo modprobe bluetooth_uart
3. 使用 hciattach 绑定串口到 HCI
通过 hciattach 工具将串口设备绑定为 HCI 接口(如 hci0):
sudo hciattach /dev/ttyS0 bcm 921600
/dev/ttyS0:串口设备路径(根据实际连接调整,如/dev/ttyUSB0)。bcm:蓝牙芯片类型(常见类型:bcm、ath3k、nxp、qualcomm)。921600:波特率(需与蓝牙模块配置匹配,常见值如115200、921600)。
4. 验证 HCI 接口
绑定成功后,检查 HCI 接口状态:
hciconfig -a
输出应包含类似内容:
plaintext
hci0: Type: Primary Bus: UART
BD Address: 00:11:22:33:44:55 ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING
RX bytes:1234 acl:0 sco:0 events:123 errors:0
TX bytes:1234 acl:0 sco:0 commands:123 errors:0
5. 初始化蓝牙服务
启动或重启蓝牙服务以激活 HCI 接口:
sudo systemctl restart bluetooth
6. 自动绑定(开机启动)
创建 Systemd 服务文件,实现开机自动绑定:
# 创建服务文件
sudo nano /etc/systemd/system/hciattach.service
添加以下内容(根据实际参数调整):
plaintext
[Unit]
Description=Attach HCI over UART
After=syslog.target
[Service]
Type=simple
ExecStart=/usr/bin/hciattach /dev/ttyS0 bcm 921600
Restart=on-failure
[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl enable hciattach
sudo systemctl start hciattach
7. 常见问题排查
① 绑定失败(hciattach 报错)
- 驱动问题:确认内核支持芯片类型,尝试其他驱动参数(如
bcm改为nxp)。 - 权限问题:确保用户有权访问
/dev/ttyS*(将用户加入dialout或tty组):sudo usermod -aG dialout $USER - 波特率不匹配:检查蓝牙模块文档,确认正确的波特率。
② 无 HCI 接口
- 使用
dmesg | grep Bluetooth查看内核日志,确认驱动加载和初始化过程。
③ 芯片类型不匹配
- 尝试常见类型:
bcm、ath3k、nxp、intel、qualcomm。 - 某些模块需先发送初始化命令(参考厂商文档)。
8. 嵌入式场景补充
对于嵌入式开发板(如树莓派、ESP32),可能需要通过设备树(Device Tree)配置 UART 引脚和蓝牙模块。例如,在树莓派中:
# 在 /boot/config.txt 中添加
dtoverlay=pi3-miniuart-bt # 禁用默认蓝牙,使用自定义串口
dtoverlay=my-custom-bt-overlay
总结
通过 hciattach 将串口设备绑定为 HCI 接口,适用于需要通过 UART 连接蓝牙模块的场景(如嵌入式开发)。关键步骤包括:
- 确认硬件和驱动支持。
- 使用
hciattach绑定串口。 - 配置开机自动启动。
以下是 hciattach、hciconfig 和 hcitool 三个工具的功能侧重点、典型用法及协作关系的详细讲解:
1. hciattach
功能侧重点
- 核心作用:将串口设备(如 UART 连接的蓝牙模块)绑定到 HCI 接口(如
hci0),使其能被 BlueZ 协议栈识别和管理。 - 适用场景:
- 嵌入式系统中通过串口(如
/dev/ttyS0)连接蓝牙模块。 - 初始化需要特定波特率或协议的蓝牙硬件(如 BCM、Nordic 芯片)。
- 嵌入式系统中通过串口(如
- 依赖条件:需加载对应的内核驱动(如
hci_uart)。
典型用法
- 绑定串口到 HCI 接口:# 将 /dev/ttyS0 绑定为 hci0,芯片类型为 BCM,波特率 921600
sudo hciattach /dev/ttyS0 bcm 921600- 参数说明:
- 串口路径(如
/dev/ttyS0)。 - 芯片类型(如
bcm、ath3k)。 - 波特率(需与硬件匹配)。
- 串口路径(如
- 参数说明:
- 自动绑定(开机启动): 创建 Systemd 服务(见前文),或直接写入启动脚本。
常见问题
- 权限不足:确保用户有权限访问串口(加入
dialout组)。 - 驱动不匹配:检查内核是否支持芯片类型(
dmesg | grep Bluetooth)。 - 波特率错误:需与蓝牙模块文档一致(如
115200、921600)。
2. hciconfig
功能侧重点
- 核心作用:管理 HCI 接口的 状态 和 参数(如启用/禁用接口、设置蓝牙地址、调整射频参数)。
- 适用场景:
- 启动或关闭蓝牙接口。
- 查看接口详细信息(如 MAC 地址、协议支持)。
- 调试射频信号(如设置发射功率)。
典型用法
- 查看所有 HCI 接口:hciconfig输出示例:plaintexthci0: Type: Primary Bus: UART
BD Address: 00:11:22:33:44:55 ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING
RX bytes:1234 acl:0 sco:0 events:123 errors:0
TX bytes:1234 acl:0 sco:0 commands:123 errors:0 - 启动/关闭接口:sudo hciconfig hci0 up # 启动接口
sudo hciconfig hci0 down # 关闭接口 - 设置接口参数:sudo hciconfig hci0 name “MyBluetooth” # 设置设备名称
sudo hciconfig hci0 piscan # 开启可发现和可连接模式
常见问题
- 接口未启动:需先通过
hciattach绑定,再执行hciconfig hci0 up。 - 射频参数无效:某些蓝牙芯片可能不支持调整功率或协议模式。
3. hcitool
功能侧重点
- 核心作用:执行 蓝牙设备级操作,如扫描设备、查询信息、建立基础连接。
- 适用场景:
- 快速扫描周围蓝牙设备。
- 测试设备是否可达。
- 获取设备基本信息(如名称、信号强度)。
- 注意:
hcitool在较新系统中已被弃用,推荐使用bluetoothctl或btmgmt,但在简单调试中仍常用。
典型用法
- 扫描附近设备:sudo hcitool scan输出示例:plaintextScanning …
00:11:22:33:44:55 MyHeadset
00:AA:BB:CC:DD:EE Smartwatch - 查询设备信息:sudo hcitool info 00:11:22:33:44:55 # 获取设备详细属性
- 测试连接强度:sudo hcitool rssi 00:11:22:33:44:55 # 查看信号强度(RSSI)
常见问题
- 命令无响应:确保接口已启动(
hciconfig hci0 up)且设备在范围内。 - 权限问题:需
sudo或用户加入bluetooth组。
工具协作流程
- 初始化硬件:sudo hciattach /dev/ttyS0 bcm 921600 # 绑定串口到 HCI
sudo hciconfig hci0 up # 启动接口 - 扫描设备:sudo hcitool scan # 发现周围设备
- 管理接口:hciconfig hci0 piscan # 设置为可被发现
hciconfig hci0 name “MyDevice” # 修改设备名称
总结
hciattach:硬件层绑定(串口 → HCI 接口)。hciconfig:接口层管理(启动、参数配置)。hcitool:设备层操作(扫描、查询)。
三者协作完成蓝牙模块从硬件初始化到设备通信的全流程。在新系统中建议结合 bluetoothctl 或 btmgmt 使用,但理解这三个工具仍是调试蓝牙问题的关键。
以下是 btattach、btmgmt 和 btmon 三个工具的功能侧重点、典型用法及协作关系的详细讲解:
1. btattach
功能侧重点
- 核心作用:替代旧版
hciattach,用于将 串口设备 绑定到 HCI 接口(如hci0),使其能被 BlueZ 协议栈识别和管理。支持更多现代蓝牙芯片和协议。 - 适用场景:
- 嵌入式系统中通过 UART 连接蓝牙模块(如 Nordic、Broadcom 芯片)。
- 初始化需要特定固件或协议的蓝牙硬件。
- 关键改进:支持更多蓝牙协议(如 H4、H5、BCSP),且与 BlueZ 新版兼容性更好。
典型用法
- 绑定串口到 HCI 接口:sudo btattach -B /dev/ttyS0 -P h4 -S 3000000
- 参数说明:
-B /dev/ttyS0:指定串口设备路径。-P h4:指定协议类型(常见值:h4、h5、bcm)。-S 3000000:设置波特率(需与硬件匹配)。
- 参数说明:
- 自动加载固件(部分芯片需要):sudo btattach -B /dev/ttyS0 -P bcm -S 921600 –patchram /lib/firmware/BCM4345C0.hcd
- 查看支持的协议类型:btattach –help
常见问题
- 权限不足:确保用户有权限访问串口(加入
dialout组)。 - 协议不匹配:通过
dmesg检查硬件初始化日志,确认正确协议类型。 - 固件缺失:部分芯片需额外固件文件(如 Broadcom 的
.hcd文件)。
2. btmgmt
功能侧重点
- 核心作用:替代旧版
hciconfig和部分hcitool功能,提供 统一的蓝牙管理接口,支持配置适配器、管理连接、配对等操作。 - 适用场景:
- 管理蓝牙适配器的开关、发现模式、配对列表。
- 调试蓝牙协议栈(如查看适配器信息、事件日志)。
- 关键优势:直接与 BlueZ 管理接口交互,支持更细粒度的控制。
典型用法
- 进入交互模式:sudo btmgmt交互命令示例:plaintextlist # 列出所有适配器
select hci0 # 选择操作目标适配器
power on # 开启适配器
discoverable on # 开启可被发现模式
connectable on # 开启可连接模式
advertising on # 启用广播
pair 00:11:22:33:44:55 # 配对设备 - 命令行直接操作:sudo btmgmt –index 0 power on # 开启 hci0
sudo btmgmt –index 0 discoverable on # 设置为可被发现
sudo btmgmt find -l # 扫描低功耗(BLE)设备 - 查看适配器信息:sudo btmgmt info
常见问题
- 适配器未找到:确保已通过
btattach或内核驱动正确初始化。 - 权限问题:需
sudo或用户加入bluetooth组。 - 命令不生效:检查适配器状态是否为
power on。
3. btmon
功能侧重点
- 核心作用:实时 监控蓝牙协议栈的原始数据,用于深度调试和分析蓝牙通信(如 HCI 命令、事件、数据包)。
- 适用场景:
- 调试蓝牙连接失败、协议错误。
- 分析蓝牙数据流(如广播包、连接请求)。
- 关键优势:提供类似 Wireshark 的详细报文解析,但专注于蓝牙协议。
典型用法
- 监控所有 HCI 流量:sudo btmon
- 按
Ctrl+C停止监控。
- 按
- 过滤特定适配器:sudo btmon -i hci0 # 仅监控 hci0 的流量
- 保存日志到文件:sudo btmon -w btlog.txt # 保存原始数据
sudo btmon -r btlog.txt # 回放日志
常见问题
- 数据量过大:使用过滤条件(如
btmon -t lmp仅显示 LMP 协议层数据)。 - 权限不足:需
sudo或 CAP_NET_ADMIN 权限。
工具协作流程
- 初始化硬件:sudo btattach -B /dev/ttyS0 -P h4 # 绑定串口到 HCI
sudo btmgmt –index 0 power on # 启动适配器 - 配置适配器:sudo btmgmt discoverable on # 允许被发现
sudo btmgmt connectable on # 允许连接 - 监控通信:sudo btmon -i hci0 # 实时查看 HCI 数据包
总结
btattach:硬件层绑定(串口 → HCI 接口),替代旧版hciattach。btmgmt:管理层操作(适配器控制、配对、扫描),替代hciconfig和部分hcitool功能。btmon:协议层监控(调试 HCI 数据流),替代旧版hcidump。
三者协作覆盖蓝牙从硬件初始化、设备管理到协议调试的全链路操作。在新版 BlueZ 中,这些工具是调试和开发的核心组件。
以下是使用 btmon 工具抓取和导出蓝牙 HCI 数据包的详细步骤及示例。btmon 是 BlueZ 协议栈的一部分,专门用于监控和分析蓝牙协议层的数据交换,适合调试蓝牙连接问题或研究协议行为。
1. 安装 btmon
btmon通常随 BlueZ 一起安装。若系统中未安装,需安装 BlueZ:sudo apt update
sudo apt install bluez- 验证安装:btmon –version
2. 基础用法:实时抓取 HCI 数据包
(1) 监控所有 HCI 接口的流量
sudo btmon
- 输出示例:plaintextHCI sniffer – Bluetooth packet analyzer ver 5.55
device: hci0 snap_len: 1500 filter: 0xffffffff
> HCI Event: Command Complete (0x0e) plen 4
Set Event Mask (0x03|0x0001) ncmd 1
status 0x00
> HCI Event: Command Complete (0x0e) plen 10
Read BD ADDR (0x04|0x0009) ncmd 1
status 0x00 bdaddr 00:11:22:33:44:55 - 操作说明:
- 按
Ctrl+C停止监控。 - 默认输出为实时解析的文本格式,包含 HCI 命令、事件和数据包内容。
- 按
(2) 指定监控的 HCI 接口
sudo btmon -i hci0 # 仅监控 hci0 接口
(3) 过滤协议层数据
- 仅显示特定协议层(如 LMP、ACL):sudo btmon -t lmp # 监控 LMP(链路管理层)数据
sudo btmon -t acl # 监控 ACL(异步连接)数据
sudo btmon -t sco # 监控 SCO(同步连接)数据
3. 导出 HCI 数据包
(1) 保存原始数据到文件
# 保存为文本格式(可读性高,适合直接查看)
sudo btmon -w btlog.txt
# 保存为二进制格式(btsnoop格式,兼容Wireshark)
sudo btmon -w btlog.btsnoop
- 文件用途:
- 文本格式:直接查看解析后的日志。
- 二进制格式:导入到 Wireshark 进行更深入分析。
(2) 实时抓包并保存
# 实时抓包并保存到文件(同时输出到屏幕)
sudo btmon | tee btlog.txt
# 后台静默抓包(无屏幕输出)
sudo btmon -w btlog.btsnoop &
(3) 回放已保存的日志
# 回放文本格式日志
btmon -r btlog.txt
# 回放二进制格式日志
btmon -r btlog.btsnoop
4. 高级用法
(1) 过滤特定设备或地址
- 通过
btmon直接过滤较难,但可以结合grep处理文本输出:sudo btmon | grep “00:11:22:33:44:55”
(2) 使用 Wireshark 分析
- 将数据保存为
btsnoop格式:sudo btmon -w btlog.btsnoop - 用 Wireshark 打开文件:wireshark btlog.btsnoop
- Wireshark 支持蓝牙协议解析,提供更直观的过滤和分析功能。
(3) 监控低功耗蓝牙(BLE)广播包
sudo btmon -t adv # 仅显示广播数据包
5. 典型使用场景示例
场景 1:调试蓝牙设备连接失败
- 开始抓包:sudo btmon -w connection_debug.btsnoop
- 尝试连接蓝牙设备(如使用
bluetoothctl或应用程序)。 - 按
Ctrl+C停止抓包。 - 分析
connection_debug.btsnoop文件,检查连接请求(CONNECT_REQ)和错误事件。
场景 2:分析 BLE 数据传输
- 监控 BLE 数据包:sudo btmon -t acl -w ble_data.btsnoop
- 启动 BLE 数据传输(如传感器发送数据)。
- 停止抓包后,用 Wireshark 查看数据包中的
ATT(属性协议)层内容。
6. 常见问题解决
① 权限不足
- 错误信息:
Permission denied。 - 解决:sudo chmod a+rw /dev/bluetooth/* # 临时权限
# 或永久将用户加入 bluetooth 组
sudo usermod -aG bluetooth $USER
② 数据量过大
- 使用过滤减少输出:sudo btmon -t lmp # 仅显示关键协议层
③ 无法解析数据包
- 确保使用最新版 BlueZ 和 Wireshark。
- 检查蓝牙芯片是否支持协议嗅探(部分芯片需特殊配置)。
总结
- 抓包:
sudo btmon或sudo btmon -w <filename>。 - 导出:保存为文本(
.txt)或二进制(.btsnoop)格式。 - 分析:直接查看文本日志或用 Wireshark 打开二进制文件。
通过 btmon 可以深入观察蓝牙协议交互,是解决连接问题、优化性能或学习协议细节的必备工具。
btmon 的 -t(或 --type)参数用于过滤要显示的 协议层或数据包类型,允许你聚焦特定蓝牙协议层的数据。以下是支持的常见过滤参数及其用途:
1. 支持的过滤参数
| 参数 | 协议/数据包类型 | 典型用途 |
|---|---|---|
hci | HCI 命令和事件(控制层) | 监控蓝牙适配器的初始化、配置和状态变化。 |
cmd | HCI 命令(Host → Controller) | 观察主机发送给蓝牙控制器的指令(如扫描请求)。 |
evt | HCI 事件(Controller → Host) | 查看控制器上报的事件(如连接完成、扫描结果)。 |
acl | ACL 数据(异步连接数据传输) | 分析普通蓝牙数据传输(如文件传输、音频流)。 |
sco | SCO 数据(同步连接语音数据) | 调试语音通话质量或同步数据传输问题。 |
lmp | LMP 协议(链路管理层协议) | 深入调试蓝牙设备间的底层链路管理交互。 |
amp | AMP 协议(增强速率模式) | 分析高速蓝牙数据传输(较少使用)。 |
iso | ISO 协议(LE Audio 等同步通道) | 监控蓝牙 LE Audio 或同步通道数据(BLE 5.2+)。 |
adv | 广播数据(BLE 广播包) | 分析低功耗蓝牙设备的广播内容(如信标、传感器)。 |
scan | 扫描请求和响应 | 查看扫描请求和扫描响应数据包。 |
conn | 连接请求和参数交换 | 调试蓝牙连接建立过程(如 BLE 连接参数协商)。 |
security | 安全相关数据(配对、加密) | 分析蓝牙配对和加密过程的问题。 |
vendor | 厂商特定数据包 | 调试蓝牙芯片厂商的私有协议或扩展功能。 |
all | 所有类型数据包(默认) | 不进行过滤,显示全部数据。 |
2. 典型用法示例
(1) 监控 HCI 命令和事件
sudo btmon -t hci
- 输出:仅显示 HCI 命令(如
LE Set Scan Parameters)和事件(如Command Complete)。
(2) 分析 BLE 广播包
sudo btmon -t adv
- 输出:仅显示低功耗蓝牙设备的广播数据包(如 iBeacon、Eddystone)。
(3) 调试 ACL 数据传输
sudo btmon -t acl
- 输出:显示异步连接数据传输(如文件传输、蓝牙键盘输入)。
(4) 组合多个过滤参数
sudo btmon -t evt,adv
- 输出:同时显示 HCI 事件和 BLE 广播包。
3. 高级用法
(1) 使用通配符 \* 匹配前缀
sudo btmon -t 'iso*' # 匹配所有以 "iso" 开头的类型(如 iso、iso-conn)
(2) 排除特定类型
(注:部分版本支持 ^ 符号排除)
sudo btmon -t all -t ^sco # 显示除 SCO 外的所有数据
(3) 过滤特定蓝牙地址
(需结合 grep 二次过滤)
sudo btmon -t acl | grep "00:11:22:33:44:55"
4. 实际调试场景
场景 1:BLE 连接失败
sudo btmon -t evt,conn
- 观察:连接请求(
LE Create Connection)是否发送,是否有错误事件(如Connection Failed)。
场景 2:音频传输卡顿
sudo btmon -t sco
- 观察:SCO 数据包的连续性及是否有重传。
场景 3:配对失败
sudo btmon -t security
- 观察:配对请求(
Pairing Request)和认证过程中的错误代码。
5. 注意事项
- 权限要求:需
sudo或用户加入bluetooth组。 - 版本差异:不同 BlueZ 版本支持的参数可能不同,建议通过
btmon --help查看当前版本支持的完整列表。 - 性能影响:高频数据(如
acl)可能导致输出刷屏,建议定向过滤或保存到文件分析。
通过灵活使用 -t 参数,可以快速定位蓝牙协议栈中的问题层级,大幅提升调试效率。
以下是 bluetoothctl 工具的详细使用指南,涵盖基础操作、设备管理、调试技巧及常见场景示例。bluetoothctl 是 BlueZ 蓝牙协议栈的官方命令行工具,用于管理和控制蓝牙设备(如配对、连接、扫描等),适用于 Linux 系统。
1. 安装与启动
(1) 安装 BlueZ
大多数 Linux 发行版已预装 BlueZ,若未安装可通过包管理器安装:
# Debian/Ubuntu
sudo apt install bluez bluez-tools
# Arch/Manjaro
sudo pacman -S bluez bluez-utils
# Fedora
sudo dnf install bluez bluez-tools
(2) 启动蓝牙服务
sudo systemctl start bluetooth # 启动服务
sudo systemctl enable bluetooth # 设置开机自启
(3) 进入交互模式
bluetoothctl
启动后进入交互式命令行界面,提示符为 [bluetooth]#。
2. 基础操作命令
(1) 查看帮助
[bluetooth]# help
(2) 列出可用适配器
[bluetooth]# list
输出示例:
plaintext
Controller 00:11:22:33:44:55 BlueZ 5.55 [default]
(3) 选择默认适配器
[bluetooth]# select 00:11:22:33:44:55 # 替换为你的适配器 MAC 地址
(4) 开启/关闭蓝牙适配器
[bluetooth]# power on # 开启
[bluetooth]# power off # 关闭
(5) 扫描设备
[bluetooth]# scan on # 开始扫描
[bluetooth]# scan off # 停止扫描
扫描结果示例:
plaintext
[NEW] Device 11:22:33:44:55:66 MyHeadphones
3. 设备配对与连接
(1) 配对设备
[bluetooth]# pair 11:22:33:44:55:66 # 设备 MAC 地址
配对成功后,设备将出现在信任列表。
(2) 信任设备(自动连接)
[bluetooth]# trust 11:22:33:44:55:66
(3) 连接设备
[bluetooth]# connect 11:22:33:44:55:66
(4) 断开连接
[bluetooth]# disconnect 11:22:33:44:55:66
(5) 移除设备
[bluetooth]# remove 11:22:33:44:55:66
4. 高级功能
(1) 设置设备别名
[bluetooth]# set-alias "My Bluetooth Speaker"
(2) 查看设备信息
[bluetooth]# info 11:22:33:44:55:66
输出示例:
plaintext
Device 11:22:33:44:55:66 (public)
Name: MyHeadphones
Alias: MyHeadphones
Paired: yes
Trusted: yes
Connected: yes
(3) 设置默认代理
[bluetooth]# default-agent
(4) 设置适配器可被发现/可连接
[bluetooth]# discoverable on # 允许其他设备发现本机
[bluetooth]# pairable on # 允许配对请求
5. 典型使用场景
场景 1:连接蓝牙耳机
# 进入交互模式
bluetoothctl
# 扫描设备
scan on
# 等待出现耳机设备(如 11:22:33:44:55:66)
# 配对并连接
pair 11:22:33:44:55:66
connect 11:22:33:44:55:66
trust 11:22:33:44:55:66 # 设为自动连接
场景 2:调试连接问题
# 查看适配器状态
show
# 查看设备详细信息
info 11:22:33:44:55:66
# 监控实时日志(另开终端)
sudo btmon
6. 常见问题解决
① 权限不足
- 错误信息:
Failed to connect: org.bluez.Error.Failed - 解决: 确保用户加入
bluetooth组并重启服务:sudo usermod -aG bluetooth $USER
sudo systemctl restart bluetooth
② 设备无法被发现
- 检查适配器状态:[bluetooth]# show
# 确认 Powered: yes, Discoverable: yes
③ 配对失败
- 尝试重新配对:remove 11:22:33:44:55:66 # 移除设备
pair 11:22:33:44:55:66 # 重新配对
7. 命令速查表
| 命令 | 作用 |
|---|---|
list | 列出蓝牙适配器 |
scan on/off | 开始/停止扫描设备 |
pair [MAC] | 配对设备 |
trust [MAC] | 信任设备(自动连接) |
connect [MAC] | 连接设备 |
info [MAC] | 查看设备详细信息 |
remove [MAC] | 移除已配对设备 |
power on/off | 开启/关闭适配器 |
discoverable on/off | 设置是否可被发现 |
通过 bluetoothctl,你可以完全通过命令行管理蓝牙设备,适用于无图形界面的服务器、嵌入式设备或脚本自动化场景。结合 btmon 日志工具,可深入调试蓝牙协议交互问题。
以下是 BlueZ(Linux 官方蓝牙协议栈)相关工具的详细分类、功能说明及典型用法。这些工具覆盖了蓝牙设备管理、协议分析、服务配置和低功耗蓝牙操作等多个场景:
1. 设备管理与控制
(1) bluetoothctl
- 用途:交互式蓝牙设备管理工具(替代旧版
hcitool和hciconfig)。 - 功能:
- 扫描、配对、连接设备
- 管理蓝牙适配器(开关、可见性、别名)
- 查看设备信息
- 典型用法:bluetoothctl
[bluetooth]# scan on # 扫描设备
[bluetooth]# pair 11:22:33:44:55:66 # 配对
[bluetooth]# connect 11:22:33:44:55:66 # 连接
[bluetooth]# trust 11:22:33:44:55:66 # 信任设备
(2) btmgmt
- 用途:低层蓝牙管理工具(更接近协议栈的操作)。
- 功能:
- 适配器电源管理
- 配置发现模式、安全策略
- 调试低功耗蓝牙(BLE)
- 典型用法:sudo btmgmt
[mgmt]# power on # 开启适配器
[mgmt]# le on # 启用 BLE
[mgmt]# find -l # 扫描 BLE 设备
(3) hciconfig(旧版)
- 用途:配置 HCI 接口参数(已逐步被
bluetoothctl和btmgmt替代)。 - 典型用法:hciconfig hci0 up # 启用接口
hciconfig hci0 piscan # 设为可被发现和连接
2. 协议分析与调试
(1) btmon
- 用途:实时监控蓝牙协议栈的原始数据(替代旧版
hcidump)。 - 功能:
- 抓取 HCI、L2CAP、SCO 等协议层数据包
- 保存日志供离线分析
- 典型用法:sudo btmon # 实时监控所有接口
sudo btmon -i hci0 -w log.btsnoop # 保存到文件(Wireshark兼容格式)
(2) hcitool(旧版)
- 用途:发送 HCI 命令和查询设备信息(已逐步弃用)。
- 典型用法:hcitool scan # 扫描经典蓝牙设备
hcitool lescan # 扫描 BLE 设备
hcitool info 11:22:33:44:55:66 # 查看设备信息
3. 服务与协议配置
(1) sdptool
- 用途:管理蓝牙服务发现协议(SDP)。
- 功能:
- 浏览远程设备的服务
- 注册本地服务(如串口、音频)
- 典型用法:sdptool browse 11:22:33:44:55:66 # 查看设备支持的服务
sdptool add –channel=3 SP # 本地注册串口服务(RFCOMM 通道3)
(2) rfcomm
- 用途:绑定 RFCOMM 虚拟串口(蓝牙串口通信)。
- 典型用法:sudo rfcomm bind /dev/rfcomm0 11:22:33:44:55:66 1 # 绑定通道1到串口
minicom -D /dev/rfcomm0 # 使用串口工具通信
4. 低功耗蓝牙(BLE)专用工具
(1) gatttool(旧版)
- 用途:与 BLE 设备交互(读写 GATT 特性)。
- 典型用法:gatttool -b 11:22:33:44:55:66 -I # 交互模式
> connect # 连接设备
> char-read-uuid 00002a00-0000-1000-8000-00805f9b34fb # 读取设备名称
(2) bluetoothctl(支持 BLE)
- 典型用法:[bluetooth]# menu gatt # 进入 GATT 菜单
[bluetooth]# list-attributes # 列出所有特性
[bluetooth]# select-attribute 00002a00-0000-1000-8000-00805f9b34fb # 选择特性
[bluetooth]# read # 读取特性值
5. 硬件初始化工具
(1) hciattach
- 用途:将串口设备绑定为 HCI 接口(传统硬件初始化)。
- 典型用法:sudo hciattach /dev/ttyS0 bcm 921600 # 绑定串口到 HCI(Broadcom芯片)
(2) btattach
- 用途:替代
hciattach,支持更多协议类型(如 H4/H5/BCSP)。 - 典型用法:sudo btattach -B /dev/ttyS0 -P h4 -S 3000000 # 绑定 UART 到 HCI
6. 其他工具
(1) obexd(通过 D-Bus 控制)
- 用途:实现 OBEX 文件传输协议(需结合
obexctl或脚本)。 - 典型用法:obexctl # 交互式文件传输
> send /path/to/file 11:22:33:44:55:66 # 发送文件到设备
(2) bluealsa
- 用途:ALSA 蓝牙音频支持(播放/录制音频)。
- 配置:sudo systemctl start bluealsa # 启动服务
aplay -D bluealsa:DEV=11:22:33:44:55:66 music.wav # 播放音频
工具对比与选择建议
| 场景 | 推荐工具 | 替代工具(旧版) |
|---|---|---|
| 设备管理 | bluetoothctl | hcitool, hciconfig |
| 协议分析 | btmon | hcidump |
| BLE 交互 | bluetoothctl | gatttool |
| 硬件初始化 | btattach | hciattach |
| 服务发现 | sdptool | – |
典型工作流示例
连接蓝牙耳机并播放音频
- 初始化硬件:sudo btattach -B /dev/ttyS0 -P h4 # 若使用 UART 蓝牙模块
sudo systemctl restart bluetooth - 配对设备:bluetoothctl
[bluetooth]# scan on
[bluetooth]# pair 11:22:33:44:55:66
[bluetooth]# trust 11:22:33:44:55:66 - 配置音频路由:sudo systemctl start bluealsa
aplay -D bluealsa:DEV=11:22:33:44:55:66 music.wav - 调试连接问题:sudo btmon -i hci0 # 监控 HCI 数据包
通过掌握这些工具,你可以覆盖从蓝牙硬件初始化、设备管理到协议分析的完整链路,适用于嵌入式开发、桌面系统调试及自动化脚本编写。