说明
应该是2016年之前的记录,之前没有写文档记录的习惯,都是随手记录的txt文件,所以没有图片、格式等。甚至现在看来有些地方逻辑不通(可能还因为年少轻狂,有些偏颇的话语),但是这些与现在的我不重要了,所以也不打算再复现、推理,重新编辑等,仅仅是在旧硬盘中发现,删除之前觉得可能还有点价值,记录下来吧。
参考find5的部分源码https://github.com/CyanogenMod/android_device_oppo_apq8064-common/tree/cm-11.0/wcnss_oppo
大概原理就是从自己指定的文件中获取mac地址,E:\cm11.0\hardware\qcom\wlan\wcnss-service目录下是wcnss-service这个可执行文件
在init.aries.rc中
service wcnss-service /system/bin/wcnss_service
class main
user system
group system wifi radio
oneshot
wcnss_oppo_client.c其实就是wcnss_qmi_client.c的覆盖,生成的动态库libwcnss_qmi中wcnss_qmi_get_wlan_address函数就可以
修改mac地址。
libqminvapi这个库文件是小米官方库,有个qmi_nv_read_wlan_mac(unsigned char** mac);函数获取真实的mac地址。
Android.mk和wcnss_oppo_client.c内容如下。
1:Android.mk
ifeq (
(
B
O
A
R
D
V
E
N
D
O
R
)
,
o
p
p
o
)
i
f
e
q
(
(BOARD_VENDOR),oppo) ifeq (
(BOARDVENDOR),oppo)ifeq((TARGET_BOARD_PLATFORM),msm8960)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := wcnss_oppo_client.c
LOCAL_C_INCLUDES += hardware/qcom/wlan/wcnss_service
LOCAL_CFLAGS += -Wall
LOCAL_SHARED_LIBRARIES := libc libcutils libutils liblog
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libwcnss_qmi
include $(BUILD_SHARED_LIBRARY)
endif
endif
2:wcnss_oppo_client.c
//#define LOG_NDEBUG 0
#define LOG_TAG “wcnss_oppo”
#define SUCCESS 0
#define FAILED -1
#define MAC_ADDR_PATH “/data/opponvitems/4678”
#define MAC_ADDR_SIZE 6
#define MAX_WAIT_COUNT 5
#define WAIT_TIME 500000
#include <cutils/log.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
int wcnss_init_qmi(void)
{
/* empty */
return SUCCESS;
}
int wcnss_qmi_get_wlan_address(unsigned char *pBdAddr)
{
int fd, ret, i;
char buf[MAC_ADDR_SIZE];
struct stat mac_stat;
do {
usleep(WAIT_TIME);
} while (stat(MAC_ADDR_PATH, &mac_stat) && i < MAX_WAIT_COUNT);
if (i == MAX_WAIT_COUNT) {
ALOGE("Failed to obtain MAC address from NV\n");
return FAILED;
}
fd = open(MAC_ADDR_PATH, O_RDONLY);
if (fd < 0) {
ALOGE("Failure opening MAC path: %d\n", errno);
return FAILED;
}
ret = read(fd, buf, MAC_ADDR_SIZE);
if (ret < 0) {
ALOGE("Failure to read MAC data: %d\n", errno);
close(fd);
return FAILED;
}
/* swap bytes */
for (i = 0; i < MAC_ADDR_SIZE; i++) {
pBdAddr[i] = buf[MAC_ADDR_SIZE - 1 - i];
}
ALOGI("Found MAC address: %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n",
pBdAddr[0],
pBdAddr[1],
pBdAddr[2],
pBdAddr[3],
pBdAddr[4],
pBdAddr[5]);
close(fd);
return SUCCESS;
}
void wcnss_qmi_deinit(void)
{
/* empty */
}