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? Это не ответ, но он может быть информативным.