我正在開發一個需要自動連接到可調外設的應用程序。使用綁定設備時gatt.writeDescriptor錯誤狀態回調
我有粘粘的服務,執行以下操作:
- 查找所需的設備在接合裝置
- 如果它不細的裝置(第一次),掃描它並粘合到它通過使用
device.createBond()
,等待鍵通過監聽廣播ACTION_BOND_STATE_CHANGED - 使用
device.connectGatt(ctx,true,callback)
- 等待連接到它
onConnectionStateChange
回調與連接狀態 完成
- 使用
gatt.discoverServices()
- 等待
onServicesDiscoverd
回調 - 能夠在特徵通知通過編寫使用
gatt.writeDescriptor
- 等待與成功狀態onDescriptorWrite回調描述開始服務發現
BluetoothGatt.GATT_SUCCESS (0)
- 做的東西與它收到的通知
這一切都第一次正常工作。當設備斷開連接(例如超出範圍或關閉)粘性服務回調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
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
一些更多的細節,如果我只保存無線設備地址和使用bluetoothAdapter.getRemoteDevice(地址)連接,那麼我從來沒有這個問題。 它只是綁定時,也許債券信息不再有效後,我的設備重新啓動?債券保留什麼信息? – talarari
你找到解決方案嗎?我也認爲延遲不是解決問題的好方案 – Jame
請注意,22不是BTA_GATT_CONN_LMP_TIMEOUT - 22和0x22之間有很大差異。 22 = 0x16。 –