Android arp表 – 开发问题
我正在编写的Android应用程序有两个问题。
我正在从/proc/net/arp
读出本地arp表,并在哈希映射中保存ip和相应的mac地址。 看我的function。 它运作正常。
/** * Extract and save ip and corresponding MAC address from arp table in HashMap */ public Map 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); }
-
第一个问题:
我也在使用广播接收器。 当我的应用程序收到状态
WifiManager.NETWORK_STATE_CHANGED_ACTION
我检查是否建立了与网关的连接。 如果为true,我调用我的函数来读取arp表。 但是在这个阶段,系统还没有构建arp表。 有时,当我收到连接状态时,arp表是空的。有人有想法解决这个问题吗?
-
第二个问题:
我想以持久的方式保存网关的ip和mac地址。 现在我正在使用共享首选项 。 也许写入内部存储更好?
有小费吗?
对于第一个问题,您可以在睡眠一段时间之后启动一个运行该方法的新线程,或者直到它有一些条目(使用邮箱创建Runnable
以获取Map) – 除非您需要直接使用地图,那么我认为唯一的方法是等待参赛作品。 例如(如果您需要直接使用地图):
public Map 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); }