2014-09-24 38 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发送一次数据以避免您的设备进入侦听模式。