2013-07-23 75 views
2

我正在使用兩個配對智能手機之間的藍牙連接的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很相似。

回答

4
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
tmp = (BluetoothSocket) m.invoke(device, 1); 

&

m = mAdapter.getClass().getMethod("listenUsingRfcommOn", new Class[] { int.class }); 
tmp = (BluetoothServerSocket) m.invoke(mAdapter, BLUETOOTH_CHANNEL); 

嗯....我不是一個BT的專家,但我知道,我的代碼使用反射工作沒有UUID。我不認爲這是一個好的解決方案,如果你想要一些乾淨的東西,但我只是知道,在我的情況下,它的工作原理(在2.3.6):)

+0

不幸的是,spp uuid並沒有解決它。第一個連接總是有效的,下面的連接不是。 – eang

+1

嗯,我的服務發現在我的第一個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代碼時,我能夠連接/斷開多達我想要的:) –

+0

那麼,使用反射就不再需要UUID了?相反,我必須選擇一個BT頻道? – eang

相關問題