GATT 服务器不适用于 Bluez 5.32、5.37

GATT Server not working with Bluez 5.32, 5.37

当我尝试在带有 4.0 加密狗的 rpi 上通过我的 phone 连接时,Bluetoothd 给出了这两个错误,有人偶然发现了这个吗?

bluetoothd[1776]: src/device.c:gatt_debug() MTU 交换失败。 ATT 代码:0x06 bluetoothd[1776]: src/device.c:gatt_client_ready_cb() 状态:失败,错误:6

phone 连接到 rpi,当我 运行 example-gatt-server 脚本时,服务已在服务器中注册,但在我的 phone 上只有两个, 通用属性和通用访问

问题实际上是由于 BlueZ 堆栈中的蓝牙 4.0 属性协议 (ATT) 实现不完整造成的。从 Android 5.0 开始,它检索 GATT 特征和服务的方式有点不同。具体来说,它使用的是 'Read By Group Type Request'(Core_v4.1 蓝牙规范,第 3.4.4.9 节),这似乎没有在 BlueZ 中正确实现。 IIRC 这特别是由于 Android 5.0 使用多个 ACL 数据包来形成一个请求。 iOS 和更早的 Android 版本对一个请求使用一个 ACL 数据包。

更新!!!

广告中的 'BR/EDR not supported' 位(第 2 位)应该专门设置,否则堆栈(在我的例子中使用 broadcomm 加密狗)将使用 BR/EDR 和 BTLE。解决方法是将领先的广告包从 020102 更改为 020106

btmgmt le on
btmgmt bredr off

使用 btmgmt 配置 adv hcix:

btmgmt -i hci0 power off 
btmgmt -i hci0 le on            # Enable LE
btmgmt -i hci0 connectable on
btmgmt -i hci0 bredr off        # Disable BR/EDR
btmgmt -i hci0 advertising on
btmgmt -i hci0 power on