2015-08-18 238 views
5

我正在開發一個需要自動連接到可調外設的應用程序。使用綁定設備時gatt.writeDescriptor錯誤狀態回調

我有粘粘的服務,執行以下操作:

  1. 查找所需的設備在接合裝置
  2. 如果它不細的裝置(第一次),掃描它並粘合到它通過使用device.createBond(),等待鍵通過監聽廣播ACTION_BOND_STATE_CHANGED
  3. 使用device.connectGatt(ctx,true,callback)
  4. 等待連接到它onConnectionStateChange回調與連接狀態
  5. 完成
  6. 使用gatt.discoverServices()
  7. 等待onServicesDiscoverd回調
  8. 能夠在特徵通知通過編寫使用gatt.writeDescriptor
  9. 等待與成功狀態onDescriptorWrite回調描述開始服務發現BluetoothGatt.GATT_SUCCESS (0)
  10. 做的東西與它收到的通知

這一切都第一次正常工作。當設備斷開連接(例如超出範圍或關閉)粘性服務回調gatt.disconnect()gatt.close()時,重新啓動並執行所有操作,這次它使用綁定設備進行連接。

一切都正常工作,直到第7步,這意味着我得到一個回調onDescriptorWrite與狀態133有時後面的連接狀態更改回調與狀態0和狀態22

我找不到任何信息在網上什麼狀態133或22的意思。

任何想法爲什麼會發生這種情況?

我現在正在努力解決這個問題,現在是通過去除債券(反射)迴應壞的onDescriptorWrite回調,然後再用新鮮掃描的設備再做一次。

所以基本上我只是在等待設備連接,然後重新啓動整個事情。

這意味着綁定設備的gatt連接無法寫入我需要的描述符。

感覺就像我失去了一些東西,很想知道是什麼。

編輯: 一些初步認識logcat的輸出

08-18 16:06:31.363 12765-12835/? W/bt-att﹕ gatt_rsp_timeout disconnecting... 
08-18 16:06:31.363 12765-12835/? W/bt-btif﹕ bta_gattc_conn_cback() - cif=3  connected=0 conn_id=3 reason=0x0016 
08-18 16:06:31.363 12765-12835/? W/bt-btif﹕ bta_gattc_conn_cback() - cif=4  connected=0 conn_id=4 reason=0x0016 
08-18 16:06:31.363 12765-12835/? W/bt-btif﹕ bta_gattc_conn_cback() - cif=5  connected=0 conn_id=5 reason=0x0016 
08-18 16:06:31.366 12765-12807/? D/BtGatt.GattService﹕ onDisconnected() -  clientIf=5, connId=5, address=C1:D1:22:BA:F5:13 
here im getting onDescriptorWrite with status 133 
D/BluetoothGatt﹕ onClientConnectionState() - status=22 clientIf=5  device=C1:D1:22:BA:F5:13 

通過這個長相:
https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/idea133/bta/include/bta_gatt_api.h#169

16意味着BTA_GATT_CONN_TERMINATE_LOCAL_HOST
22意味着BTA_GATT_CONN_LMP_TIMEOUT

問這個在北歐github上:https://github.com/NordicSemiconductor/Android-nRF-Toolbox/issues/9#issuecomment-132191406

+0

一些更多的細節,如果我只保存無線設備地址和使用bluetoothAdapter.getRemoteDevice(地址)連接,那麼我從來沒有這個問題。 它只是綁定時,也許債券信息不再有效後,我的設備重新啓動?債券保留什麼信息? – talarari

+0

你找到解決方案嗎?我也認爲延遲不是解決問題的好方案 – Jame

+0

請注意,22不是BTA_GATT_CONN_LMP_TIMEOUT - 22和0x22之間有很大差異。 22 = 0x16。 –

回答

1

問這個北歐上GitHub的: https://github.com/NordicSemiconductor/Android-nRF-Toolbox/issues/9#issuecomment-132191406

下他們的推薦加2秒延遲調用connectGatt之後,現在,它的工作原理。

+0

好吧,是錯的,延遲並沒有解決它。 – talarari

+1

Hi @talarari我認爲我們可能有類似的問題,你有沒有找到解決方案?謝謝。 – poshaughnessy

+0

@talarari,我也面臨同樣的問題,你是否解決了這個問題?。提前感謝 – kavie

相關問題