5

私が書いているAndroidアプリには2つの問題があります。

からローカル arp テーブルを読み取り、/proc/net/arpIP と対応する MAC アドレスをハッシュ マップに保存します。私の機能を参照してください。正常に動作しています。

    /**
     * Extract and save ip and corresponding MAC address from arp table in HashMap
     */
    public Map<String, String> createArpMap() throws IOException {      
        checkMapARP.clear();
        BufferedReader localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp")));
        String line = "";       

        while ((line = localBufferdReader.readLine()) != null) {            
            String[] ipmac = line.split("[ ]+");
            if (!ipmac[0].matches("IP")) {
                String ip = ipmac[0];
                String mac = ipmac[3];
                if (!checkMapARP.containsKey(ip)) {
                    checkMapARP.put(ip, mac);               
                }                   
            }
        }
        return Collections.unmodifiableMap(checkMapARP);
    }
  1. 最初の問題:

    私もブロードキャストレシーバーを使用しています。アプリが State を受け取るWifiManager.NETWORK_STATE_CHANGED_ACTIONと、ゲートウェイへの接続が確立されているかどうかを確認します。true の場合、関数を呼び出して arp テーブルを読み取ります。ただし、この段階では、システムはまだ arp テーブルを構築していません。接続状態を受信すると、arp テーブルが空のままになることがあります。

    誰でもこれを解決するためのアイデアを持っていますか?

  2. 2番目の問題:

    ゲートウェイの IP アドレスと MAC アドレスを永続的な方法で保存したいと考えています。現在、これには共有設定を使用しています。内部ストレージに書き込んだ方が良いのでしょうか?

    任意のヒント?

4

1 に答える 1

2

最初の問題では、設定された時間スリープした後、またはいくつかのエントリができるまで(Runnableマップを取得するためにメールボックスを作成する)、そのメソッドを実行する新しいスレッドを開始できます-マップを直接使用する必要がない限り、エントリーを待つしか方法はないと思います。たとえば(マップを直接使用する必要がある場合):

public Map<String, String> createArpMap() throws IOException {      
    checkMapARP.clear();
    BufferedReader localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp")));
    String line = "";       
    while ((line = localBufferdReader.readLine()) == null) {
        localBufferdReader.close();
        Thread.sleep(1000);
        localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp")));
    }
    do {            
        String[] ipmac = line.split("[ ]+");
        if (!ipmac[0].matches("IP")) {
            String ip = ipmac[0];
            String mac = ipmac[3];
            if (!checkMapARP.containsKey(ip)) {
                checkMapARP.put(ip, mac);               
            }                   
        }
    } while ((line = localBufferdReader.readLine()) != null);
    return Collections.unmodifiableMap(checkMapARP);
}
于 2012-11-30T14:50:41.663 に答える