如何计算通过WiFi / LAN发送和接收的字节数?

时间:2012-10-11 10:48:33

标签: android network-traffic

有没有办法统计Android中通过WiFi / LAN消耗和传输的数据?我可以通过TrafficStats方法getMobileTxBytes()getMobileRxBytes()查看移动互联网(3G,4G)的统计信息,但是WiFi怎么样?

2 个答案:

答案 0 :(得分:1)

更新:下面的原始答案很可能是错误。我为WiFi / LAN获得的数字太高了。仍然没有想到为什么(似乎无法通过WiFi / LAN测量流量),但一个老问题提供了一些见解:How to get the correct number of bytes sent and received in 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()。我们实际上有两个文件路径 - 一个用于发送的字节,一个用于接收的字节。此方法只是封装读取提供给它的文件路径,并将计数作为long返回。

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

<击>

答案 1 :(得分:1)

(这实际上是对你的答案的评论,没有足够的分数来真正评论,但......) TrafficStats.UNSUPPORTED并不一定意味着设备不支持读取WiFi流量统计信息。在我的三星Galaxy S2的情况下,当WiFi被禁用时,包含统计数据的文件不存在,但是当启用WiFi时它可以工作。