参考:
获取Wi-Fi Mac地址
获取Mac地址:返回的是020000000000
#include
#include // Per msqr
#import
#include
#import
#import
#import
#include
#include
#import
#import
#import
#import
#define MDNS_PORT 5353
#define QUERY_NAME "_apple-mobdev2._tcp.local"
#define DUMMY_MAC_ADDR @"02:00:00:00:00:00"
#define IOS_CELLULAR @"pdp_ip0"
#define IOS_WIFI @"en0"
#define IOS_VPN @"utun0"
#define IP_ADDR_IPv4 @"ipv4"
#define IP_ADDR_IPv6 @"ipv6"
报res_9_init 等错误需要引入libresolv库
在Wi-Fi有网的情况下返回mac地址值:b8:c1:11:xd:5x:7a
其他情况下返回:020000000000
- (nullable NSString *)getMacAddress3 {
res_9_init();
int len;
//get currnet ip address
NSString *ip = [self currentIPAddressOf:IOS_WIFI];
if(ip == nil) {
fprintf(stderr, "could not get current IP address of en0\n");
return DUMMY_MAC_ADDR;
}//end if
//set port and destination
_res.nsaddr_list[0].sin_family = AF_INET;
_res.nsaddr_list[0].sin_port = htons(MDNS_PORT);
_res.nsaddr_list[0].sin_addr.s_addr = [self IPv4Pton:ip];
_res.nscount = 1;
unsigned char response[NS_PACKETSZ];
//send mdns query
if((len = res_9_query(QUERY_NAME, ns_c_in, ns_t_ptr, response, sizeof(response))) < 0) {
fprintf(stderr, "res_search(): %s\n", hstrerror(h_errno));
return DUMMY_MAC_ADDR;
}//end if
//parse mdns message
ns_msg handle;
if(ns_initparse(response, len, &handle) < 0) {
fprintf(stderr, "ns_initparse(): %s\n", hstrerror(h_errno));
return DUMMY_MAC_ADDR;
}//end if
//get answer length
len = ns_msg_count(handle, ns_s_an);
if(len < 0) {
fprintf(stderr, "ns_msg_count return zero\n");
return DUMMY_MAC_ADDR;
}//end if
//try to get mac address from data
NSString *macAddress = nil;
for(int i = 0 ; i < len ; i++) {
ns_rr rr;
ns_parserr(&handle, ns_s_an, 0, &rr);
if(ns_rr_class(rr) == ns_c_in &&
ns_rr_type(rr) == ns_t_ptr &&
!strcmp(ns_rr_name(rr), QUERY_NAME)) {
char *ptr = (char *)(ns_rr_rdata(rr) + 1);
int l = (int)strcspn(ptr, "@");
char *tmp = calloc(l + 1, sizeof(char));
if(!tmp) {
perror("calloc()");
continue;
}//end if
memcpy(tmp, ptr, l);
macAddress = [NSString stringWithUTF8String:tmp];
free(tmp);
}//end if
}//end for each
macAddress = macAddress ? macAddress : DUMMY_MAC_ADDR;
return macAddress;
}//end
- (nonnull NSString *)currentIPAddressOf: (nonnull NSString *)device {
struct ifaddrs *addrs;
NSString *ipAddress = nil;
if(getifaddrs(&addrs) != 0) {
return nil;
}//end if
//get ipv4 address
for(struct ifaddrs *addr = addrs ; addr ; addr = addr->ifa_next) {
if(!strcmp(addr->ifa_name, [device UTF8String])) {
if(addr->ifa_addr) {
struct sockaddr_in *in_addr = (struct sockaddr_in *)addr->ifa_addr;
if(in_addr->sin_family == AF_INET) {
ipAddress = [self IPv4Ntop:in_addr->sin_addr.s_addr];
break;
}//end if
}//end if
}//end if
}//end for
freeifaddrs(addrs);
return ipAddress;
}//end currentIPAddressOf:
- (nullable NSString *)IPv4Ntop: (in_addr_t)addr {
char buffer[INET_ADDRSTRLEN] = {0};
return inet_ntop(AF_INET, &addr, buffer, sizeof(buffer)) ?
[NSString stringWithUTF8String:buffer] : nil;
}//end IPv4Ntop:
- (in_addr_t)IPv4Pton: (nonnull NSString *)IPAddr {
in_addr_t network = INADDR_NONE;
return inet_pton(AF_INET, [IPAddr UTF8String], &network) == 1 ?
network : INADDR_NONE;
}//end IPv4Pton
拿到的数据是:
020000000000
- (NSString *)getmacaddress2
{
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;
if ((mib[5] = if_nametoindex("en0")) == 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");
return NULL;
}
ifm = (struct if_msghdr *)buf;
sdl = (struct sockaddr_dl *)(ifm + 1);
ptr = (unsigned char *)LLADDR(sdl);
NSString *outstring = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
// NSString *outstring = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
NSLog(@"outString:%@", outstring);
free(buf);
return [outstring uppercaseString];
}