開發Ble(公司項目,防丟器)已經有一段時間,由於是第一次接觸Ble而網上資料又不多,且android平台自身的差異性,遇到了很多問題。為了將來方便查閱,在此做下記錄。
1.中興手機,藍牙手動斷開后,無法再次鏈接問題。(可能別的手機也存在類似問題)
解決辦法: 在連接gatt之前,對bluetoothadapter進行一次scan 順利解決此問題。
2.Gatt鏈接不穩定(在部分手機上出現過,此問題先排除硬件問題。此處只針對自己遇到的情況,或許有別的方案,待補充)
解決辦法: 由於用到了gattserver,在啟動gattserver和連接gatt之間由於未做順序的限制,導致了此問題。經過反復調試后,發現只需要先創建gattserver,在serviceadded之后,在去進行gatt鏈接,此時的gatt連接會比較穩定。
3.小米手機遇到的,在gatt連接之后,手動調用gatt.disconnect 和 close。第二次鏈接后 自動斷開,再次連接會重新綁定。
解決辦法:也是無意中,看到一篇文章,寫的是小米手機在gatt操作的時候 ,最好要做一下sleep操作,可能是因為小米底層對藍牙的某些東西沒有來得及釋放(自己猜測)。 於是在gatt 連接上時,在gatt.discoverServices 之前,加上 sleep(500) ,發現斷開后在連接 成功率大大提高。
2014-11-14
4.藍牙關閉和打開變得異常緩慢,甚至崩潰
此問題可能與當藍牙關閉時,尚有為關閉的 gatt連接/gattserver。我的解決辦法是,注冊藍牙狀態的監聽,當發現藍牙狀態變為BluetoothAdapter.STATE_TURNING_OFF 時,立刻釋放所有的gatt連接,關閉gattserver。經不完全測試發現,藍牙的關閉速度變得快多了。
5.當批量連接藍牙時,不進行onConnectionStateChange 回調。
這個問題是自己 閑的蛋疼,在測試的時候,用了很多假的mac 地址。於是造成的后果可想而知,肯定的是連不上的。但是同時也發現了問題,當ble去連接一個不存在的mac,或者不在范圍內的mac地址時,發現有時候 不會進行onConnectionStateChange的回調,覺得很蛋疼。個人覺得會不會是因為 ,同時發送的connectGatt 請求太多,導致了系統的藍牙阻塞或者別的什么問題。沒辦法,既然發現了這個問題,就只好動手解決了。 首先,我在批量連接connectGatt的時候,新增了一個掃描,只有當 要連接的 設備掃描到了,才進行連接。然后,我還對gatt的連接,做了一個同步(每次只能進行一個連接,上一個連接不結束的話,無法開始上一個連接,同時針對連接無回調的情況做了超時處理,超時的話立馬釋放當前連接)。 這么說可能感受不是很直觀。但個人覺得,在操作手機藍牙的時候,還是做個同步的好。 避免同時發生多個gatt的操作,倒是手機藍牙奔潰等情況的發生。
2014-11-266.Gatt鏈接不穩定 二
最近因為在保存gatt連接狀態的serveice中,增加了一個后台的lescan,突然發現gatt連接又變的不穩定了,不知道什么原因。走投無路的情況下,把后台的lescan放到另一個service中進行,發現好像gatt又變得穩定多了,目前測試下來 已經連了40分鍾沒有斷開了。 不知道接下去會咋樣。 也不知道是不是因為在同一個線程中在gatt連接成功后,開啟lescan會導致連接不穩定,或亦是手機本身的原因,希望高人指教。
2014-11-27
還是上面的問題,今天早上來,又重試了后台掃描和gatt連接,發現又有兩次斷開,誒。。。。 郁悶,求高人指教了。
以上發現的問題,均為個人開發經驗所得,如有不妥或者欠缺錯誤的地方,請大家指正批評。