WPS功能调试

WPS功能调试

在SDK中添加WiFi模块后发现WPS不能正常使用,于是又有了调试WPS的任务

WPS介绍

WPS(Wi-Fi Protected Setup)是Wi-Fi保护设置的英文缩写。WPS是由Wi-Fi联盟组织实施的认证项目,主要致力于简化无线局域网安装及安全性能的配置工作。这是一个2007年年初才发布的认证,目的是让消费者可以通过更简单的方式来设置无线网络设备,并且保证有一定的安全性。

在传统方式下,用户新建一个无线网络时,必须在接入点手动设置网络名(SSID)和安全密钥,然后在客户端验证密钥以阻止“不速之客”的闯入。Wi-Fi Protected Setup能帮助用户自动设置网络名(SSID)、配置最高级别的WPA2安全密钥,具备这一功能的无线产品往往在机身上设计一个功能键,称为WPS按钮,用户只需轻轻按下该按钮或输入PIN码,再经过两三步简单操作即可完成无线加密设置,同时在客户端和路由器之间建立一个安全的连接。

WPS并不是一项新增的安全性能,只是使现有的安全技术更容易配置。对于一般用户,WPS提供了一个相当简便的加密方法。通过该功能,不仅可将都具有WPS功能的Wi-Fi设备和无线路由器进行快速互联,还会随机产生一个8位数字的字符串作为个人识别号码(PIN)进行加密操作。省去了客户端需要连入无线网络时,必须手动添加网络名称(SSID)及输入冗长的无线加密密码的繁琐过程。

遇到的问题

  1. 经过自己的摸索,发现WPS需要运行wscd,在项目中加入wscd进行编译,发现一些类型不匹配的错误,基本都是有符号和无符号指针的不匹配,简单的进行强转修改,使其能够编译通过并运行

  2. 运行失败,由于系统是只读系统,默认的路径不能生成文件,所以修改目录,定义了宏,并将TOP_CONFIG_DIR修改为我们定义的宏WIFI_WPS_TMP_DIR,这两个宏的路径如下:

    1
    2
    #define TOP_CONFIG_DIR  "/etc"
    #define WIFI_WPS_TMP_DIR "/tmp/wps"
  3. 查到启动命令为:

    1
    $wscd -start -c /tmp/wps/wsc-wlan0.conf -w wlan0 -fi /tmp/wps/wscd-wlan0.fifo -br br-lan -upnp 0 -daemon

    通过命令可以看到需要一份配置文件,指定interface,指定管道路径,建立网桥

    配置文件最后再说,interface就是WiFi对应的,管道的作用是什么呢,经过一段时间的资料查找,代码查看,发现除了wscd还需要一个iwcontrol的进程,iwcontrol的启动命令如下:

    1
    iwcontrol wlan0 wlan1
  4. 启动wscd,启动iwcontrol后,发送启动wps的命令后,wscd直接退出,原因是接收到用户定义的信号SIGUSR2。

    我去查看wsc的源码,发现有捕获信号的操作:

    1
    2
    signal(SIGUSR2, sigHandler_user);
    signal(SIGTSTP, sigHandler_user);

    说明代码没有走到这个地方就阻塞了,向上查看代码,找到了阻塞的位置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    {
    if (stat(pCtx->fifo_name, &status) == 0)
    unlink(pCtx->fifo_name);

    if (mkfifo(pCtx->fifo_name, FIFO_MODE) < 0) {
    WSC_DEBUG("mkfifo() error1!\n");
    return -1;
    }

    /* Open fifo, indication event queue of wlan driver */
    pCtx->fifo = open(pCtx->fifo_name, O_RDONLY , 0);
    //WSC_DEBUG("mkfifo(%s)\n",pCtx->fifo_name);
    if (pCtx->fifo < 0) {
    DEBUG_ERR("open fifo(%s) fail!\n",pCtx->fifo_name);
    return -1;
    }
    }

    打开管道后,会一直阻塞,等待另一个进程的写入,所以说明iwcontrol没有打开这个管道,查看其源码发现,管道的路径是写死的在/etc目录下,和wscd不匹配,所以修改路径解决此问题

  5. 以上所有问题解决后,WPS并不能连接成功,经过排查发现还需建立一条路由:

    1
    system("route add -net 239.255.255.250 netmask 255.255.255.255 dev br-lan");

WSCD配置文件

默认配置文件

WSCD的默认配置文件参数,手册里都有介绍,其中uuid需要将后12位换成mac地址,其他的是否修改无伤大雅,如果要修改可按照手册修改

生成配置文件

WSCD使用的配置文件是由两部分组成,一部分为WIFI的WPS配置,一部分即使默认配置,WPS配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
mode:
1: ap unconfigured, 2: client unconfigured (enrollee),
3: client configured (registrar), 4: ap-proxy configured,
5: ap-proxy registrar
*/
mode = 5
upnp = 0 //0-disable, 1-enable
config_method = 134 //2-ETH,4-PIN,128-PBC 默认全选即134
wlan0_wsc_disabled = 0 //0-enable wps,1-disable wps
auth_type = 34 //0-open,2-WPA,32-WPA2 WPA/WPA2即为34
encrypt_type = 12 //1-NONE,2-WEP,4-TKIP,8-AES
connection_type = 1
manual_config = 0
network_key = 1234567890 //password
ssid = "default2.4G" //ssid
pin_code = 74694907 //pin code
rf_band = 1 //1-2.4G,2-5G
device_name = "AP" //device name
config_by_ext_reg = 1

最终配置要根据WiFi的配置生成,并将其与默认配置合并,以2.4g为例生成配置文件的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
int update_wsc_conf()
{
FILE *fp,*default_fp;
struct stat status;
char tmp_buf[4096];
memset(tmp_buf,0,4096);
fp = fopen(WLAN0_WPS_CONF_FILE, "w");
if (fp != NULL)
{
fprintf(fp, "mode = 5\n");

fprintf(fp, "upnp = 0\n");
fprintf(fp, "config_method = 134\n");
fprintf(fp, "wlan0_wsc_disabled = 0\n");
switch (m_wifi_24g->m_auth_mode)
{
case 0:
fprintf(fp, "auth_type = 0\n");
break;
case 4:
fprintf(fp, "auth_type = 32\n");
break;
case 6:
fprintf(fp, "auth_type = 34\n");
break;
default:
break;
}

switch (m_wifi_24g->m_encryp_type)
{
case 2:
fprintf(fp, "encrypt_type = 4\n");
break;
case 8:
fprintf(fp, "encrypt_type = 8\n");
break;
case 10:
fprintf(fp, "encrypt_type = 12\n");
break;
default:
break;
}

fprintf(fp, "connection_type = 1\n");
fprintf(fp, "manual_config = 0\n");
fprintf(fp, "network_key = %s\n", m_wifi_24g->m_password.c_str());
fprintf(fp, "ssid = \"%s\"\n", m_wifi_24g->m_ssid.c_str());
fprintf(fp, "pin_code = 74694907\n");
fprintf(fp, "rf_band = 1\n");
fprintf(fp, "device_name = \"AP\"\n");
fprintf(fp, "config_by_ext_reg = 1\n");
}

if (stat(DEFAULT_WPS_CONF_FILE, &status) < 0)
{
ALOGE("stat() error [%s]!\n", DEFAULT_WPS_CONF_FILE);
fclose(fp);
return -1;
}

if ((default_fp = fopen(DEFAULT_WPS_CONF_FILE, "r")) != NULL)
{
if (fread(tmp_buf, 1, status.st_size+1, default_fp))
{
fprintf(fp, "%s",tmp_buf);
}
else
{
ALOGE("fread error [%s]!\n", DEFAULT_WPS_CONF_FILE);
fclose(fp);
fclose(default_fp);
return -1;
}
}
else
{
ALOGE("fopen error [%s]!\n", DEFAULT_WPS_CONF_FILE);
fclose(fp);
return -1;
}

fclose(fp);
fclose(default_fp);
return 0;

}

WPS功能调试
https://carl-5535.github.io/2021/12/15/工作总结/WPS调试/
作者
Carl Chen
发布于
2021年12月15日
许可协议