Низкая скорость передачи данных через TCP / IP-сокет в некоторых устройствах Android - PullRequest
0 голосов
/ 07 мая 2019

У меня есть приложение, которое должно получать данные с устройства, подключенного к сети WiFi.Устройство имеет встроенный модуль WiFi, поэтому приложение должно подключиться к сети WiFi модуля и начать сбор данных. Важно: эта сеть НЕ подключена к Интернету

Проблема в том, что в некоторых устройствах (Samsung J7 neo, Samsung J1 Ace и т. Д.) Я могу получить постоянную скорость передачи данных,но в других я не могу (например, в планшетном ПК Samsung Gallaxy Tab A).

Модуль сбора данных генерирует данные со скоростью 37 Кбит / с и может буферизовать до 1 МБ данных, но буфер заполнени переполнение.

  • Я читаю все, что могу, с интервалами 500 мс
  • Я пытался использовать C ++ и Java Sockets (в тестовом приложении) с тем же результатом
  • Я использую WIFI_MODE_FULL_HIGH_PERF для максимизации производительности WiFi
  • Я отключаю сотовую сеть передачи данных

Я знаю, что я требую поведения в реальном времени для приложения Android,но я не могу поверить, что не могу получить скорость передачи 37 Кбит / с по этой сети Wi-Fi.Я знаю, что проблема может быть в модуле сбора данных (я не очень-то контролирую это), но странно то, что связь прекрасно работает со многими устройствами Android.

Я постараюсь понюхатьсеть Wi-Fi, чтобы посмотреть, найду ли я что-нибудь, какое-нибудь предложение?

Этот тест является частью гораздо более крупного эксперимента.Как я сказал в начале, приложение работает нормально на многих мобильных устройствах, но не работает на других.Я не могу найти шаблон для идентификации этих устройств или причины проблемы.Я был бы очень признателен за любую помощь в этом

Технические характеристики:

  • Работает нормально на Samsung J7 neo (SM-J701M) с Android 8.1.0
  • Didsне работает на планшете Samsung Galaxy Tab A (SMT350) с Android 7.1.1

Это тестовый класс Java, который воспроизводит проблему:

public class Acquisition extends Thread {
    private boolean isRunning;
    private int bytesCounter;
    private boolean isOnError;
    Socket sk;

    public Acquisition () {
        isRunning = false;
        isOnError = false;
    }

    public static void Log (String msg) {
        Log.d ("app", msg);
    }

    public void run () {
        isRunning = true;
        byte buffer[] = new byte[100000];
        bytesCounter = 0;

        try {
            sk = new Socket ("192.168.1.1", 2000);
            InputStream input = sk.getInputStream ();

            // This is the stop an start command I send to the device to start acquiring
            sk.getOutputStream().write ("PF|0000|".getBytes());
            sk.getOutputStream().write ("PA|0000|".getBytes());

            while (this.isRunning) {
                this.sleep(500);
                int ret = input.read (buffer, 0, 100000);

                if (ret > 0) {
                    Log ("Reading:" + ret + " bytes");
                    bytesCounter += ret;

                } else {
                    Log ("Error. Cod: " + ret);
                    isRunning = false;
                }
            }

        } catch (Exception ex) {
            Log ("Acquisition error: " + ex.getMessage());
        }
    }

    public void Stop () {
        try {
            isRunning = false;
            wait(1000);

        } catch (Exception ex) {
            Log ("Error stopping thread: " + ex.getMessage());
        }
    }

    public int GetBytesCounter () {
        return this.bytesCounter;
    }
}

Обновление

Я провел два теста, чтобы увидеть, что происходит с общением.

Это результат перехвата сети:

Graphic of sequence vs time during acquisition

Здесь видно, что трафик пакетов TCP прерывается междусекунды 12 и 13,9.Это происходит более одного раза в процессе сбора данных и вызывает прерывание связи.На втором изображении видно, что происходит в тот момент, когда трафик пакетов останавливается

TCP packets captured

Второй тест состоял в отправке ICMP-пакетов (с использованием ping) с разных устройств Android на модуль сбора.Мы видели, что только устройства, имеющие проблемы в первом тесте, теряют пакеты в тесте ping, среднее число потерянных пакетов было близко к 20%.Это может объяснить повторные передачи TCP, которые мы видим в wireshark.

Заключение

Я написал этот пост, думая, что может быть проблема с Android (или некоторыми версиями Android), но кажется, что оборудование Wifi настолько разнообразно в мобильных устройствах, что невозможно иметь минимальную скорость транзакций, общую для всех устройств.

...