我正在使用兩個配對智能手機之間的藍牙連接的Android應用程序。藍牙邏輯基於着名的BluetoothChat SDK示例:管理用於服務器accept()
的線程的「服務」類,用於客戶端connect()
的線程以及用於在套接字上讀/寫的線程。java.io.IOException:服務發現失敗
一切工作正常,但如果我關閉活動連接(無論是從客戶端或服務器端),那麼所有連續嘗試啓動一個新的連接將會失敗,此錯誤:
java.io.IOException: Service discovery failed
經過一番研究,我認爲這是UUID的問題。我正在使用BTChat示例的UUID(fa87c0d0-afac-11de-8a39-0800200c9a66
),但問題仍然存在於另一個隨機UUID(它是31ef5990-dc20-11e2-a28f-0800200c9a66
)。
這裏是相關的客戶端logcat。 (客戶端connect()
就是失敗):
E/BluetoothService.cpp: stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
D/BluetoothService: Cleaning up failed UUID channel lookup: 30:17:C8:A7:C6:C3 fa87c0d0-afac-11de-8a39-0800200c9a66
java.io.IOException: Service discovery failed
的d-Bus的錯誤可能是由cancelDiscovery()
是Android的文檔造成表明connect()
之前調用。我認爲failed UUID channel lookup
是真正的問題,但我不知道如何解決這個問題。我應該使用另一個(衆所周知的)UUID嗎?
如果需要,我可以顯示代碼片段。然而,這個問題在邏輯上與BluetoothChat很相似。
不幸的是,spp uuid並沒有解決它。第一個連接總是有效的,下面的連接不是。 – eang
嗯,我的服務發現在我的第一個BT應用上失敗了。然後我用反射來創建套接字: 'm = mAdapter.getClass()。getMethod(「listenUsingRfcommOn」,new Class [] {int.class}); tmp =(BluetoothServerSocket)m.invoke(mAdapter,BLUETOOTH_CHANNEL);'(With BLUETOOTH_CHANNEL the socket of the socket) 但是當我改變原來的bluetoothChat代碼時,我能夠連接/斷開多達我想要的:) –
那麼,使用反射就不再需要UUID了?相反,我必須選擇一個BT頻道? – eang