在 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:蓝牙芯片类型(常见类型:bcmath3knxpqualcomm)。
  • 921600:波特率(需与蓝牙模块配置匹配,常见值如 115200921600)。

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*(将用户加入 dialouttty 组):sudo usermod -aG dialout $USER
  • 波特率不匹配:检查蓝牙模块文档,确认正确的波特率。

② 无 HCI 接口

  • 使用 dmesg | grep Bluetooth 查看内核日志,确认驱动加载和初始化过程。

③ 芯片类型不匹配

  • 尝试常见类型:bcmath3knxpintelqualcomm
  • 某些模块需先发送初始化命令(参考厂商文档)。

8. 嵌入式场景补充

对于嵌入式开发板(如树莓派、ESP32),可能需要通过设备树(Device Tree)配置 UART 引脚和蓝牙模块。例如,在树莓派中:

# 在 /boot/config.txt 中添加
dtoverlay=pi3-miniuart-bt # 禁用默认蓝牙,使用自定义串口
dtoverlay=my-custom-bt-overlay

总结

通过 hciattach 将串口设备绑定为 HCI 接口,适用于需要通过 UART 连接蓝牙模块的场景(如嵌入式开发)。关键步骤包括:

  1. 确认硬件和驱动支持。
  2. 使用 hciattach 绑定串口。
  3. 配置开机自动启动。

以下是 hciattachhciconfighcitool 三个工具的功能侧重点、典型用法及协作关系的详细讲解:


1. hciattach

功能侧重点

  • 核心作用:将串口设备(如 UART 连接的蓝牙模块)绑定到 HCI 接口(如 hci0),使其能被 BlueZ 协议栈识别和管理。
  • 适用场景
    • 嵌入式系统中通过串口(如 /dev/ttyS0)连接蓝牙模块。
    • 初始化需要特定波特率或协议的蓝牙硬件(如 BCM、Nordic 芯片)。
  • 依赖条件:需加载对应的内核驱动(如 hci_uart)。

典型用法

  1. 绑定串口到 HCI 接口:# 将 /dev/ttyS0 绑定为 hci0,芯片类型为 BCM,波特率 921600
    sudo hciattach /dev/ttyS0 bcm 921600
    • 参数说明
      • 串口路径(如 /dev/ttyS0)。
      • 芯片类型(如 bcmath3k)。
      • 波特率(需与硬件匹配)。
  2. 自动绑定(开机启动): 创建 Systemd 服务(见前文),或直接写入启动脚本。

常见问题

  • 权限不足:确保用户有权限访问串口(加入 dialout 组)。
  • 驱动不匹配:检查内核是否支持芯片类型(dmesg | grep Bluetooth)。
  • 波特率错误:需与蓝牙模块文档一致(如 115200921600)。

2. hciconfig

功能侧重点

  • 核心作用:管理 HCI 接口的 状态参数(如启用/禁用接口、设置蓝牙地址、调整射频参数)。
  • 适用场景
    • 启动或关闭蓝牙接口。
    • 查看接口详细信息(如 MAC 地址、协议支持)。
    • 调试射频信号(如设置发射功率)。

典型用法

  1. 查看所有 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
  2. 启动/关闭接口:sudo hciconfig hci0 up   # 启动接口
    sudo hciconfig hci0 down # 关闭接口
  3. 设置接口参数:sudo hciconfig hci0 name “MyBluetooth” # 设置设备名称
    sudo hciconfig hci0 piscan             # 开启可发现和可连接模式

常见问题

  • 接口未启动:需先通过 hciattach 绑定,再执行 hciconfig hci0 up
  • 射频参数无效:某些蓝牙芯片可能不支持调整功率或协议模式。

3. hcitool

功能侧重点

  • 核心作用:执行 蓝牙设备级操作,如扫描设备、查询信息、建立基础连接。
  • 适用场景
    • 快速扫描周围蓝牙设备。
    • 测试设备是否可达。
    • 获取设备基本信息(如名称、信号强度)。
  • 注意hcitool 在较新系统中已被弃用,推荐使用 bluetoothctlbtmgmt,但在简单调试中仍常用。

典型用法

  1. 扫描附近设备:sudo hcitool scan输出示例:plaintextScanning …
      00:11:22:33:44:55       MyHeadset
      00:AA:BB:CC:DD:EE       Smartwatch
  2. 查询设备信息:sudo hcitool info 00:11:22:33:44:55 # 获取设备详细属性
  3. 测试连接强度:sudo hcitool rssi 00:11:22:33:44:55 # 查看信号强度(RSSI)

常见问题

  • 命令无响应:确保接口已启动(hciconfig hci0 up)且设备在范围内。
  • 权限问题:需 sudo 或用户加入 bluetooth 组。

工具协作流程

  1. 初始化硬件:sudo hciattach /dev/ttyS0 bcm 921600 # 绑定串口到 HCI
    sudo hciconfig hci0 up               # 启动接口
  2. 扫描设备:sudo hcitool scan                     # 发现周围设备
  3. 管理接口:hciconfig hci0 piscan               # 设置为可被发现
    hciconfig hci0 name “MyDevice”       # 修改设备名称

总结

  • hciattach:硬件层绑定(串口 → HCI 接口)。
  • hciconfig:接口层管理(启动、参数配置)。
  • hcitool:设备层操作(扫描、查询)。

三者协作完成蓝牙模块从硬件初始化到设备通信的全流程。在新系统中建议结合 bluetoothctlbtmgmt 使用,但理解这三个工具仍是调试蓝牙问题的关键。

以下是 btattachbtmgmtbtmon 三个工具的功能侧重点、典型用法及协作关系的详细讲解:


1. btattach

功能侧重点

  • 核心作用:替代旧版 hciattach,用于将 串口设备 绑定到 HCI 接口(如 hci0),使其能被 BlueZ 协议栈识别和管理。支持更多现代蓝牙芯片和协议。
  • 适用场景
    • 嵌入式系统中通过 UART 连接蓝牙模块(如 Nordic、Broadcom 芯片)。
    • 初始化需要特定固件或协议的蓝牙硬件。
  • 关键改进:支持更多蓝牙协议(如 H4、H5、BCSP),且与 BlueZ 新版兼容性更好。

典型用法

  1. 绑定串口到 HCI 接口:sudo btattach -B /dev/ttyS0 -P h4 -S 3000000
    • 参数说明
      • -B /dev/ttyS0:指定串口设备路径。
      • -P h4:指定协议类型(常见值:h4h5bcm)。
      • -S 3000000:设置波特率(需与硬件匹配)。
  2. 自动加载固件(部分芯片需要):sudo btattach -B /dev/ttyS0 -P bcm -S 921600 –patchram /lib/firmware/BCM4345C0.hcd
  3. 查看支持的协议类型:btattach –help

常见问题

  • 权限不足:确保用户有权限访问串口(加入 dialout 组)。
  • 协议不匹配:通过 dmesg 检查硬件初始化日志,确认正确协议类型。
  • 固件缺失:部分芯片需额外固件文件(如 Broadcom 的 .hcd 文件)。

2. btmgmt

功能侧重点

  • 核心作用:替代旧版 hciconfig 和部分 hcitool 功能,提供 统一的蓝牙管理接口,支持配置适配器、管理连接、配对等操作。
  • 适用场景
    • 管理蓝牙适配器的开关、发现模式、配对列表。
    • 调试蓝牙协议栈(如查看适配器信息、事件日志)。
  • 关键优势:直接与 BlueZ 管理接口交互,支持更细粒度的控制。

典型用法

  1. 进入交互模式:sudo btmgmt交互命令示例:plaintextlist               # 列出所有适配器
    select hci0         # 选择操作目标适配器
    power on           # 开启适配器
    discoverable on     # 开启可被发现模式
    connectable on     # 开启可连接模式
    advertising on     # 启用广播
    pair 00:11:22:33:44:55 # 配对设备
  2. 命令行直接操作:sudo btmgmt –index 0 power on         # 开启 hci0
    sudo btmgmt –index 0 discoverable on # 设置为可被发现
    sudo btmgmt find -l                   # 扫描低功耗(BLE)设备
  3. 查看适配器信息:sudo btmgmt info

常见问题

  • 适配器未找到:确保已通过 btattach 或内核驱动正确初始化。
  • 权限问题:需 sudo 或用户加入 bluetooth 组。
  • 命令不生效:检查适配器状态是否为 power on

3. btmon

功能侧重点

  • 核心作用:实时 监控蓝牙协议栈的原始数据,用于深度调试和分析蓝牙通信(如 HCI 命令、事件、数据包)。
  • 适用场景
    • 调试蓝牙连接失败、协议错误。
    • 分析蓝牙数据流(如广播包、连接请求)。
  • 关键优势:提供类似 Wireshark 的详细报文解析,但专注于蓝牙协议。

典型用法

  1. 监控所有 HCI 流量:sudo btmon
    • Ctrl+C 停止监控。
  2. 过滤特定适配器:sudo btmon -i hci0 # 仅监控 hci0 的流量
  3. 保存日志到文件:sudo btmon -w btlog.txt # 保存原始数据
    sudo btmon -r btlog.txt # 回放日志

常见问题

  • 数据量过大:使用过滤条件(如 btmon -t lmp 仅显示 LMP 协议层数据)。
  • 权限不足:需 sudo 或 CAP_NET_ADMIN 权限。

工具协作流程

  1. 初始化硬件:sudo btattach -B /dev/ttyS0 -P h4   # 绑定串口到 HCI
    sudo btmgmt –index 0 power on       # 启动适配器
  2. 配置适配器:sudo btmgmt discoverable on         # 允许被发现
    sudo btmgmt connectable on           # 允许连接
  3. 监控通信: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 分析

  1. 将数据保存为 btsnoop 格式:sudo btmon -w btlog.btsnoop
  2. 用 Wireshark 打开文件:wireshark btlog.btsnoop
    • Wireshark 支持蓝牙协议解析,提供更直观的过滤和分析功能。

(3) 监控低功耗蓝牙(BLE)广播包

sudo btmon -t adv   # 仅显示广播数据包

5. 典型使用场景示例

场景 1:调试蓝牙设备连接失败

  1. 开始抓包:sudo btmon -w connection_debug.btsnoop
  2. 尝试连接蓝牙设备(如使用 bluetoothctl 或应用程序)。
  3. Ctrl+C 停止抓包。
  4. 分析 connection_debug.btsnoop 文件,检查连接请求(CONNECT_REQ)和错误事件。

场景 2:分析 BLE 数据传输

  1. 监控 BLE 数据包:sudo btmon -t acl -w ble_data.btsnoop
  2. 启动 BLE 数据传输(如传感器发送数据)。
  3. 停止抓包后,用 Wireshark 查看数据包中的 ATT(属性协议)层内容。

6. 常见问题解决

① 权限不足

  • 错误信息:Permission denied
  • 解决:sudo chmod a+rw /dev/bluetooth/* # 临时权限
    # 或永久将用户加入 bluetooth 组
    sudo usermod -aG bluetooth $USER

② 数据量过大

  • 使用过滤减少输出:sudo btmon -t lmp   # 仅显示关键协议层

③ 无法解析数据包

  • 确保使用最新版 BlueZ 和 Wireshark。
  • 检查蓝牙芯片是否支持协议嗅探(部分芯片需特殊配置)。

总结

  • 抓包sudo btmonsudo btmon -w <filename>
  • 导出:保存为文本(.txt)或二进制(.btsnoop)格式。
  • 分析:直接查看文本日志或用 Wireshark 打开二进制文件。

通过 btmon 可以深入观察蓝牙协议交互,是解决连接问题、优化性能或学习协议细节的必备工具。

btmon-t(或 --type)参数用于过滤要显示的 协议层或数据包类型,允许你聚焦特定蓝牙协议层的数据。以下是支持的常见过滤参数及其用途:


1. 支持的过滤参数

参数协议/数据包类型典型用途
hciHCI 命令和事件(控制层)监控蓝牙适配器的初始化、配置和状态变化。
cmdHCI 命令(Host → Controller)观察主机发送给蓝牙控制器的指令(如扫描请求)。
evtHCI 事件(Controller → Host)查看控制器上报的事件(如连接完成、扫描结果)。
aclACL 数据(异步连接数据传输)分析普通蓝牙数据传输(如文件传输、音频流)。
scoSCO 数据(同步连接语音数据)调试语音通话质量或同步数据传输问题。
lmpLMP 协议(链路管理层协议)深入调试蓝牙设备间的底层链路管理交互。
ampAMP 协议(增强速率模式)分析高速蓝牙数据传输(较少使用)。
isoISO 协议(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. 注意事项

  1. 权限要求:需 sudo 或用户加入 bluetooth 组。
  2. 版本差异:不同 BlueZ 版本支持的参数可能不同,建议通过 btmon --help 查看当前版本支持的完整列表。
  3. 性能影响:高频数据(如 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

  • 用途:交互式蓝牙设备管理工具(替代旧版 hcitoolhciconfig)。
  • 功能
    • 扫描、配对、连接设备
    • 管理蓝牙适配器(开关、可见性、别名)
    • 查看设备信息
  • 典型用法: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 接口参数(已逐步被 bluetoothctlbtmgmt 替代)。
  • 典型用法: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 # 播放音频

工具对比与选择建议

场景推荐工具替代工具(旧版)
设备管理bluetoothctlhcitool, hciconfig
协议分析btmonhcidump
BLE 交互bluetoothctlgatttool
硬件初始化btattachhciattach
服务发现sdptool

典型工作流示例

连接蓝牙耳机并播放音频

  1. 初始化硬件:sudo btattach -B /dev/ttyS0 -P h4 # 若使用 UART 蓝牙模块
    sudo systemctl restart bluetooth
  2. 配对设备:bluetoothctl
    [bluetooth]# scan on
    [bluetooth]# pair 11:22:33:44:55:66
    [bluetooth]# trust 11:22:33:44:55:66
  3. 配置音频路由:sudo systemctl start bluealsa
    aplay -D bluealsa:DEV=11:22:33:44:55:66 music.wav
  4. 调试连接问题:sudo btmon -i hci0 # 监控 HCI 数据包

通过掌握这些工具,你可以覆盖从蓝牙硬件初始化、设备管理到协议分析的完整链路,适用于嵌入式开发、桌面系统调试及自动化脚本编写。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注