2010-09-30 74 views
1

我可以使用SPP同時連接到基於Android的手機的兩個設備,但是一旦我打開輸入流(如socket.getInputStream()),其中一個將返回0數據流,即數據流中沒有可用的數據。 例如,分別連接到設備A(devA)和設備B(devB)的線程A(thA)和線程B(thB)。因此,thA使用輸入流A(inA)從devA接收數據,thB使用輸入流B(inB)從devB接收數據。如下: devA ---> inA ---> thA devB ---> inB ---> thB 它可以正常工作,如果我分別連接到每個設備。但是,在同時連接兩個設備的情況下,只有inA或inB上有數據。藍牙與多設備使用SPP連接

如果它發生在你身上,請與我分享你的經歷,我會非常感激! 預先感謝您。 YT

回答

0
  1. 你爲什麼使用反射createRFCommSocket? device.getClass()。getMethod(「createRfcommSocket」,new Class [] {int.class});

而非

 try {mBTSocket = mBTDevice.createRfcommSocketToServiceRecord(UUID_RFCOMM_GENERIC); 
     } catch (Exception e1) { 
      msg ("connect(): Failed to bind to RFCOMM by UUID. msg=" + e1.getMessage()); 
      return false; 
     } 

反射可以很容易地的問題的來源。如果沒有理由使用它,那麼不惜一切代價避免它。另外,如果getClass調用失敗,那麼你的「m」變量將爲null,並且你不會陷入這種情況。您應該更加概括您的異常,而不是使用特定的異常,只需使用「異常」就像在上面的代碼片段中一樣。對於可能拋出的每種可能類型的異常來說,添加catch都要容易得多。

  1. 我對你在處理程序中做什麼感到困惑,它對我沒有意義。你可以刪除處理程序代碼來簡化事情嗎?

  2. 只有太多的併發症。刪除所有的反射,額外的捕獲。

  3. 這是很好的編碼實踐,使您的方法一頁或更少。當一個方法不止一頁時,它太複雜了,它使得閱讀和調試非常困難。通過創建其他方法來執行常見任務來減少方法的大小。

  4. 將您的connect()邏輯與您的I/O邏輯分開。你應該有一個發送數據的方法,一個接收數據的方法,一個connect()的方法。然後,一旦你得到那些工作,大塊和創建更高級別的I/O發送和接收整個數據塊的方法。然後完善這些方法並保持成長。

在我的代碼中,讀,寫,連接和ALL I/O方法每個只有1-20行。保持它們非常簡單,因爲你的I/O邏輯是你的應用程序的核心,它需要乾乾淨淨。

+0

我更新我的信息如下: http://stackoverflow.com/questions/3857508/could-more-than-one-rfcomm-channels-be-created-per-time – user462358 2010-10-04 18:50:43