Android Bluetooth: медленные скорости передачи данных, рассчитанные по BluetoothSocket - PullRequest
1 голос
/ 13 февраля 2012

Использование: HTC Legend и HTC Salsa

Я рассчитываю скорость, используя:

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) {
            }
        }

И запись некоторых тестовых данных с использованием

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

Записи находятся в других потоках, в то время как (true) также.

Я получаю следующие результаты.

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 с EDR

Что является способным к 260 КБ / с , но я даже не получаю старый стандарт 90 КБ / с

Я не уверен, что это мой поток и вызовы чтения / записи (я использую буферизованный поток данных) Или, если я неправильно рассчитываю или у меня неверная информация?

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

Я думаю, что скорость зависит от вашей реализации потоков отправки и получения, так как вы соединяете 2 устройства Android со своими собственными приложениями.Не могли бы вы опубликовать свою реализацию?

У меня тоже возникла такая же проблема.
Я использую ACER TAB A500 для связи с флешкой Bluetooth, подключенной к ПК, и для отправки я получил еще более медленный результат - 12,3 КБ / столько данные.

Вот почему я провел несколько экспериментов.Я отправил сообщение 10000 раз и получил, что скорость передачи данных зависит от длины сообщения.

Для сообщения 1 КБ скорость передачи данных составляет 232 КБ / с.
Для 40 байтсообщение, скорость передачи данных составляет 18 КБ / с.
Для сообщения размером 1 байт скорость передачи данных составляет 0,48 КБ / с.

Вот мой код:

// 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 голосов
/ 21 июня 2015

Не уверен, поможет ли это в вашей проблеме со скоростью, и я мог пропустить эту деталь в вашем фрагменте кода, но вы читаете и пишете в одном и том же потоке?Документация предполагает, что вы этого не сделаете,

Прежде всего, вы должны использовать выделенный поток для чтения и записи всего потока.Это важно, потому что методы read (byte []) и write (byte []) блокируют вызовы.

Bluetooth Android Developer

...