/* Make sure supplicant is running */
查看属性,保存在supp_status
判断是否运行:否返回-1
|| strcmp(supp_status, "running") != 0) {
LOGE("Supplicant not running, cannot connect");
return -1;
}
获得属性:wifi.interface值,保存在iface中
在该环境中:iface=wlan0
property_get("wifi.interface", iface, WIFI_TEST_INTERFACE);
判断文件IFACE_DIR = "/data/system/wpa_supplicant";是否存在,
存在:ifname="/data/system/wpa_supplicant/wlan0";
不存在:ifname=wlan0
if (access(IFACE_DIR, F_OK) == 0) {
snprintf(ifname, sizeof(ifname), "%s/%s", IFACE_DIR, iface);
} else {
strlcpy(ifname, iface, sizeof(ifname));
}
创建两个socket,并链接由ifname,生成的des.sun_path
ctrl_conn = wpa_ctrl_open(ifname);
monitor_conn = wpa_ctrl_open(ifname);
测试链接是否成功:
if (wpa_ctrl_attach(monitor_conn) != 0) {
wpa_ctrl_close(monitor_conn);
wpa_ctrl_close(ctrl_conn);
ctrl_conn = monitor_conn = NULL;
return -1;
}
return 0;
wpa_ctrl_open()
wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
在wifi.c中:传入参数
ctrl_path=ifname="/data/system/wpa_supplicant/wlan0";
也就是wpa_supplicant的soket。
如果定义android
则生成自己的soket文件路径组合如下:
%s/%s%d-%d", local_socket_dir, local_socket_prefix, getpid(), counter++);
其中:local_socket_dir= "/data/misc/wifi/sockets";
local_socket_prefix = "wpa_ctrl_";
在wpa_ctrl.c中定义。
生成后绑定本地soket文件,修改权限及所属组。