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

BlueZ: No default controller available

我正在设置 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 是 运行ning UART HCI 控制器固件:https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/hci/controller_hci_uart

主机正在 运行使用 BR2_PACKAGE_BLUEZ_TOOLS=y 构建 Buildroot 创建的 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 无法创建静态地址,因为在 user-[=34= 中缺少 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 主机。