Как подсчитать количество байтов, отправленных и полученных через WiFi/LAN?

Есть ли способ подсчитать данные, потребляемые и передаваемые через WiFi/LAN в Android? Я могу проверить статистику по мобильному интернету (3G, 4G) TrafficStats методами getMobileTxBytes() и getMobileRxBytes(), а как насчет WiFi?


person MLQ    schedule 11.10.2012    source источник
comment
Видели этот stackoverflow.com/q/8478696/1321873?   -  person Rajesh    schedule 11.10.2012


Ответы (2)


(На самом деле это комментарий к вашему ответу, пока недостаточно баллов, чтобы комментировать, но...) TrafficStats.UNSUPPORTED не обязательно означает, что устройство не поддерживает считывание статистики трафика WiFi. В случае моего Samsung Galaxy S2 файл, содержащий статистику, не существует, когда WiFi отключен, но работает, когда WiFi включен.

person Torben Kohlmeier    schedule 24.02.2013

ОБНОВЛЕНИЕ: исходный ответ ниже, скорее всего, НЕВЕРНЫЙ. Цифры, которые я получаю для WiFi/LAN, слишком высоки. До сих пор не понял, почему (кажется, измерение трафика через WiFi/LAN невозможно), но старый вопрос дает некоторое представление: Как получить правильное количество отправленных и полученных байтов в TrafficStats?


Нашел свой собственный ответ.

Во-первых, определите метод с именем getNetworkInterface(). Я точно не знаю, что такое «сетевой интерфейс», но нам нужен токен String, который он возвращает, чтобы построить путь к файлу, содержащему количество байтов.

private String getNetworkInterface() {
    String wifiInterface = null;
    try {
        Class<?> system = Class.forName("android.os.SystemProperties");
        Method getter = system.getMethod("get", String.class);
        wifiInterface = (String) getter.invoke(null, "wifi.interface");
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (wifiInterface == null || wifiInterface.length() == 0) {
        wifiInterface = "eth0";
    }
    return wifiInterface;
}

Затем определите readLongFromFile(). На самом деле у нас будет два пути к файлам: один для отправленных байтов, а другой для полученных байтов. Этот метод просто инкапсулирует чтение предоставленного ему пути к файлу и возвращает количество в виде длинного числа.

private long readLongFromFile(String filename) {
    RandomAccessFile f = null;
    try {
        f = new RandomAccessFile(filename, "r");
        String contents = f.readLine();
        if (contents != null && contents.length() > 0) {
            return Long.parseLong(contents);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (f != null) try { f.close(); } catch (Exception e) { e.printStackTrace(); }
    }
    return TrafficStats.UNSUPPORTED;
}

Наконец, создайте методы, которые возвращают количество байтов, отправленных и полученных через WiFi/LAN.

private long getNetworkTxBytes() {
    String txFile = "sys/class/net/" + this.getNetworkInterface() + "/statistics/tx_bytes";
    return readLongFromFile(txFile);
}

private long getNetworkRxBytes() {
    String rxFile = "sys/class/net/" + this.getNetworkInterface() + "/statistics/rx_bytes";
    return readLongFromFile(rxFile);
}

Теперь мы можем проверить наши методы, выполнив что-то вроде нашего примера для мобильного интернета выше.

long received = this.getNetworkRxBytes();
long sent = this.getNetworkTxBytes();

if (received == TrafficStats.UNSUPPORTED) {
    Log.d("test", "TrafficStats is not supported in this device.");
} else {
    Log.d("test", "bytes received via WiFi/LAN: " + received);
    Log.d("test", "bytes sent via WiFi/LAN: " + sent);
}

person MLQ    schedule 28.11.2012
comment
Если вы используете прокси на своем телефоне (например, shadowsocks), во время его работы он рассматривается как отдельный сетевой интерфейс вместе с Wi-Fi и мобильным интерфейсом и странно увеличивает реальную сумму, в моем тесте эта разница была огромной ! - person Akram; 12.12.2017