Android:热点电话和使用热点电话的数据使用之间的差异

时间:2018-11-17 14:40:10

标签: android networkstatsmanager android-trafficstats

我正在尝试比较使用其他电话的热点的电话与该电话的热点之间的数据使用差异。

在打开了热点的电话上,我正在使用此代码来计算热点的数据使用情况(结果显示在TextView(TextView)findViewById(R.id.data_seller)上)。我将此电话命名为服务器电话:

map

关于使用热点连接到Internet的电话,我计算了Wifi的总数据使用量。我将此电话命名为客户端电话

private void getNetworkStatsServer() {
    NetworkStatsManager networkStatsManager;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        networkStatsManager = getApplicationContext().getSystemService(NetworkStatsManager.class);
        NetworkStats networkStatsWifi = null;
        NetworkStats networkStatsMobile = null;
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, 1);
            if (networkStatsManager != null) {
                networkStatsWifi = networkStatsManager.queryDetailsForUid(ConnectivityManager.TYPE_WIFI,
                        "", 0, calendar.getTimeInMillis(), UID_TETHERING);
                String suscribeId = "";
                TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
                if (tm != null) {
                        suscribeId = tm.getSubscriberId();
                }
                networkStatsMobile = networkStatsManager.queryDetailsForUid(ConnectivityManager.TYPE_MOBILE,
                        suscribeId, 0, calendar.getTimeInMillis(), UID_TETHERING);
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        NetworkStats.Bucket bucket;

        if (networkStatsWifi != null) {
            while (networkStatsWifi.hasNextBucket()) {
                bucket = new NetworkStats.Bucket();
                networkStatsWifi.getNextBucket(bucket);
                mStartTXServer += bucket.getTxBytes();
                mStartRXServer += bucket.getRxBytes();
            }
        }

        if (networkStatsMobile != null) {
            while (networkStatsMobile.hasNextBucket()) {
                bucket = new NetworkStats.Bucket();
                networkStatsMobile.getNextBucket(bucket);
                mStartTXServer += bucket.getTxBytes();
                mStartRXServer += bucket.getRxBytes();
            }
        }
    }
    mHandler.postDelayed(mRunnableServer, 1000);
}

mRunnableServer = new Runnable() {
        public void run() {
            long[] res = new long[2];
            NetworkStatsManager networkStatsManager;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                networkStatsManager = getApplicationContext().getSystemService(NetworkStatsManager.class);
                NetworkStats networkStatsWifi = null;
                NetworkStats networkStatsMobile = null;
                try {
                    Calendar calendar = Calendar.getInstance();
                    calendar.add(Calendar.DATE, 1);
                    if (networkStatsManager != null) {
                        networkStatsWifi = networkStatsManager.queryDetailsForUid(ConnectivityManager.TYPE_WIFI,
                                "", 0, calendar.getTimeInMillis(), UID_TETHERING);
                        networkStatsMobile = networkStatsManager.queryDetailsForUid(ConnectivityManager.TYPE_MOBILE,
                                "", 0, calendar.getTimeInMillis(), UID_TETHERING);
                    }
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                NetworkStats.Bucket bucket;

                if (networkStatsWifi != null) {
                    while (networkStatsWifi.hasNextBucket()) {
                        bucket = new NetworkStats.Bucket();
                        networkStatsWifi.getNextBucket(bucket);
                        res[0] += bucket.getTxBytes();
                        res[1] += bucket.getRxBytes();
                    }
                }
                if (networkStatsMobile != null) {
                    while (networkStatsMobile.hasNextBucket()) {
                        bucket = new NetworkStats.Bucket();
                        networkStatsMobile.getNextBucket(bucket);
                        res[0] += bucket.getTxBytes();
                        res[1] += bucket.getRxBytes();
                    }
                }
                if (networkStatsMobile != null || networkStatsWifi != null) {
                    res[0] -= mStartTXServer;
                    res[1] -= mStartRXServer;
                }
            } else {
                res[0] = TrafficStats.getUidTxBytes(UID_TETHERING) - mStartTXServer;
                res[1] = TrafficStats.getUidRxBytes(UID_TETHERING) - mStartRXServer;
            }

            System.out.println("Value of Rx: " + res[0]);
            System.out.println("Value of Tx: " + res[1]);

                ((TextView) findViewById(R.id.data_seller)).setText(String.valueOf(((double) (res[0] + res[1])) / 1048576) + "MB");
                mHandler.postDelayed(mRunnableServer, 10000);
        }
    };

我认为两者的结果或多或少都是相同的(更确切地说,两个可运行状态中的res [0] + res [1]或多或少都相等),因为客户端电话正在使用服务器热点电话。但是,结果完全不同(客户端电话的数据使用量是服务器电话的50倍)。 你知道为什么吗?

1 个答案:

答案 0 :(得分:0)

让我尝试改写。

设置:您有一个AP和一些用户。那是常规的网络共享。

目标:您要测量数据/带宽使用情况。即,用户吸收了多少数据。

实验:您尝试在AP端和用户端衡量此使用情况。

观察:您惊讶地发现在AP端测量的结果与在User端测量的结果不同。

潜在的调查策略:

根据SDK版本,我看到了if和else。假设在进行实验时,您的AP始终是同一设备,而User始终是另一设备,则双方使用的API可能会不同。

您是否尝试过在具有相同SDK的两个设备上运行代码,因此将使用相同的API?这不是答案,但可能会提供参考。