我尝试通过蓝牙低能耗GATT模式将android连接到linux。
Bluez中有一个示例代码:btgatt-server.c,我将其用作服务器。
Android Side与Android official example:Connecting to a GATT Server一样。也就是说,使用函数BluetoothDevice :: connectGatt(Context context,boolean autoConnect,BluetoothGattCallback回调)。
运行后,Android部分返回连接成功,(BluetoothGattCallback :: onConnectionStateChange的参数为STATE_CONNECTED),但linux(btgatt-server)中的程序没有得到任何响应,仍然阻止等待接受。 (第485行)。
我还使用了另一个示例代码:l2cap-ble.c,结果完全相同。
有人可以帮助我吗?我的目标是:连接后,linux gatt服务器会向Android发送数据。然后断开连接。
非常感谢你。
答案 0 :(得分:2)
我刚刚面临同样的问题。
这似乎是Android和Broadcom蓝牙模块发生的错误。 Android以某种方式连接到错误的l2cap通道。
解决方法是在广告中明确禁用BR / EDR 支持。
谷歌上#8解决方案的错误报告可以找到here,这个提示的引用帮助了我:
我已从Broadcom获取有关此错误的信息,我不认为它是一个错误。如果没有特别设置不支持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