低功耗蓝牙:Android Gatt-Client连接到Linux Gatt Server

我尝试通过蓝牙低功耗GATT模式将android连接到linux。

在Bluez中有一个示例代码: btgatt-server.c ,我用它作为服务器。

Android Side是Android官方的例子:连接到GATT服务器 。 也就是说,使用函数BluetoothDevice :: connectGatt(Context context,boolean autoConnect,BluetoothGattCallback callback)。

运行后,Android部分返回连接成功,(BluetoothGattCallback :: onConnectionStateChange的参数为STATE_CONNECTED),但是linux(btgatt-server)中的程序没有得到任何响应,仍然阻塞在等待接受。 (485行)。

我还使用了另一个示例代码: l2cap-ble.c ,结果是完全一样的。

任何人都可以帮助我? 我的目标是:连接之后,linux gatt服务器会向Android发送一个数据。 然后断开连接。

非常感谢你

Solutions Collecting From Web of "低功耗蓝牙:Android Gatt-Client连接到Linux Gatt Server"

我刚刚面临同样的问题。

这似乎是Android和Broadcom蓝牙模块发生的错误。 Android以某种方式连接到错误的l2cap通道。

解决方法是明确禁用广告中的BR / EDR支持。

在#8的解决方案在谷歌的错误报告可以在这里找到,提示帮助我的报价:

我已经从Broadcom获得了关于这个bug的信息,我不认为它是一个bug。 如果没有在广告中特别设置“BR / EDR不支持”位(位2),则Broadcom堆栈将使用BR / EDR和BTLE。 将领先的广告包从020102更改为020106解决了这个问题。

使用bluez btmgmt在设备上配置广告hci0我发出以下命令:

 btmgmt -i hci0 power off btmgmt -i hci0 le on btmgmt -i hci0 connectable on btmgmt -i hci0 bredr off # Disables BR/EDR ! btmgmt -i hci0 advertising on btmgmt -i hci0 power on 

启动bluez btgatt-server示例:

 btgatt-server -i hci0 -s low -t public -r -v