我有一個通過藍牙連接到設備的項目。它曾經相當可靠地工作,但現在每次都不能通過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 ===========================
我發現,解除配對和重新配對將使設備連接。這是一種解決方法,但總比沒有好。
我有同樣的問題,我有打印通過藍牙Datamax o'neil APEX4打印機的代碼。在Galaxy Tab 7以及Honeycomb 3.2上正常工作。但在ICS或更高版本的其他設備中,請勿使用。我正在比較BluetoothSocket對象並且非常不同。你確定你還沒有添加任何代碼嗎? – ClarkXP
Jellybean有一個完全不同的藍牙堆棧,因此版本差異肯定會觸發某些東西,但這本身並不能解釋爲什麼它保持工作或不工作 - 與舊設備連接後工作。難道是配對嗎?如果再次發生,請嘗試從設備取消配對並重新配對,然後查看會發生什麼情況。 –
@DanHulme我認爲你是對的,這是導致它的不同藍牙堆棧。我用4.1做了一些測試,並且在那裏工作得很好。如果你想把它寫成答案,我很樂意接受它。 –