Android: разница между использованием данных на телефоне с горячей точкой и на телефоне с его использованием

Я пытаюсь сравнить разницу в использовании данных между телефоном, используя точку доступа другого телефона и точку доступа телефона.

На телефоне, в котором включена его горячая точка, я использую этот код для вычисления использования данных горячей точкой (результат отображается в TextView (TextView) findViewById(R.id.data_seller)). Я назвал этот телефон сервером телефона:

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

Что касается телефона, использующего точку доступа для подключения к Интернету, я вычисляю общее использование данных Wifi. Я назвал этот телефон клиентским телефоном

private void getNetworkStatsClient() {
    mStartTXClient = TrafficStats.getTotalTxBytes();
    mStartRXClient = TrafficStats.getTotalRxBytes();

    mHandler.postDelayed(mRunnableClient, 1000);
}

mRunnableClient = new Runnable() {
        public void run() {
            long[] res = new long[2];
            res[0] = TrafficStats.getTotalTxBytes() - mStartTXClient;
            res[1] = TrafficStats.getTotalRxBytes() - mStartRXClient;

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

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

Я думал, что результат обоих будет более или менее одинаковым (точнее, res[0]+res[1] в обоих выполняемых было бы более или менее равным), потому что клиентский телефон использует телефон точки доступа сервера. Однако результаты совершенно разные (использование данных клиентским телефоном в 50 раз больше, чем серверным телефоном). У тебя есть идея почему?

1 ответ

Позвольте мне попытаться перефразировать.

Настройка: у вас есть точка доступа и несколько пользователей. Это обычная привязь.

Цель: вы хотите измерить использование данных / пропускной способности. То есть, сколько данных высосали пользователи.

Эксперимент: вы пытаетесь измерить это использование на стороне AP, а также на стороне пользователя.

Наблюдение: вы удивлены, увидев, что то, что вы измеряете на стороне AP, отличается от того, что вы измеряете на стороне пользователей.

Потенциальная стратегия расследования:

Я вижу, у вас есть, и если-еще в зависимости от версии SDK. Скажем, что при эксперименте ваша точка доступа всегда одно и то же устройство, а пользователь всегда другое устройство, тогда каждая сторона может использовать разные API.

Вы пытались запустить свой код на двух устройствах, которые имеют одинаковый SDK, и, следовательно, будут использовать один и тот же API? Это не ответ, но он может быть информативным.

Другие вопросы по тегам