如何测量两个 android 设备之间的传输时间?
How can I measure the transmission time between two android devices?
我想监控 Wifi-Direct 网络(带宽、延迟等)。如何测量通过网络(wifi direct)接收 X 字节所需的时间。我的意思是 TX + 通过网络 + RX 时间。
在DMMS (android Studio)中,我找到了网络统计选项,但这里只显示传输和接收时间(而且不是很准确,因为它出现在图表上)。
我曾考虑过使用 System.currentTimeMillis() 但我还没有找到如何同步两个设备的时钟。
发送:
socket.bind(null);
socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT);
int tamMensaje= 1024*1024; // 1 MB
byte[] bitAleatorio = new byte [tamMensaje]; // 1 byte [-128 a 127
for (int x=0;x<bitAleatorio.length;x++){
bitAleatorio[x] =(byte) Math.round(Math.random());
}
DataOutputStream DOS = new DataOutputStream(socket.getOutputStream());
for(int i=0;i<1024;i++){
DOS.write(bitAleatorio,(i*1024),1024);
}
接收:
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
Socket client = serverSocket.accept();
DataInputStream DIS = new DataInputStream(client.getInputStream());
int tamMensaje= 1024*1024;
byte[] msg_received2= new byte [tamMensaje];
for(int i=0;i<1024;i++){
DIS.read(msg_received2,(i*1024),1024);
}
client.close();
serverSocket.close();
谢谢
有两种方法可以相当准确地解决问题:
- 在两个设备上同步时间。
您可以为此使用 NTP 并安装 separate app like this one or implement it in your code using a library like this one。
之后您可以依靠 System.currentTimeMillis()
来比较消息在两个设备上的 sent/receive 时间。
- 使用相对时间或单个设备时间。
您可以使用 udp 数据报(它们比 tcp 更快)实现类似 icmp
echo 的功能。算法应该如下(假设我们有设备 A 和 B):
- A 向 B 发送一些数据包并保存
timeSent
某处;
- B收到数据包,立即发送
ACK
数据包给A;
- A收到
ACK
并保存timeRecv
;
- 最后,
Long latency = (timeSent - timeRecv)/2;
。
这适用于小负载,例如 icmp
echo。测量大型网络传输时间可以通过为 start/end 和接收它发送单独的 ACK
响应来完成。
我想监控 Wifi-Direct 网络(带宽、延迟等)。如何测量通过网络(wifi direct)接收 X 字节所需的时间。我的意思是 TX + 通过网络 + RX 时间。
在DMMS (android Studio)中,我找到了网络统计选项,但这里只显示传输和接收时间(而且不是很准确,因为它出现在图表上)。
我曾考虑过使用 System.currentTimeMillis() 但我还没有找到如何同步两个设备的时钟。
发送:
socket.bind(null);
socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT);
int tamMensaje= 1024*1024; // 1 MB
byte[] bitAleatorio = new byte [tamMensaje]; // 1 byte [-128 a 127
for (int x=0;x<bitAleatorio.length;x++){
bitAleatorio[x] =(byte) Math.round(Math.random());
}
DataOutputStream DOS = new DataOutputStream(socket.getOutputStream());
for(int i=0;i<1024;i++){
DOS.write(bitAleatorio,(i*1024),1024);
}
接收:
ServerSocket serverSocket = new ServerSocket(SERVERPORT);
Socket client = serverSocket.accept();
DataInputStream DIS = new DataInputStream(client.getInputStream());
int tamMensaje= 1024*1024;
byte[] msg_received2= new byte [tamMensaje];
for(int i=0;i<1024;i++){
DIS.read(msg_received2,(i*1024),1024);
}
client.close();
serverSocket.close();
谢谢
有两种方法可以相当准确地解决问题:
- 在两个设备上同步时间。
您可以为此使用 NTP 并安装 separate app like this one or implement it in your code using a library like this one。
之后您可以依靠 System.currentTimeMillis()
来比较消息在两个设备上的 sent/receive 时间。
- 使用相对时间或单个设备时间。
您可以使用 udp 数据报(它们比 tcp 更快)实现类似 icmp
echo 的功能。算法应该如下(假设我们有设备 A 和 B):
- A 向 B 发送一些数据包并保存
timeSent
某处; - B收到数据包,立即发送
ACK
数据包给A; - A收到
ACK
并保存timeRecv
; - 最后,
Long latency = (timeSent - timeRecv)/2;
。
这适用于小负载,例如 icmp
echo。测量大型网络传输时间可以通过为 start/end 和接收它发送单独的 ACK
响应来完成。