BlueZ:没有可用的默认控制器

问题描述

我正在将 Linux 设备设置为充当 BLE 主机,并将 ESP32 设置为通过 UART 充当 BLE 控制器。

我使用的是 BlueZ v5.55,带有 btattachbluetoothctl 实用程序,并且 bluetoothd 在后台运行。但是,完成设置后 bluetoothctl 仍然显示 No default controller available

# /usr/bin/btattach -B /dev/ttymxc1 -S 921600 --protocol h4 &
# Attaching Primary controller to /dev/ttymxc1
Switched line discipline from 0 to 15
Device index 0 attached

# /usr/libexec/bluetooth/bluetoothd

# bluetoothctl
Agent registered
[bluetooth]# power on
No default controller available

btmon 的输出:

# btmon
Bluetooth monitor ver 5.55
= Note: Linux version 5.4.8 (armv7l)                                                                                                  0.258161
= Note: Bluetooth subsystem version 2.22                                                                                              0.258269
= New Index: 00:00:00:00:00:00 (Primary,UART,hci0)                                                                             [hci0] 0.258314
@ MGMT Open: bluetoothd (privileged) version 1.14                                                                            {0x0001} 0.258357

内核启动时dmesg的输出:

# dmesg | grep Blu
[    0.643821] Bluetooth: Core ver 2.22
[    0.644222] Bluetooth: HCI device and connection manager initialized
[    0.644528] Bluetooth: HCI socket layer initialized
[    0.644622] Bluetooth: L2CAP socket layer initialized
[    0.645069] Bluetooth: SCO socket layer initialized
[    4.678559] Bluetooth: HCI UART driver ver 2.3
[    4.683346] Bluetooth: HCI UART protocol H4 registered
[    4.688821] Bluetooth: HCI UART protocol LL registered

ESP32 正在运行 UART HCI 控制器固件:https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/hci/controller_hci_uart

主机正在运行 Buildroot 创建的带有 BR2_PACKAGE_BLUEZ_TOOLS=y 的 Linux 和带有 CONFIG_BT=y,CONFIG_BT_LE=y,CONFIG_BT_HCIUART=y,CONFIG_BT_HCIUART_H4=y 的内核。

我有 4 条 UART 线连接 TX->RX、RX->TX、RTS->CTS 和 CTS->RTS。

我已经使用相同的硬件设置检查了 UART 通信 - 我可以通过 UART 与 ESP32 交换数据(双向)。

命令以 root 身份运行。

我在这里错过了什么? 如果您有关于 BlueZ HCI 设置的任何不错的文档,我会很高兴看到它。

编辑:我还安装了 hcidump 和 hciconfig(通常在 BLueZ v5.55 中已弃用)。这是来自 hcidump 的日志:

# hcidump  
HCI sniffer - Bluetooth packet analyzer ver 5.55
device: hci0 snap_len: 1500 filter: 0xffffffff

< HCI Command: Read Local Supported Features (0x04|0x0003) plen 0
< HCI Command: Read Local Version Information (0x04|0x0001) plen 0
< HCI Command: Read BD ADDR (0x04|0x0009) plen 0

(in 2nd terminal)
# hciconfig hci0 up
Can't init device hci0: Connection timed out (110)

解决方法

几天后,我找到了解决此问题的方法。

我还使用了 nRF52 DK 作为替代方案,以更好地了解问题出在 ESP32 控制器一侧还是 Linux 主机一侧。因为 nRF HCI UART 可以在 Ubuntu 20.04 上运行,但不能在我的嵌入式 Linux 上运行,所以我更深入地研究了 Linux 主机端。

启动 BlueZ 守护进程后 bluetoothd -n 它显示了更多细节:

bluetoothd[593]: src/adapter.c:get_static_addr() Failed to open crypto
bluetoothd[593]: No Bluetooth address for index 0

这让我想到了这个话题:https://github.com/raspberrypi/linux/issues/3628

事实证明,当使用 btattach 连接 UART HCI 控制器时,BlueZ 无法创建静态地址,因为用户空间中缺少 Linux 内核加密接口。

我用额外的配置编译了内核:

CONFIG_CRYPTO_USER
CONFIG_CRYPTO_USER_API
CONFIG_CRYPTO_USER_API_AEAD
CONFIG_CRYPTO_USER_API_HASH

CONFIG_CRYPTO_AES
CONFIG_CRYPTO_CCM
CONFIG_CRYPTO_AEAD
CONFIG_CRYPTO_CMAC

进行更改后,我能够将蓝牙控制器连接到我的嵌入式 Linux 主机。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...