web-dev-qa-db-ja.com

pingを実行する方法android

Androidデバイスからホストへのicmppingを実行する必要があります。ラウンドトリップ時間を測定する必要があります。AndroidおよびJava、使用するライブラリがわからない場合、どうすればよいですか?3G、Edge経由で可能ですか?

15
Abhishek

はい、接続があれば、3G、Edge、ワイヤレスなどでpingを実行できます。唯一の制限はエミュレーターにあります。ここを参照してください: http://groups.google.com/group/Android-developers/browse_thread/thread/8657506be6819297

これが私の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;
        }       
    }
}
15

おそらくisReachableを使用することをお勧めします Android doc で詳細を参照してください。ただし、明らかに一部のネットワークはICMPをブロックしています。この問題についてもっと読むことができる投稿があります ここ

6
Andrei

利用可能なターミナルエミュレータのオープンソースコードを使用できます ここ

ライブラリをビルドします( cygwin および Android-ndk )ファイルを使用しますその後、

1
Azhar Shaikh