2012-12-04 32 views
3

我正在寻找从WiFi网络读取数据包丢失计数器的方法。从哪里可以从Android设备读取WiFi数据包丢失计数器?

它应该是在亚行外壳的JavaC(NDK)或用自己的方式

Android是不会生根。

我有一个接入点,我配置丢包率为2%Dummynet服务。

我使用wget命令从PC并从本地服务器下载50 Mb文件(LAN的带宽应该是100Mb)。我看到,在丢包配置带宽从100Mb减少到3Mb之后,这意味着所有工作都正常。

到目前为止好,

我的设备(Android设备)被连接到上面提到的由AP无线网络。

我尝试下载相同的50 MB文件,下载率是3M,但我没有看到任何错误或重传计数器上升。

我用adb shell CLI并进入到:sys/class/net/eth0/statistics,我看到:

-r--r--r-- root  root   4096 2012-12-04 15:42 rx_packets 
-r--r--r-- root  root   4096 2012-12-04 15:42 tx_packets 
-r--r--r-- root  root   4096 2012-12-04 15:41 rx_bytes 
-r--r--r-- root  root   4096 2012-12-04 15:41 tx_bytes 
-r--r--r-- root  root   4096 2012-12-04 15:43 rx_errors 
-r--r--r-- root  root   4096 2012-12-04 15:43 tx_errors 
-r--r--r-- root  root   4096 2012-12-04 15:43 rx_dropped 
-r--r--r-- root  root   4096 2012-12-04 15:43 tx_dropped 
-r--r--r-- root  root   4096 2012-12-04 15:43 multicast 
-r--r--r-- root  root   4096 2012-12-04 15:43 collisions 
-r--r--r-- root  root   4096 2012-12-04 15:43 rx_length_errors 
-r--r--r-- root  root   4096 2012-12-04 15:43 rx_over_errors 
-r--r--r-- root  root   4096 2012-12-04 15:43 rx_crc_errors 
-r--r--r-- root  root   4096 2012-12-04 15:38 rx_frame_errors 
-r--r--r-- root  root   4096 2012-12-04 15:38 rx_fifo_errors 
-r--r--r-- root  root   4096 2012-12-04 15:38 rx_missed_errors 
-r--r--r-- root  root   4096 2012-12-04 15:38 tx_aborted_errors 
-r--r--r-- root  root   4096 2012-12-04 15:38 tx_carrier_errors 
-r--r--r-- root  root   4096 2012-12-04 15:38 tx_fifo_errors 
-r--r--r-- root  root   4096 2012-12-04 15:38 tx_heartbeat_errors 
-r--r--r-- root  root   4096 2012-12-04 15:38 tx_window_errors 
-r--r--r-- root  root   4096 2012-12-04 15:38 rx_compressed 
-r--r--r-- root  root   4096 2012-12-04 15:38 tx_compressed 

所以我跑cat *并获得上述所有文件与0值除4:

tx/rx_packets/bytes是活动的,它的平均我使用写入接口:

cat rx_packets 
9106 

如果有任何其他方式来检测丢包或得到它programm atically会不胜感激

+0

你有没有比较过普通Linux客户端上的这些计数器会遭受同样的测试? –

+0

我在Linux上使用'netstat -s | grep retransmited'但Android上的netstat显示没有意思。由于PL(数据包丢失),我的下载速度降至3M。我使用NDK(C代码)。顺便说一句,我只激活了TCP的TCP。 –

+0

但是,在普通的linux上,你可以看到相当于/ sys/class/net的统计信息吗?另外,你确定你正在使用的界面? –

回答

2

除非我误解你的要求。如果您连接到与移动设备相同的网络,则可以使用wireshark。

或者你可以做一个tcpdump,然后通过wireshark分析它,以获得数据包丢失。

这里有一些链接可能会帮助你。

http://dennismillerdev.wordpress.com/2011/02/03/debug-network-activity-in-android-using-wireshark/ http://mobile.tutsplus.com/tutorials/android/analyzing-android-network-traffic/ Capturing mobile phone traffic on wireshark

如果你只是试图做一个通用的连通性测试。您可以尝试简单地向服务器发送一系列UDP数据包,以回应相同的数据包。有一个单独的线程同时运行,试图从服务器接收这些数据包。如果您想要进行其他测量,请记录时间戳,但如果返回的数据包少于发送的数据包,则知道有多少数据包丢失。如果您给数据包一个包含一个ID的1字节有效载荷。 (即:发送20个ID为1-20的数据包),然后当您从服务器收到数据包时,您可以检查有效负载并查看哪些数据包丢失和/或无序。

除此之外,你是有限的,没有根植你的手机。您可以使用TrafficStats获取发送的数据包数量getTotalRxPackets()getTotalTxPackets()以获取发送/接收的总数据包。或者,如果您使用更高级别的API,则甚至可以获得每个应用程序的UDP数据包数量。所以你可以找到发送的数据包数量,并收到但不会丢失。

如果您知道设备发送的数据包数量,并且在服务器端检测到来自该设备的数据包数量,则差异应该可以帮助您了解丢失数据包的数量。 (这种方法需要你控制服务器并涉及更多的设备 - 服务器通信)

希望这会有所帮助。

+0

感谢您的回复。我通过NDK(C代码)使用'TrafficStats',因为我比Java实现更快。我知道100%,接入点的数据包丢失率为2%。其目的是从Android读取丢包计数器,而不进行任何活动,如发送UDP与有效载荷..... –

1

我认为,你需要的计数器在/ proc/net/netstat文件中。

+3

除非您确定这一点,否则这应该是一个评论,而不是一个答案。 – IronMan84

+0

我会尽力谢谢 –