2011-09-16 8 views
13

Potrzebuję zrobić icmp ping do hosta z mojego urządzenia z Androidem. Muszę zmierzyć czas podróży w obie strony. Jestem biegły z Androidem i Javą, po prostu nie wiem, jakiej biblioteki użyć. Jak to zrobić? Czy to możliwe za pośrednictwem 3G, Edge?Jak uruchomić ICMP ping na Androidzie

+0

Dlaczego trzeba zmierzyć czas w obie ICMP? – dbasnett

Odpowiedz

5

Prawdopodobnie będziesz chciał użyć isReachable - więcej szczegółów w Android doc. Jednak najwyraźniej niektóre sieci blokują ICMP. Jest wpis, w którym możesz przeczytać więcej na ten temat here.

2

można skorzystać z otwartego kodu źródłowego emulatora terminala dostępne here

zbudować bibliotekę (używając cygwin i android-ndk) plik, a następnie użyć

14

Tak można pingować z 3G, krawędzi bezprzewodowej cokolwiek , o ile masz łączność. Jedynym ograniczeniem jest w emulatorze, zobacz tutaj: http://groups.google.com/group/android-developers/browse_thread/thread/8657506be6819297

Oto mój funkcji Ping:

package com.namespace.router.api; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import android.util.Log; 

public class Network { 

    private static final String TAG = "Network.java"; 

    public static String pingError = null; 

    /** 
    * Ping a host and return an int value of 0 or 1 or 2 0=success, 1=fail, 2=error 
    * 
    * Does not work in Android emulator and also delay by '1' second if host not pingable 
    * In the Android emulator only ping to 127.0.0.1 works 
    * 
    * @param String host in dotted IP address format 
    * @return 
    * @throws IOException 
    * @throws InterruptedException 
    */ 
    public static int pingHost(String host) throws IOException, InterruptedException { 
     Runtime runtime = Runtime.getRuntime(); 
     Process proc = runtime.exec("ping -c 1 " + host); 
     proc.waitFor();  
     int exit = proc.exitValue(); 
     return exit; 
    } 

    public static String ping(String host) throws IOException, InterruptedException { 
     StringBuffer echo = new StringBuffer(); 
     Runtime runtime = Runtime.getRuntime(); 
     Log.v(TAG, "About to ping using runtime.exec"); 
     Process proc = runtime.exec("ping -c 1 " + host); 
     proc.waitFor(); 
     int exit = proc.exitValue(); 
     if (exit == 0) { 
      InputStreamReader reader = new InputStreamReader(proc.getInputStream()); 
      BufferedReader buffer = new BufferedReader(reader); 
      String line = ""; 
      while ((line = buffer.readLine()) != null) { 
       echo.append(line + "\n"); 
      }   
      return getPingStats(echo.toString()); 
     } else if (exit == 1) { 
      pingError = "failed, exit = 1"; 
      return null;    
     } else { 
      pingError = "error, exit = 2"; 
      return null;  
     }  
    } 

    /** 
    * getPingStats interprets the text result of a Linux ping command 
    * 
    * Set pingError on error and return null 
    * 
    * http://en.wikipedia.org/wiki/Ping 
    * 
    * PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 
    * 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.251 ms 
    * 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.294 ms 
    * 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.295 ms 
    * 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.300 ms 
    * 
    * --- 127.0.0.1 ping statistics --- 
    * 4 packets transmitted, 4 received, 0% packet loss, time 0ms 
    * rtt min/avg/max/mdev = 0.251/0.285/0.300/0.019 ms 
    * 
    * PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. 
    * 
    * --- 192.168.0.2 ping statistics --- 
    * 1 packets transmitted, 0 received, 100% packet loss, time 0ms 
    * 
    * # ping 321321. 
    * ping: unknown host 321321. 
    * 
    * 1. Check if output contains 0% packet loss : Branch to success -> Get stats 
    * 2. Check if output contains 100% packet loss : Branch to fail -> No stats 
    * 3. Check if output contains 25% packet loss : Branch to partial success -> Get stats 
    * 4. Check if output contains "unknown host" 
    * 
    * @param s 
    */ 
    public static String getPingStats(String s) { 
     if (s.contains("0% packet loss")) { 
      int start = s.indexOf("/mdev = "); 
      int end = s.indexOf(" ms\n", start); 
      s = s.substring(start + 8, end);    
      String stats[] = s.split("/"); 
      return stats[2]; 
     } else if (s.contains("100% packet loss")) { 
      pingError = "100% packet loss"; 
      return null;    
     } else if (s.contains("% packet loss")) { 
      pingError = "partial packet loss"; 
      return null; 
     } else if (s.contains("unknown host")) { 
      pingError = "unknown host"; 
      return null; 
     } else { 
      pingError = "unknown error in getPingStats"; 
      return null; 
     }  
    } 
} 
+1

ping (8.8.8.8) zawsze zawiedzie – danarj

+0

Nie działa na samsung s3 4.2.2 i innym urządzeniu 4.2.2! –

+0

dbaj o dopasowywanie ciągów znaków: .contains "100% utraty pakietów" i "0% utraty pakietów" są takie same. –