Получите текущую скорость интернета (мобильный и Wi-Fi) с помощью Android

У меня есть приложение, которое должно работать в автономном и онлайн-режиме. Приложение должно делать запросы к серверу приложений на основе скорости интернет-соединения текущего сетевого подключения (Wifi или Data).

Если Wi-Fi подключен, я могу получить уровень сигнала Wi-Fi текущего соединения, используя этот код.

WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), 5);

ИЛИ ЖЕ

wifiInfo.getLinkSpeed();

Если мобильный интернет подключен, я смог получить силу голоса с помощью класса слушателя

@Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        int obj  = signalStrength.getGsmSignalStrength();
        int dBm = (2 * obj) -113;
 }

Приведенные выше коды получают уровень сигнала, а не скорость. Итак, как мне узнать текущую скорость подключенной сети?

Обычно приложения для проверки скорости, обнаруженные в магазинах или на веб-сайтах, проверяют скорость, отправляя или загружая определенный файл или проверяя связь с удаленным сервером, а затем вычисляя скорость, используя истекшее время.

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

Итак, есть ли альтернативный способ проверить скорость текущего интернет-соединения, который можно сделать в режиме реального времени?

Любые выводы могут быть полезны.

PS: эта ссылка имеет код для проверки типа подключения текущей сети. Но есть случаи, когда у меня есть сигнал LTE с полной силой, но нет/очень медленное интернет-соединение. Так что это тоже не будет точным решением для меня.

https://gist.github.com/emil2k/5130324

Ответ 1

Вы не можете получить скорость загрузки/выгрузки без проверки связи с любым сервером. Поскольку ваш сервер не поддерживает пинг, вы можете использовать сторонний сайт для пинга.

С библиотекой JSpeedTest вы можете сделать это легко. Некоторые из ваших желаемых функций доступны в этой библиотеке. Такие как

  • тест скорости загрузки
  • загрузка теста скорости
  • мониторинг прогресса загрузки/выгрузки
  • настраиваемое имя хоста/порт/uri (имя пользователя и пароль для FTP)
  • настраиваемое время ожидания сокета и размер куска
  • настроить хранилище загружаемых файлов

Gradle:

compile 'fr.bmartel:jspeedtest:1.32.1'

Пример кода:

SpeedTestSocket speedTestSocket = new SpeedTestSocket();

// add a listener to wait for speedtest completion and progress
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

    @Override
    public void onCompletion(SpeedTestReport report) {
        // called when download/upload is complete
        System.out.println("[COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
        System.out.println("[COMPLETED] rate in bit/s   : " + report.getTransferRateBit());
    }

    @Override
    public void onError(SpeedTestError speedTestError, String errorMessage) {
         // called when a download/upload error occur
    }

    @Override
    public void onProgress(float percent, SpeedTestReport report) {
        // called to notify download/upload progress
        System.out.println("[PROGRESS] progress : " + percent + "%");
        System.out.println("[PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
        System.out.println("[PROGRESS] rate in bit/s   : " + report.getTransferRateBit());
    }
});