如何在Android Wi-Fi连接中测量上传/下载速度和延迟

10

我需要一些 API 或可操作的代码,以便我可以从安卓应用程序中测量 WiFi 连接的上传/下载速度和延迟时间。


我该如何获取抖动和跟踪路由? - Mehul Tank
2个回答

19

你是否在使用2.2(Froyo)或更高版本?

如果是的话,在你的应用程序中导入Traffic Stats,并在应用程序使用互联网时添加以下内容。

下载/上传:

long BeforeTime = System.currentTimeMillis();
long TotalTxBeforeTest = TrafficStats.getTotalTxBytes();
long TotalRxBeforeTest = TrafficStats.getTotalRxBytes();

/* DO WHATEVER NETWORK STUFF YOU NEED TO DO */

long TotalTxAfterTest = TrafficStats.getTotalTxBytes();
long TotalRxAfterTest = TrafficStats.getTotalRxBytes();
long AfterTime = System.currentTimeMillis();

double TimeDifference = AfterTime - BeforeTime;

double rxDiff = TotalRxAfterTest - TotalRxBeforeTest;
double txDiff = TotalTxAfterTest - TotalTxBeforeTest;

if((rxDiff != 0) && (txDiff != 0)) {
    double rxBPS = (rxDiff / (TimeDifference/1000)); // total rx bytes per second.
    double txBPS = (txDiff / (TimeDifference/1000)); // total tx bytes per second.
    testing[0] = String.valueOf(rxBPS) + "B/s. Total rx = " + rxDiff;
    testing[1] = String.valueOf(txBPS) + "B/s. Total tx = " + txDiff;
}
else {
    testing[0] = "No uploaded or downloaded bytes.";
}

现在你有了testing[0]作为下载速度(大致),而testing[1]则是上传速度(大致)。

确保只在实际进行网络通信时调用此代码,否则时间会导致结果偏差。

至于延迟方面,目前没有什么很好的方法。我写了下面这段代码,尚未经过测试,但应该可以正常运行,不过可能还有更好的解决方案。

延迟

String host = YOUR_HOST
HttpGet request = new HttpGet(host);
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);
HttpClient httpClient = new DefaultHttpClient(httpParameters);

for(int i=0; i<5; i++) {
    long BeforeTime = System.currentTimeMillis();
    HttpResponse response = httpClient.execute(request);
    long AfterTime = System.currentTimeMillis();
    Long TimeDifference = AfterTime - BeforeTime;
    time[i] = TimeDifference 
}

请注意,这并不会告诉您使用时的延迟,但会为您提供在特定时间段内使用的网络所经历的延迟的概念。此外,这是请求和响应时间,而不是像“ping”通常做的那样到达网络时间。


你能否逐步清晰地解释或阐述如何在应用程序中实现它?谢谢。 - Shailendra Madda
这将高度取决于您希望应用程序执行的任务。大多数情况下,您应该能够完全复制并粘贴代码。显然,在显示延迟的“YOUR_HOST”处,您需要将其指向已知服务器。如果您没有服务器,您可能只能使用Google。对于下载/上传,您需要实际从已知服务器下载或上传文件。 - Dave
网络速度只是在一段时间内发送的字节数量的问题。因此,在开始下载之前,请检查流量统计中的字节计数器,并记录当前时间。然后下载/上传文件,再次记录字节计数器和当前时间。字节计数器之间的差异告诉您有多少字节通过无线电传输,而时间上的差异则告诉您下载/上传这么多字节需要多长时间。 - Dave
如果下载了1000字节并花费了1秒钟的时间,那么下载速度就是每秒1000字节。 - Dave
如果您想在下载/上传过程中了解速度,您需要将逻辑添加到您的下载/上传代码中,以向需要它的任何逻辑报告当前速度。 - Dave
显示剩余2条评论

1
有两种主要的方法来计算下载/上传速度。
被动测试 - 这是已经建议使用TrafficStats API的方法。这种方法将给出更接近实际用户体验的速度。然而,它不会提供容量测量 - 即连接的预期容量是多少。例如,对于固定网络ISP通常基于速度销售套餐 - 例如100 Mbit套餐、1 Gbit套餐。如果您想查看该ISP是否提供了速度,被动方法不是适当的方式!由于用户并非始终使用全部容量,因此速度将会低得多。此外,请记住,使用TrafficStats的被动方法无法进行延迟测试。
主动测试 - 这种方法需要从远程服务器下载和上传数据以获取下载/上传速度和延迟。对于这种类型的测试,有许多采样方法,没有一种“真正”的速度。您可以查看以下标准,以了解推荐的方法是什么:

https://itu.int/en/ITU-T/C-I/Pages/IM/Internet-speed.aspx

https://itu.int/itu-t/recommendations/rec.aspx?rec=q.3960

https://itu.int/ITU-T/recommendations/rec.aspx?rec=14125

https://tools.ietf.org/pdf/rfc6349.pdf

您还可以使用我们的Android SDK,它可以满足您的需求,并符合ITU标准:

https://github.com/speedchecker/speedchecker-sdk-android

其次,您没有明确表示您是想要“wifi速度”还是“互联网速度”。Wifi速度是本地网络速度,与“互联网速度”不同。虽然有许多测试“互联网速度”的方法,但测试“wifi速度”要困难得多,因为通常很难在本地网络中获取远程服务器。再次提到,我们上面提到的Android SDK也可以测量wifi速度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接