2012-02-13 63 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