微信公众号:morixinguan
关注可了解更多的教程。问题或建议,请公众号留言;
如果你觉得本文对你有帮助,欢迎赞赏
▲长按图片保存可分享至朋友圈
在MTK的机器中,如果不用特定的工具烧写MAC地址,在开机后打开WIFI后会显示: “NVRAM WARNING: Err=0x10” 这就是没有烧写mac地址的原因,所以每次打开wifi,wifi的MAC地址都是一个随机产生的值,为什么会这样?
答案在:
ndor/mediatek/proprietary/packages/apps/CdsInfo/src/com/mediatek/connnectivity/CdsWifiInfoActivity.java
源码描述如下:
public class CdsWifiInfoActivity extends Activity{ private static final StringTAG= "CDSINFO/WifiInfo"; private static final int MAC_ADDRESS_ID= 30; private static final int MAC_ADDRESS_DIGITS= 6; private static final int MAX_ADDRESS_VALUE= 0xff; private static final int INVALID_RSSI=-200; //定义了MAC地址存储的文件的绝对路径 private static final StringMAC_ADDRESS_FILENAME= "/data/nvram/APCFG/APRDEB/WIFI"; private static final String[]WIFI_SYSTEM_PROPERTY= new String[]{ "net.hostname", "dhcp.wlan0.ipaddress", "net.dns1", "net.dns2", 。。。。
以下是获取mac地址的方法:
//获取mac地址的方法 private void getMacAddr(){ try { tService("NvRAMAgent"); MAgent.Stub.asInterface(binder); new short[MAC_ADDRESS_DIGITS]; if (mUserMode){ l.setVisibility(View.GONE); AddrEdit.setVisibility(View.GONE); etVisibility(View.GONE); else { new StringBuilder(); new Random(); atter= new DecimalFormat("00"); int end1=rand.nextInt(100); int end2=rand.nextInt(100); ringnum2=formatter.format(end2); //这几位是固定的值 "00:08:22:11:"); ":").append(num2); drLabel.setVisibility(View.VISIBLE); out.println("stringbuffer:" +sb); dom=sb.toString(); catch (Exceptione){
更新mac地址的方法:
//更新mac地址 private void updateMacAddr(){ try { int i= 0; r.getService("NvRAMAgent"); ; //parsemacaddressfirstly okenizertxtBuffer= new StringTokenizer(mMacAddrEdit.getText().toString(), ":"); while (txtBuffer.hasMoreTokens()){ (short)Integer.parseInt(txtBuffer.nextToken(), 16); out.println(i+ ":" +mRandomMacAddr[i]); if (i!= 6){ "Theformatofmacaddressisnotcorrect"); return; byte[]buff= null; try { eadFileByName(MAC_ADDRESS_FILENAME); catch (Exceptione){ ); //随机产生的buff[i+4]开始就是mac地址存储的位置 for (i= 0;i34 buff[i+ 4]=(byte)mRandomMacAddr[i]; int flag= 0; try { catch (Exceptione){ intStackTrace(); if (flag> 0){ "Updatesuccessfully.rnPleaserebootthisdevice"); else { ext("Updatefailed"); catch (Exceptione){ ":" +e.getCause());
从这个代码中可以分析得知,此时的Wifi MAC地址除了前面几位是固定值,而后面都是随机产生的。 但只有一个文件才是正确的WIFI MAC地址保存的值。如果没有烧写WIFI MAC地址,那么这个文件的第4到第9个字节是固定为0的,只有烧写了MAC地址,这6个字节才是有数据的。 通过代码分析,得知烧写mac地址后的文件是保存在: /data/nvram/APCFG/APRDEB/WIFI 这个文件中。
通过adb pull /data/nvram/APCFG/APRDEB/WI