2011-09-16 9 views
13

私のアンドロイドデバイスからホストにicmp pingを実行する必要があります。私は往復時間を測定する必要があります。私はアンドロイドとjavaに堪能です。使用するライブラリはわかりません。 どうすればよいですか? 3G、Edge経由でも可能ですか?アンドロイドでicmp pingを実行する方法

+0

なぜあなたはICMP往復時間を測定する必要がありますか? – dbasnett

答えて

5

おそらくisReachableを使用したいと考えています - 詳細はAndroid docをご覧ください。しかし、明らかに一部のネットワークがICMPをブロックしています。あなたはこの問題の詳細を読むことができる投稿がありますhere

2

[はい、あなたは、3G、エッジにpingを実行することができます(cygwinandroid-ndkを使用して)ファイルをライブラリーを構築し、

14

を使用可能なhere

端末エミュレータのオープンソースコードを使用することができ、無線どんなあなたが接続している限り。唯一の制限は、エミュレータでは、ここを参照してくださいです: ここhttp://groups.google.com/group/android-developers/browse_thread/thread/8657506be6819297

である私のピング機能:

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)は常に失敗します – danarj

+0

samsung s3 4.2.2および他の4.2.2デバイスでは動作しません!! –

+0

は、一致する文字列で注意してください。.contains "100%パケット損失"と "0%パケット損失"は同じです。 –

関連する問題