Search code examples
androidmobilenetwork-programmingwifi

Simple speed test app on Android suggestions


Can anyone point me to any sample code which explains (even slightly) how to write a simple wifi speedtest program for Android? I have looked everywhere!

Thanks in advance!

-Michael


Solution

  • It's not easy. Let me give you some suggestions but you will need to investigate more.

    I'm not sure whether it is possible to access low level metrics of the WiFi connection or a 3G connection. Supposing it's not possible, my suggestions are oriented to use a ping or a ping-similar solution with some server and obtain the round-trip time (RTT).

    Now, when you connect to a server, there are many factors affecting the RTT, these are the main ones:

    • WiFi speed, congestion, and communication errors
    • Latency in the whole path to the server, including ISP capacity and backbones.
    • Congestion in the path
    • Server speed to respond

    Usually you execute a ping to test reachability and a taste of RTT. Ping is implemented with ICMP Echo Request. However, Java does not provide the means to send an ICMP message. So you might try to establish a TCP connection to some server.

    You could use InetAddress::isReachable with a timeout various times until you find out the limit timeout. I wouldn't recommend this.

    http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#isReachable(int)

    I would create a TCP socket and call connect and then determine the time it took since connect was called. Of course you have to deal with all factors that affect speed.

    Another point to consider is that if you use connect in a TCP socket, you have to understand that there is actually a three-way handshake: client sends a SYNC, server sends SYN/ACK, client sends ACK. But this last ACK doesn't add significant time to the return of connect because it's just sent by the client.

    Having said that, I'll go with some suggestions:

    First thing I would try, only with a WiFi, is trying to establish a connection to the access point, to port 80, 8080 or 443. That would eliminate other the last three factors.

    If it doesn't work you could try a fix server, www.google.com for example. In this case you will have to deal with all the mentioned factors.

    In the case of 3G, I don't know how you could could establish a connection to the access point like a Gateway GPRS Support Node in UMTS. But you can connect to a fix server, considering all 4 factors mentioned above.

    Other point to consider si that when the smartphone has connectivity to WiFi and Cellular, it always uses WiFi. There are ways to force it to use 3g though, some links: Android: Force data to be sent over radio vs WiFi Force Android to use 3G when on local area wifi without net access

    I hope this helps.