2014-12-18 250 views
1

我尝试通过蓝牙低功耗GATT模式将android连接到linux。蓝牙低功耗:Android Gatt-Client连接到Linux Gatt服务器

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

安卓侧视为Android official example:Connecting to a GATT Server。也就是说,使用函数BluetoothDevice :: connectGatt(Context context,boolean autoConnect,BluetoothGattCallback callback)。

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

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

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

非常感谢。

+0

当您尝试发生什么从你的Android应用发现服务?还可以尝试'btmon'来查看是否有任何数据包交换真的发生在您的蓝牙接口中。 –

+0

在我的[博客](http://gaiger-programming.blogspot.tw/2015/01/bluetooth-low-energy-customizing-gatt.html)中,我已经做了这个问题来定制gatt服务,请参考它。 –

回答

2

我刚才面临同样的问题。

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

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

在#8的解决方案对谷歌的错误报告可以发现here,对帮助过我的暗示报价:

我从博通关于这个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服务器例如:

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