2012-11-30 181 views
9

我有一個通過藍牙連接到設備的項目。它曾經相當可靠地工作,但現在每次都不能通過BluetoothSocket.connect()。 (好吧,我在4小時內嘗試了數千次嘗試連接一次。)大部分代碼都來自API中的標準示例聊天代碼,除了在獲取BluetoothSocket設備時的常見修改之外本身:BluetoothSocket.connect()拋出異常「讀取失敗」

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

這裏是感興趣的方法,該方法被運行一次BluetoothSocket獲得:

public void run() { 
    setName("ConnectThread" + mSocketType); 

    // Always cancel discovery because it will slow down a connection 
    mAdapter.cancelDiscovery(); 

    // Make a connection to the BluetoothSocket 
    try { 
    mmSocket.connect(); 
    } catch (Exception e) { 
    Log.e(TAG, "Connection to " + mmDevice.getName() + " at " 
       + mmDevice.getAddress() + " failed:" + e.getMessage()); 
    // Close the socket 
    try { 
     mmSocket.close(); 
    } catch (Exception e2) { 
     Log.e(TAG, "unable to close() " + mSocketType 
       + " socket during connection failure", e2); 
    } 
    connectionFailed(e.getMessage()); 
    return; 
    } 

    // Reset the ConnectThread because we're done 
    synchronized (BluetoothChatService.this) { 
    mConnectThread = null; 
    } 

     // Start the connected thread 
    connected(mmSocket, mmDevice, mSocketType); 
} 

相關的日誌條目(如果同時呼籲connect()被捕獲的異常印)是這樣的:

11-30 10:23:51.685 E/BluetoothChatService(2870):連接到 ZYNO-700091在00:06:66:42:8E:01失敗:讀取失敗,套接字可能關閉 ,讀取ret: -1

這個錯誤曾經有一段時間出現過。我有一個積極的重新連接系統 - 它基本上反覆連接連接,直到它連接,如果它斷開連接,它會再次開始錘擊它。所以,它會殺死連接線程並不斷從頭開始。我曾考慮過可能存在一個問題 - 可能是多線程問題,或者可能是處理套接字清理/初始化。但是,如果是這種情況,我仍然期望第一次連接嘗試成功,因爲在連接嘗試失敗之前系統纔會啓動。

我看着source code拋出異常。問題似乎是底層的InputStream沒有數據。當然,這不是一個真正的答案,只是朝着它邁出的一步。爲什麼這個流沒有數據?

我想保持對潛在問題的開放態度。我是否正確地獲得了BluetoothSocket?事實上,它曾經是一個間歇性問題,現在幾乎不變,這讓我懷疑是多線程的,但與C++相比,這是一個相對簡單的話題 - 如果你知道自己在做什麼很難搞定。此外,大部分代碼(特別是涉及同步線程的部分)都是直接從示例代碼中提取出來的。

另一端的設備是一個嵌入式藍牙設備,所以從這方面調試問題沒有多少希望。

UPDATE ===========================

它發生,我認爲這可能是由於操作系統升級(我在Galaxy Nexus手機上運行 - 我有幾個要測試)。所以我用4.0.4解開了一個新手機,它工作!然後回到原來的兩款測試手機上進行測試,這兩款手機都運行在4.2版本上,期待着我一直看到的失敗。奇怪的是,現在它也適用於這些手機。我想說我已經做了一些工作來重新開始這項工作,但我沒有。我仍然很迷惑,現在也懷疑這件事情在我真正需要時會起作用。

我不知道是否有可能以某種方式連接使用4.0.4可以正確設置服務器模塊的狀態,使其接受4.2設備?只是在黑暗中拍攝,我想......

更新2 ===========================

我發現,解除配對和重新配對將使設備連接。這是一種解決方法,但總比沒有好。

+0

我有同樣的問題,我有打印通過藍牙Datamax o'neil APEX4打印機的代碼。在Galaxy Tab 7以及Honeycomb 3.2上正常工作。但在ICS或更高版本的其他設備中,請勿使用。我正在比較BluetoothSocket對象並且非常不同。你確定你還沒有添加任何代碼嗎? – ClarkXP

+0

Jellybean有一個完全不同的藍牙堆棧,因此版本差異肯定會觸發某些東西,但這本身並不能解釋爲什麼它保持工作或不工作 - 與舊設備連接後工作。難道是配對嗎?如果再次發生,請嘗試從設備取消配對並重新配對,然後查看會發生什麼情況。 –

+0

@DanHulme我認爲你是對的,這是導致它的不同藍牙堆棧。我用4.1做了一些測試,並且在那裏工作得很好。如果你想把它寫成答案,我很樂意接受它。 –

回答

8

Jellybean有一個完全不同的藍牙堆棧,所以版本差異肯定會觸發某些東西,但這本身並不能解釋爲什麼它保持工作或不工作 - 與舊設備連接後工作。難道是配對嗎?如果再次發生,請嘗試從設備取消配對並重新配對。

+2

我只有在Nexus 7,Android4.2.1上有同樣的問題 - 在所有其他Android版本和其他手機/設備上,它都能正常工作。重新配對並沒有幫助。還有什麼需要做的,使其再次工作?非常感謝! ps die UUID ist OK – user387184

+0

我也堅持相同的問題,任何幫助將不勝感激。 –

2

我知道這是一個古老的問題。但由於我無法在網上找到任何解決方案,下面是我最近創建的解決方法:IOException: read failed, socket might closed - Bluetooth on Android 4.3

+0

非常有趣。我必須嘗試一下,看看它是否可以在我的設備上運行。謝謝! –

+0

很酷。你能否報告你的發現?我只有兩個4.3設備可用atm。 – matthes

+0

恐怕我做不到。自從我上次發佈以來,我無法再訪問出現此錯誤的硬件。 –

-3

我認爲這可能有效:首先,您必須連接到互聯網並安裝一個移動市場apk並嘗試尋找FXR WiFi Fix並拯救並安裝它們並執行,我有幸與我的SONY藍牙52耳機有類似的問題,目前它正在努力工作。

+3

哦,來吧。你能提出一個程序化的解決方案嗎? – SoloPilot

+3

這個答案沒有任何意義 –