2014-09-24 91 views
3

我正在開發一個Android應用程序,它通過藍牙SPP連接到PAN1026芯片,應該以50赫茲的速率接收數據(約80字節)。藍牙插座讀取速度減慢PAN1026

該芯片可以正常運行在mac上的python腳本。它與另一個跨平臺模塊(linux,mac,windows)一起工作良好。

我寫了另一個與芯片完全相同的Android應用程序:以50 Hz的速率發送數據(大約80字節)。而且我的應用可以與第二款Android應用一起使用。我的應用程序工作正常,以及在Mac上運行的python腳本。

但是:當我的應用程序連接到芯片時,它僅以2 Hz的速率接收數據,造成不可接受的滯後。當我使用Play商店的藍牙調試應用程序(BlueSPP或Bluetooth SPP pro)時,也會發生這種情況。

所以基本上這個問題只發生在Android和PAN1026之間。我使用Android 4.4。

我想: - 纏上了我的InputStream中的BufferedInputStream的情況下,我沒有閱讀速度不夠快,但它實際上是值得的。也許是因爲InputStream實際上是一個BluetoothInputStream。 - 配置文件內存使用情況,但我沒有發現任何可疑的泄漏。 - 使用反射方法連接(它甚至沒有連接)。 - 連接使用不安全的方法:相同的滯後問題。

我沒有嘗試: - 使用另一個版本的Android,因爲最終應用程序也會使用BLE,因此不需要早期版本。

我將嘗試: - 檢查芯片側面是否實際發送數據的速率是否爲50 Hz。但在任何情況下都不能解決問題。

我做錯了什麼?或者Android和PAN1026之間存在錯誤?在這種情況下做什麼?

我將不勝感激在這個問題上的任何幫助。

這裏是ConnectThread,類似於藍牙聊天例如:

private class ConnectThread extends Thread{ 
     public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
     private final BluetoothSocket mmSocket; 

     public ConnectThread(BluetoothDevice device) { 
      BluetoothSocket tmp = null; 
      try { 
       tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 
      } catch (IOException e) { 
       Log.e(TAG, e.toString()); 
      } 
      mmSocket = tmp; 
     } 

     public void run() { 
      mAdapter.cancelDiscovery(); 

      try { 
       mmSocket.connect(); 
      } catch (IOException connectException) { 
       try { 
        mmSocket.close(); 
       } catch (IOException closeException) { Log.e(TAG, closeException.toString());} 
       return; 
      } 
      synchronized (this) { 
       resetConnectThread();//properly deallocate memory 
      } 
      connected(mmSocket);//start the following thread 
     } 
    } 

這裏是我的ConnectedThread: 我簡化了代碼,因此它很容易理解和有限的問題。事實上,當下面的線程只從套接字讀取時,問題也會發生。所以如果芯片不在芯片的一面,瓶頸就在讀取方法中。

private class ConnectedThread extends Thread{ 

     private final BluetoothSocket mmSocket; 
     private final InputStream mmInStream; 
     private final OutputStream mmOutStream; 

     public ConnectedThread(BluetoothSocket socket) { 
      this.mmSocket = socket; 
      InputStream tmpIn = null; 
      OutputStream tmpOut = null; 

      try { 
       tmpIn = socket.getInputStream(); 
       tmpOut = socket.getOutputStream(); 
      } catch (IOException e) { 
       BluetoothService.this.stop(); 
      } 

      this.mmInStream = tmpIn; 
      this.mmOutStream = tmpOut; 
     } 

     public void run() { 
      byte[] buffer = new byte[80]; 
      int bytes; 

      while (true) { 
       try { 
        bytes = mmInStream.read(buffer, 0, 80); 
       } catch (IOException e) { 
        BluetoothService.this.stop(); 
        break; 
       } 
      } 
     } 
} 

回答

3

你的問題看起來像this one。我敢打賭,你的設備會進入嗅探模式,因爲它不會向PAN1026發送任何信息。您可以通過在設備中獲取您的HCI日誌來檢查該設備。

Android只監視tx通道(傳輸)而不是rx通道(接收)。從我在代碼中可以看到的不會向設備發送任何數據,因此您不使用tx通道。正如在上面的帖子中所提到的,您應該嘗試每〜500ms發送一次數據以避免您的設備進入偵聽模式。