【发布时间】:2014-10-14 21:24:41
【问题描述】:
我需要一些 api 或操作代码,通过它我可以测量来自 android 应用程序的上传/下载速度和 wifi 连接的延迟。
【问题讨论】:
-
如何获得抖动和跟踪路由?
标签: android
我需要一些 api 或操作代码,通过它我可以测量来自 android 应用程序的上传/下载速度和 wifi 连接的延迟。
【问题讨论】:
标签: android
计算下载/上传速度的主要方法有两种。
被动测试 - 这是已经使用 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 速度
【讨论】:
您使用的是 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”通常所说的那样,请求到达网络时间。
【讨论】: