GATT服务器无法与Bluez 5.32、5.37一起使用

Mih*_*Pop 0 linux bluetooth-lowenergy bluez gatt

当我尝试通过带有4.0加密狗的rpi通过电话连接手机时,Bluetoothed出现了这两个错误,有人绊倒吗?

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

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

Mih*_*Pop 5

该问题实际上是由于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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)