2014-12-18 297 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