Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

如何从MTK机器的NVRAM中获取WIFI mac地址

$
0
0

在MTK的机器中,如果不用特定的工具烧写MAC地址,在开机后打开WIFI后会显示: “NVRAM WARNING: Err=0x10”

这就是没有烧写mac地址的原因,所以每次打开wifi,wifi的MAC地址都是一个随机产生的值,为什么会这样?

答案在: vendor/mediatek/proprietary/packages/apps/CdsInfo/src/com/mediatek/connnectivity/CdsWifiInfoActivity.java 这个代码中可以分析得知,此时的Wifi MAC地址除了前面几位是固定值,而后面都是随机产生的。

但只有一个文件才是正确的WIFI MAC地址保存的值。如果没有烧写WIFI MAC地址,那么这个文件的第4到第9个字节是固定为0的,只有烧写了MAC地址,这6个字节才是有数据的。

通过代码分析,得知烧写mac地址后的文件是保存在: /data/nvram/APCFG/APRDEB/WIFI 这个文件中,现在我们可以写一个程序将它读出来,很简单:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define  WIFI_FILE  "/data/nvram/APCFG/APRDEB/WIFI"
int main(void)
{
	int fd = -1 ; 
	int ret ;
	int i ;
	char buffer[512] = {0};
	char Nvram_wifi_mac_address[6] = {0};
	char d_buf[100] = {0};
	fd = open(WIFI_FILE,O_RDWR);
	if(fd < 0){
		printf("open fair!\n");
		return -1 ;
	}
	
	ret = read(fd , buffer , 512);
	if(ret < 0){
		printf("read wifi mac fair!\n"); 
	}
	
	//为什么要 & 0xff,因为有些机器是64位的,为了保证和32位的机器显示一致,故只取低8位。
	for(i = 4; i < 10 ; i++)
		Nvram_wifi_mac_address[i-4] = buffer[i] & 0xff ;
	
	sprintf(d_buf,"%02x:%02x:%02x:%02x:%02x:%02x",
		Nvram_wifi_mac_address[0],Nvram_wifi_mac_address[1],
		Nvram_wifi_mac_address[2],Nvram_wifi_mac_address[3],
		Nvram_wifi_mac_address[4],Nvram_wifi_mac_address[5]
	);
	printf("%s\n",d_buf);
	return 0 ;
}



作者:morixinguan 发表于2017/8/7 16:27:41 原文链接
阅读:40 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>