2012-02-13 25 views
1

计算使用慢速的数据速率:HTC联想和HTC莎莎Android的蓝牙:从的BluetoothSocket

我计算使用速度:编写一些测试数据使用

out.writeUTF("ababababababababababababababababbabababaababababababababababababababababbabababaababababababababababababababababbabababa" + 
         "ababababababababababababababababbabababaababababababababababababababababbabababaababababababababababababababababbabababa" + 
         "ababababababababababababababababbabababaababababababababababababababababbabababaababababababababababababababababbabababa" + 
         "ababababababababababababababababbabababaababababababababababababababababbabababaababababababababababababababababbabababa"); 
out.flush(); 

while(true) 
     { 
      try 
      { 
       int num = in.read(buffer); 
       if(reading == false) 
       { 
        prevTime = SystemClock.uptimeMillis(); 
        reading = true; 
       } 
       else 
       { 
        //Calculate KB/s 
        count += num; 
        Long deltaTime = SystemClock.uptimeMillis()- prevTime; 
        if(deltaTime >= 1000) 
        { 
         Float speed = (float)count/deltaTime; 
         Log.d(TAG,"Data: " + speed + "KB/s"); 
         count = 0; 
         prevTime = SystemClock.uptimeMillis(); 
        } 
       } 

      } catch (IOException e) { 
      } 
     } 

而且

写入在另一个线程内,同时(真)。

我收到以下结果。

02-13 18:17:16.897: D/krazyTag(3432): Data: 31.554672KB/s 
02-13 18:17:17.927: D/krazyTag(3432): Data: 29.854227KB/s 
02-13 18:17:18.977: D/krazyTag(3432): Data: 29.285034KB/s 
02-13 18:17:20.067: D/krazyTag(3432): Data: 38.446888KB/s 
02-13 18:17:21.097: D/krazyTag(3432): Data: 35.89484KB/s 
02-13 18:17:22.127: D/krazyTag(3432): Data: 33.67118KB/s 
02-13 18:17:23.227: D/krazyTag(3432): Data: 33.512726KB/s 
02-13 18:17:24.307: D/krazyTag(3432): Data: 33.277622KB/s 

这是困惑我,因为他们使用Bluetooth® 2.1 with EDR

这是capable of 260KB/S手机功能状态,但我还没有得到旧标准90KB/S

我不知道这是否是我的流和读/写调用(我正在使用缓冲数据输入流) 或者如果我计算错误或有错误的信息?

+0

我认为它的260KB/s和260KB没有/ S B --->位b ---字节:) – 2012-02-13 15:49:46

回答

2

我认为速度取决于您的发送和接收线程的实现,因为您将2个Android设备连接到您自己的应用程序。你可以发布你的实现吗?

我也有同样的问题。
我正在使用ACER TAB A500与连接到PC的蓝牙棒进行通信,我发送数据的速度更慢,结果为12.3KB/s。

这就是为什么我做了一些实验。我发了一个消息10000次,我知道数据速率取决于消息的长度。

对于1KB消息,数据速率为232KB/s。
对于40字节的消息, 数据速率为18KB/s。
对于1Byte消息,数据速率为 0.48KB/s。

这里是我的代码:

// Get the BluetoothDevice object. 
while(true){ 
    driverBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    driverBluetoothDevice = driverBluetoothAdapter.getRemoteDevice("XX:XX:XX:XX:XX:XX"); 
    if (driverBluetoothDevice == null){ 
    break; 
    } 

    Method insecureMethod = driverBluetoothDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[] { int.class }); 
    byte portNumber = 5; // The SPP in port 5. 
    driverBluetoothSocket = (BluetoothSocket) insecureMethod.invoke(driverBluetoothDevice, portNumber); 

// Try to connect to the Bluetooth device. 
try { 
    driverBluetoothSocket.connect(); 
} catch (IOException e1) { 
    // Failed to connect to the device 
     break; 
} 

    // Open input and output stream. 
try { 
    driverInputStream = driverBluetoothSocket.getInputStream(); 
} catch (IOException e) { 
    break; 
} 
try { 
    driverOutputStream = driverBluetoothSocket.getOutputStream(); 
} catch (IOException e) { 
    break; 
} 

byte[] message = new byte[3000]; 
Random randomGenerator = new Random(); 
for (int i = 0; i < message.length; i++){ 
    message[i] = (byte) randomGenerator.nextInt(100); 
} 

Date TimeValue = new Date(); 
long TimeStamp1 = TimeValue.getTime(); 
for (int i = 0; i < 10000; i++){ 
    try { 
     driverOutputStream.write(message, 0, message.length); 
    } catch (IOException e) { 
     break; 
    } 
    } 

TimeValue = new Date(); 
long TimeStamp2 = TimeValue.getTime(); 
long TimeDifference = TimeStamp2 - TimeStamp1; 
TimeDifference = 0; 
    break; 
} 
+0

感谢您的回复,我会尝试写在一个笨重量单写电话,看看我得到什么。我原来只有2KB/s没有缓冲inputStream顺便说一句。你想看到关于我的蓝牙实现的特别之处? – 2012-02-14 00:02:53

+0

好的,所以我尝试了在for循环中发送的3000字节,就像你的一样,但速度只降到了18-20KB/s。我在同一时间在每部手机上读取和写入这些字节数。我应该期望更好的结果,如果每个设备只是写或读而不是两者? – 2012-02-14 00:24:36

+0

对我来说也是一样的情况。如果我同时写入和读取,写入速度从12KB/s(仅写入)降低到4KB/s。 – 2012-02-14 09:31:02

0

不知道这是否有助于你的速度问题,我可以在你的代码片段都忽略了这个细节,但你是在读和在同一线程上编写?文档建议您不要,

首先,您应该使用专用线程来读取和写入所有数据流。这很重要,因为read(byte [])和write(byte [])方法都是阻塞调用。

Bluetooth Android Developer