【问题标题】:how to measure upload/download speed and latency in android wifi connection如何测量android wifi连接中的上传/下载速度和延迟
【发布时间】:2014-10-14 21:24:41
【问题描述】:

我需要一些 api 或操作代码,通过它我可以测量来自 android 应用程序的上传/下载速度和 wifi 连接的延迟。

【问题讨论】:

  • 如何获得抖动和跟踪路由?

标签: android


【解决方案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 速度

【讨论】:

    【解决方案2】:

    您使用的是 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”通常所说的那样,请求到达网络时间。

    【讨论】:

    • 您能否一步一步解释清楚或详细说明如何在应用程序中实现它?谢谢
    • 这在很大程度上取决于您希望您的应用程序做什么。在大多数情况下,您应该能够完全按原样复制和粘贴代码。显然,它在哪里显示“YOUR_HOST”的延迟,你需要将它指向一个已知的服务器。如果您没有服务器,您可能只使用 Google。对于下载/上传,您实际上需要从已知服务器下载或上传文件。
    • 但是上传或下载时如何知道网速呢?
    • 网络速度只是一段时间内发送的字节数的问题。因此,在开始下载之前检查流量统计中的字节计数器,并记录当前时间。然后下载/上传文件,然后再次记录字节计数器和当前时间。下载/上传前后字节计数器之间的差异让您知道通过无线电传输了多少字节,时间的差异让您知道下载/上传这么多字节需要多长时间。
    • IE:如果是 1000 字节的下载,你用了 1 秒,下载速度是每秒 1000 字节。
    猜你喜欢
    • 2012-12-16
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多