본문 바로가기

알림/앱 / 프로젝트

NICInfo: 아이폰, 안드로이드, 파이썬용 NIC 주소 정보 제공 클래스

Fountain Project(http://www.fountainproject.com, 하지만 사이트에 가봐도 현재로서는 뭐 작동하는게 없슴메다)의 부산물. Fountain Project를 하루라도 빨리 번듯하게 뭘 좀 만들어서 공개해야겠다는 마음은 굴뚝같지만, 이것저것 손을 대다 보니 걷잡을 수 없이 작업이 늘어나서 사이트는 그냥 망한채로 하루하루 굴러가고 있다보니... 자기위안 혹은 셀프갈굼(?)의 일환으로 작업의 부산물을 하나 공개해 봅니다.


이 NICInfo는 현재 시스템의 NIC과 NIC에 할당된 MAC/IP/브로드캐스트 IP 등을 알아내기 위한 클래스입니다. Fountain Project는 그 특성상 MAC 주소, 브로드캐스트 주소를 사용하게 되는데 iOS의 경우에는 관련 소스가 잘 정리되어 있질 않더라구요. 끙끙대면서 iOS용 버전을 만들어놓고 보니(사실 예전에 NICInfoSummary ; 아이폰용 네트워크 인터페이스 정보 제공 클래스라는 포스팅을 작성한 적이 있습니다) Python 버전으로도 만들어야 하고 안드로이드 버전으로도 만들어야 하고... 하다보니 플랫폼별로 하나씩 다 만들게 되었네요(...) 


사실 Windows Phone 7.5를 타겟으로 만들어놓은 소스도 있는데 - 관심이 있는 분은 아시겠지만 - WP 7.5는 멸망의 길에 들어선 관계로 차후에 제가 WP 8.0 작업을 하게 되면 공개하도록 하겠습니다(;;;)



먼저 각 플랫폼별 링크 갑니다:





사용법은 iOS 기준으로, 이렇습니다:

// Process NIC information
NICInfoSummary* summary = [[[NICInfoSummary alloc] init] autorelease];
NSArray *nic_array = summary.nicInfos;
for(int i=0; i<nic_array.count; i++)
{
    NICInfo* nic_info = [nic_array objectAtIndex:i];
    NSLog(@"interface : %@\r\n", nic_info.interfaceName);
    if(nic_info.macAddress != nil)
        NSLog(@" - MAC : %@\r\n", [nic_info getMacAddressWithSeparator:@"-"]);
        
        // ip can be multiple
        if(nic_info.nicIPInfos.count > 0)
        { 
            NSLog(@" - IPv4 :\r\n");
            for(int j=0; j<nic_info.nicIPInfos.count; j++)
            {
                NICIPInfo* ip_info = [nic_info.nicIPInfos objectAtIndex:j];
                NSLog(
                      @"    IP : %@\r\n    netmask : %@\r\n    broadcast : %@\r\n"
                      , ip_info.ip, ip_info.netmask, ip_info.broadcastIP);
            }
        }
    
    // ipv6 can be multiple, also.
    if(nic_info.nicIPv6Infos.count > 0)
    { 
        NSLog(@" - IPv6 :\r\n");
        for(int j=0; j<nic_info.nicIPv6Infos.count; j++)
        {
            NICIPInfo* ipv6_info = [nic_info.nicIPv6Infos objectAtIndex:j];
            NSLog(
                  @"    IP : %@\r\n    netmask : %@\r\n    broadcast : %@\r\n"
                  , ipv6_info.ip, ipv6_info.netmask, ipv6_info.broadcastIP);
        }
    }
}

// What are those connected?
NSLog(@"is3GConnected : %d\r\n", summary.is3GConnected);
NSLog(@"isBluetoothConnected : %d\r\n", summary.isBluetoothConnected);
NSLog(@"isPersonalHotspotActivated : %d\r\n", summary.isPersonalHotspotActivated);
NSLog(@"isWifiConnected : %d\r\n", summary.isWifiConnected);
NSLog(@"isWifiConnectedToNAT : %d\r\n", summary.isWifiConnectedToNAT);

참 쉽죠



NIC의 목록을 얻어오거나, NIC의 IP/MAC/Broadcast IP 주소를 알아내거나, 3G에 접속되었는지, 핫스팟(=테더링)에 연결되어 있는지, NAT에 연결되어 있는지, WIFI에 연결되어 있는지.... 등의 여부도 알아낼 수 있습니다. Android판 NICInfo 클래스도 비슷한 기능을 제공하긴 하지만, 메서드만 있고 내부에는 기능이 구현되지 않은 것도 있긴 합니다. 그건 뭐 알아서(...) IP/MAC/Broadcast IP 주소 알아내는 기능은 일단 잘 동작합니다 -_-;;


참고로, iOS의 WIFI 인터페이스는 'en0'이라는 이름을 갖고 있습니다. 나중에 변경될 가능성도 있을 것 같긴 하지만 일단 아직까지는 애플에서 바꿀 생각이 없어 보이니 대강대강 사용하면 되지 않을까 싶네요.




-------------------------------------------


Fountain Project 작업은 열심히 하고 있습니다.


관심가지는 분이 계시기나 한지 혹은 아직까지 남아계시기는 한건지 모르겠지만 어쨌든 붙들고 있습니다. 간단하고 바보같지만 효과적인 기술 셋을 만든다는 건 역시 그리 쉬운 일이 아니구나 싶기도 하고... 좌우지간 조만간 뭔가를 좀 들고 나올 수 있도록 노력해 보겠습니다.



' 3 ')/ =3