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 设备不可用