I use following code to print all interface and it's mac address
- ( void )interfaceInfo{
int mib[6];
size_t len;
char *buf;
unsigned char *ptr;
struct if_msghdr *ifm;
struct sockaddr_dl *sdl;
mib[0] = CTL_NET;
mib[1] = AF_ROUTE;
mib[2] = 0;
mib[3] = AF_LINK;
mib[4] = NET_RT_IFLIST;
char name[128];
memset(name, 0, sizeof(name));
for (int i=1; i<20; i ++) {
if (if_indextoname(i, name)) {
printf("%s ",name);
}else{
continue;
}
if ((mib[5] = if_nametoindex(name)) == 0) {
printf("Error: if_nametoindex error\n");
return NULL;
}
if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
printf("Error: sysctl, take 1\n");
return NULL;
}
if ((buf = malloc(len)) == NULL) {
printf("Could not allocate memory. error!\n");
return NULL;
}
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
printf("Error: sysctl, take 2");
free(buf);
return NULL;
}
ifm = (struct if_msghdr *)buf;
sdl = (struct sockaddr_dl *)(ifm + 1);
ptr = (unsigned char *)LLADDR(sdl);
NSString *macString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
*ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
printf(" %s\n",[macString cStringUsingEncoding:NSUTF8StringEncoding]);
free(buf);
}
return nil;
}
I run the code on iPhone 5 and the output is
lo0 00:00:00:00:00:00
pdp_ip0 00:00:00:00:00:00
pdp_ip1 00:00:00:00:00:00
pdp_ip2 00:00:00:00:00:00
pdp_ip3 00:00:00:00:00:00
ap1 EA:8D:28:44:32:2F
en0 E8:8D:28:44:32:2F
en1 EA:8D:28:44:32:31
awdl0 4A:79:85:44:5B:4D
//I faked parts data
I wanna know what's the pdp_ip? and what's the ap1,en1?
I find out en0 is wifi hardware mac address
Does ap1 and en1 is virtual interface?
Thank you!
lo = localhost
en = ethernet
ap = Probably for access point (if you are acting as a wifi host)
pdp_ip = maybe PDS data packet? PDS is the Phone Data Service, the data portion of GSM. Since there are four, I might postulate that PDS has the capability to offer four discrete channels.
Note this code appears to be copy-pasted from Getting Device ID or Mac Address in iOS with the helpful comments removed. You might want to look at that discussion instead.
From my research it appears (i.e. I haven't found any confirming documentation) that if the code above returns more than one "awdl0" entry then Wi-Fi is enabled. Similarly, more than one "pdp_ip0" entry indicates that cellular data is enabled. Other libraries (most notably Reachability) can then be used to indicate that a data connection has been made using either of the above.
ap1, en0, en1 are names of the interfaces on iOS as well as on Mac. If you type in Terminal on Mac
ifconfig
you would get the same, en0, en1, etc.pdp_ip interfaces are those that are used for 3G and cellular data, while ap1 is used to represent currently active data connection, Wi-Fi, cellular data or bluetooth.