У меня есть приложение, которое должно получать данные с устройства, подключенного к сети 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;
}
}
Обновление
Я провел два теста, чтобы увидеть, что происходит с общением.
Это результат перехвата сети:
Здесь видно, что трафик пакетов TCP прерывается междусекунды 12 и 13,9.Это происходит более одного раза в процессе сбора данных и вызывает прерывание связи.На втором изображении видно, что происходит в тот момент, когда трафик пакетов останавливается
Второй тест состоял в отправке ICMP-пакетов (с использованием ping) с разных устройств Android на модуль сбора.Мы видели, что только устройства, имеющие проблемы в первом тесте, теряют пакеты в тесте ping, среднее число потерянных пакетов было близко к 20%.Это может объяснить повторные передачи TCP, которые мы видим в wireshark.
Заключение
Я написал этот пост, думая, что может быть проблема с Android (или некоторыми версиями Android), но кажется, что оборудование Wifi настолько разнообразно в мобильных устройствах, что невозможно иметь минимальную скорость транзакций, общую для всех устройств.