본문 바로가기
Study/Android

현재 연결된 네트웍의 MAC Address(맥주소)가져오기

by Answer Choi 2015. 2. 11.
반응형



​제목이 무척기네요;; 

 

머 내용은 이렇습니다.


내 폰이 연결된 wifi(보통 인터넷 공유기)에서 같은망을 사용하는 장비들(PC나 다른 폰 또는 장비)의 


MAC을 가져와야 할 일이 생깁니다.


그럴때 쓰는게 아래와 같은 소스입니다.


인터넷에 찾다보면 많이나옵니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static String getMacFromArpCache(String ip) {
       
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("/proc/net/arp"));
            String line;
            while ((line = br.readLine()) != null) {
                String[] splitted = line.split(" +");
               
               
                if (splitted != null && splitted.length >= 4 && ip.equals(splitted[0])) {
                    // Basic sanity check
                    String mac = splitted[3];
                    if (mac.matches("..:..:..:..:..:..")) {
                        return mac;
                    } else {
                        return null;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
cs

 


5번라인을 보면 "/proc/net/arp" 라는 파일을 읽어오는데, 아마 폰이 어디 연결되고 하면 정보가 저기에


업데이트 되는 것 같습니다.


참고로 PC에서는 커맨드창에서 "arp -a"라고 치면 연결된 내부망의 모든 장비들의 mac을 볼 수 있습니다. 


일단 "proc/net/arp"를 읽어오면 아래와 같이 뜹니다. 


IP address    HW type    Flags     HW address           Mask   Device
192.168.0.1    0x1        0x2      01:11:21:31:41:51     *     tiwlan0

 

헌데 위와 같이 하나밖에 없을경우가 있습니다.

 

2번부터는 뜨질않아요 ㅠㅠ

 

이럴경우 한참을 헤멨는데, 폰에서 ping을 한번씩 다 날려줘야 합니다.

 

핑은 아래와 같은 클래스로 날릴 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class pingthread extends Thread{
         
        @Override
        public void run() {
            String endIp="192.168.0.";     
            InetAddress ia;
            super.run();
            for(int i=0;i<255;i++){
                String Ip=endIp+(i+1);
                try {
                       
                        ia = InetAddress.getByName(Ip);
                        if(ia.isReachable(10)==true) {
                            Log.d("ipscan", endIp);
                        }if(i==254){
                            Log.d("ipscan""finish");
                        }
                   
                } catch (UnknownHostException e){
                    Log.d("UnknownHost Exception",String.valueOf(e));
                } catch (IOException e) {
                    Log.d("IO Exception" ,String.valueOf(e));
                } catch (IllegalArgumentException e) {
                    Log.d("IllegalArgumentExceptio",String.valueOf(e));
                }
            }
           
        }
}
cs

 

이렇게 핑을 한번 때려주고나서 mac을 검색하면 갱신이 됩니다.

 

그리고 검색된 mac만 가져오고 싶은경우 핑에서 잡힐때만 mac검사를 하면 되겠죠?ㅎ

 

그리고 특정 mac만 가져오고 싶은경우 처음 함수14라인에서 "if (mac.matches("..:..:..:..:..:.."))"

 

저 괄호안의 스트링부분을 원하는 맥으로 바꿔주면 됩니다.


예를들어 "if(mac.matches("00:08:00:..:..:.."))"로 바꿔주면 필터링이 됩니다^^

 

 

반응형

인기글