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

Posted

技术标签:

【中文标题】GATT 服务器不适用于 Bluez 5.32、5.37【英文标题】:GATT Server not working with Bluez 5.32, 5.37 【发布时间】:2016-01-25 14:55:08 【问题描述】:

当我尝试通过带有 4.0 加密狗的 rpi 上的手机连接时,蓝牙出现这两个错误,有人偶然发现吗?

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

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

【问题讨论】:

【参考方案1】:

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

更新!!!

广告中的“不支持 BR/EDR”位(第 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

【讨论】:

以上是关于GATT 服务器不适用于 Bluez 5.32、5.37的主要内容,如果未能解决你的问题,请参考以下文章

BlueZ DBUS API - GATT 接口对 BLE 设备不可用

BlueZ示例gatt服务器

GATT API bluez - MI乐队2

BlueZ BLE GATT 写入请求 (0x12) 而不是 (0x16)

Bluez BLE 连接监控使用 DBUS-Python

用于打开/关闭 LED 的 BLE 设备(服务器)的 GATT 配置文件