iOS:Mac地址获取

编程入门 行业动态 更新时间:2024-10-09 16:25:31

iOS:Mac<a href=https://www.elefans.com/category/jswz/34/1770965.html style=地址获取"/>

iOS:Mac地址获取

参考:
获取Wi-Fi Mac地址
获取Mac地址:返回的是020000000000

引入头文件

#include <ifaddrs.h>
#include <sys/socket.h> // Per msqr
#import <sys/ioctl.h>
#include <net/if.h>
#import <arpa/inet.h>
#import <sys/utsname.h>
#import <AdSupport/AdSupport.h>
#include <sys/sysctl.h>
#include <net/if_dl.h>
#import <resolv.h>
#import <netdb.h>
#import <netinet/ip.h>
#import <net/ethernet.h>#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"

获取对应Wi-Fi的mac地址

报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 addressNSString *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 queryif((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 messagens_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 lengthlen = 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 dataNSString *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 ifmemcpy(tmp, ptr, l);macAddress = [NSString stringWithUTF8String:tmp];free(tmp);}//end if}//end for eachmacAddress = 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 addressfor(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 forfreeifaddrs(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

获取mac地址:

拿到的数据是: 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];
}

更多推荐

iOS:Mac地址获取

本文发布于:2024-03-12 13:40:57,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1731638.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:地址   iOS   Mac

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!