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

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

На телефоне с включенной горячей точкой я использую этот код для вычисления использования данных горячей точкой (результат отображается в 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 Ответ

0 голосов
/ 19 ноября 2018

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...