有人能指出我的任何示例代码,解释(甚至稍微)如何为Android编写一个简单的wifi speedtest程序?我到处都看了!
提前致谢!
- 迈克尔
答案 0 :(得分:1)
这并不容易。让我给你一些建议,但你需要进一步调查。
我不确定是否可以访问WiFi连接或3G连接的低级指标。假设它不可能,我的建议是针对某个服务器使用ping或类似ping的解决方案,并获得往返时间(RTT)。
现在,当您连接到服务器时,影响RTT的因素很多,主要是:
通常你执行ping来测试可达性和RTT的味道。 Ping通过ICMP Echo Request实现。但是,Java不提供发送ICMP消息的方法。因此,您可能尝试与某个服务器建立TCP连接。
您可以使用InetAddress :: isReachable多次超时,直到找到限制超时。我不推荐这个。
http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#isReachable(int)
我会创建一个TCP套接字并调用connect,然后确定自调用connect以来所花费的时间。当然,你必须处理影响速度的所有因素。
要考虑的另一点是,如果在TCP套接字中使用connect,则必须了解实际上存在三次握手:客户端发送SYNC,服务器发送SYN / ACK,客户端发送ACK。但是这最后的ACK并没有为连接的返回增加大量时间,因为它只是由客户端发送的。
话虽如此,我还是会提出一些建议:
我首先尝试使用WiFi,尝试建立到接入点的连接,端口80,8080或443.这将消除其他三个因素。
如果它不起作用,您可以尝试修复服务器,例如www.google.com。在这种情况下,您将不得不处理所有上述因素。
在3G的情况下,我不知道如何建立与接入点的连接,如UMTS中的网关GPRS支持节点。但考虑到上述所有4个因素,您可以连接到修复服务器。
其他一点需要考虑的是,当智能手机连接到WiFi和Cellular时,它总是使用WiFi。有一些方法可以强制它使用3g,但有些链接: Android: Force data to be sent over radio vs WiFi Force Android to use 3G when on local area wifi without net access
我希望这会有所帮助。