3、WIFI网卡的配置和使用
3.1、无线加密的多种方法及其区别(WEP WPA TKIP EAP)
关于这些知识可以参考文档:https://wenku.baidu.com/view/cf93b8ede009581b6bd9ebd9.html
这里的目的是要使用WIFI网卡,就不用那么深入了,只需要知道几个概念就行。
(1)无线加密是为了保证无线网络的安全。而无线网络的安全性由“认证”和“加密”来保证的。
(2)认证是允许只有被许可的用户才能连接到无线网络;
(3)加密的目的是提供数据的保密性和完整性(数据在传输过程中不会被篡改)。
发展过程 | 安全类型 | 认证 | 加密方式 |
初级版本 | open | open | open |
WEP | WEP | WEP | |
过渡版本 | WPA | 802.1X | TKIP/WEP |
PSK | TKIP/WEP | ||
终极版本 | WPA2 | 802.1X | CCMP(AES-CCMP)/TKIP/WEP |
PSK | CCMP(AES-CCMP)/TKIP/WEP |
使用wifi基本明白了上一个表格就足够了。其中802.1x是同过服务器认证的。一般只有大型企业
才会用到。一般家庭的认证方式都是PSK。查看我们的无线网,大部分用的都是PSK-AES/TKIP
3.2、工具介绍
(1)最早的配置工具为iwconfig,iw是它的替代者。只支持初级版本的认证加密方式。
(2)wpa_supplicant:可以用于上述4中“认证/加密”
(3)dhcp:使得WIFI网卡动态获取IP
4、编译使用iw
(1)源码准备:iw的编译依赖于libnl库。因此需要先编译libnl库。
libnl-3.2.23.tar.gz
iw-3.11.tar.bz2
下载地址(或到我的CSDN下载吧):http://linuxwireless.sipsolutions.net/en/users/Documentation/iw/
(2)编译libnl:
tar -zxvf libnl-3.2.23.tar.gz
看里面有configure文件。万能编译:
./configure --host=arm-linux --prefix=$PWD/tmp
make 编译出错
/@###############
addr.c:1027: error: 'AF_RDS' undeclared here (not in a function)
addr.c:1033: error: 'AF_CAN' undeclared here (not in a function)
addr.c:1034: error: 'AF_TIPC' undeclared here (not in a function)
addr.c:1038: error: 'AF_ISDN' undeclared here (not in a function)
addr.c:1039: error: 'AF_PHONET' undeclared here (not in a function)
make[2]: *** [addr.lo] Error 1
make[2]: Leaving directory `/work/gt2440_prj/zyp_RT3070/02_iw/libnl-3.2.23/lib'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/work/gt2440_prj/zyp_RT3070/02_iw/libnl-3.2.23/lib'
make: *** [all-recursive] Error 1
############@/
提示有些宏没有定义。
解决办法:https://blog.csdn.net/zhang_danf/article/details/50481296?utm_source=blogxgwz1可以屏蔽掉那几行代码。根本原因是glibc太老了。或者。这些宏都在内核中include\linux\socket.h中,找到位置,
在addr.c中加上这些宏就可以了。继续。。。
make //编译代码
make install //安装
cd tmp/
ls //查看代码
部署安装:就是将编译好的lib库和include头文件复制到交叉编译工具链相应的库和lib目录(当然也可以在编译时指定位置,但比较麻烦)
然后将编译好的lib库复制到开发板的lib库目录。cp时的-d选项是为了保持文件的属性不变。
a、编译出来的头文件放入交叉编译工具链的头文件目录:
cd include/libnl3
cp * -rf /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/
b、编译出来的库放入交叉编译工具链的库文件目录:
cd ../../lib
cp * -rf -d /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/
c、编译出来的动态库放入开发板的库目录,应用程序的运行需要这些库:
cp *so* -d /work/nfs_root/first_fs/lib/
(3)编译iw
tar -xjf iw-3.11.tar.bz2 //解压源码
cd iw-3.11 //进入源码目录
查看没有configer文件,那就修改Makefile
vi Makefile
10 CC = "arm-linux-gcc"
make
/@##################
Makefile:76: *** Cannot find development files for any supported version of libnl. Stop.
##################@/
分析Makefile,它的libnl是通过命令来查找的。而我们的是交叉编译工具,用这个命令是找不到的,所以我们
直接设置成Y就好了。
- 29 NL3xFOUND := $(shell $(PKG_CONFIG) --atleast-version=3.2 libnl-3.0 && echo Y)
+ 29 NL3xFOUND := Y
继续make
/@#################
info.c: In function 'print_phy_handler':
info.c:493: error: implicit declaration of function 'htole16'
make: *** [info.o] Error 1
#################@/
没有这个函数。
在info.c的前面定义这个语句就可以了:
#define htole16(X) (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff)
重新make
编译生成了iw这个软件。拷贝到网络文件系统就可以使用了。
虽然能够编译生成iw但编译过程中总是提示:
/@#############
Package libnl-3.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libnl-3.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libnl-3.0' found
############@/
继续修改Makefile
58 NLLIBNAME = libnl-3
79 #LIBS += $(shell $(PKG_CONFIG) --libs $(NLLIBNAME))
80 #CFLAGS += $(shell $(PKG_CONFIG) --cflags $(NLLIBNAME))
重新make就不会有错误提示了。
(4)测试iw(很可惜我的测试是失败的,以后再找解决办法吧)
这时候问题来了发现输入
# iw list //列出wifi网卡的性能。输入这个没有反应
# iw dev ra0 scan //扫描wifi的AP。输入这个提示错误:
command failed: No such device (-19)
# iw ra0 connect cwf //连接到无线AP。这个cwf,(cwf的认证方式为open模式,没有密码)当然也是错误:
command failed: Operation not supported (-95)
查网上有人说了这个问题主要是2个原因造成的
a、wifi驱动没有加载或者是wifi设备没有接入
b、wifi驱动有加载,并且网络接口都有起来,这种可能是内核驱动不支持nl80211;也有可能是驱动和内核不匹配,建议重新烧录系统,然后重新编译驱动
显然第一点是不成立的。这是我真的怀疑我的驱动不正确了。之前编译过网上找的360wifi3的驱动,也是编译成功了。但在开启网卡的时候失败了。现在有遇到了这个问题。真不知道如何处理了。无线网卡还是用不起来啊。但这时发现我的文件系统编译了老的iwconfig和iwlist工具
这两个工具是可以使用的。以后介绍iwconfig的编译方法吧。
(5)不开启无线安全(OPEN/OPEN模式下)iwconfig的使用。
iwlist ra0 scanning //扫描无线网络。
/@#############可以看到是可以扫描的我的无线网络(AP)信号的
Cell 10 - Address: EC:26:CA:C1:AB:3A
Protocol:802.11b/g/n
ESSID:"WD"
Mode:Managed
Frequency:2.412 GHz (Channel 1)
Quality=100/100 Signal level=-29 dBm Noise level=-92 dBm
Encryption key:off
Bit Rates:54 Mb/s
#############@/
iwlist ra0 scanning | grep WD
/@##############################在输出结果中显示我们的AP
===>rt_ioctl_giwscan. 12(12) BSS returned, data->length = 2122
ESSID:"WD"
##############################@/
ifup ra0 //这条命令也不能用
ifup: can't open '/etc/network/interfaces': No such file or directory
ifconfig ra0 up //打开无线网卡
iwconfig ra0 essid "WD" //接入无线网卡
iwconfig ra0 ap auto //这个千万不能输入,输入后导致路由器中有我的设备,但无法互相ping同网内的其他设备,这个问题有研究了好久
ifconfig ra0 192.168.15.101 netmask 255.255.255.0 up //给无线网卡分配ip
route add default gw 192.168.15.1 dev ra0 //加入网关。我试过不加也可以
ping 192.168.15.1 //这时候应该可以ping同局域网了
mount -t nfs -o nolock 192.168.15.15:/work/nfs_root/first_fs /mnt //可以尝试挂接网络文件系统进行操作了。
从这些来看驱动应该是没有太大问题的。但是为什么iw不能使用还没解决。
(6)开启无线安全(wep)下iwconfig的使用
这个网址对iwconfig介绍的比较详细:https://www.cnblogs.com/Jezze/archive/2011/12/23/2299854.html
网上找了很多方法都没有成功。对iwconfig还是不够了解。后来无意中配成了。记录如下:
首先路由器要选择WEP,认证类型一定要自动(开始改了共享密匙,没有成功)
WEP密匙格式应该可以选,只要使用的时候对应上就行了。
认证类型 自动 WEP密匙格式ASCII
还有信道选自动,模式选11bgn mixed 频段带宽自动。
板卡端:
insmod rt3070sta.ko
ifconfig ra0 up
iwconfig ra0
/@###############
ra0 Ralink STA ESSID:"11n-AP" Nickname:"RT2870STA"
Mode:Auto Frequency=2.412 GHz Access Point: Not-Associated
Bit Rate:1 Mb/s
RTS thr:off Fragment thr:off
Encryption key:off //注意这个是关着的,可能就是连不上的原因
Link Quality=10/100 Signal level:0 dBm Noise level:0 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
###############@/
iwconfig ra0 essid WD
iwconfig ra0 key s:water_droplet
iwconfig ra0 ap auto //网上一般到这里再配置上ip就可以ping通了。但我怎么实验也不成功。后来输入了
下面的命令后就可以成功了。
iwconfig ra0 essid any
iwconfig ra0 key on //指定on/off可以控制是否使用加密模式。默认的可能是off所以上面一直连不上?
iwconfig ra0 key open //open/restricted指定加密模式.我想就对应路由器的“认证类型”?
iwconfig ra0 //这时候再看一下它的状态
/@###############
ra0 Ralink STA ESSID:"cwf" Nickname:"RT2870STA"
Mode:Managed Frequency=2.462 GHz Access Point: EC:26:CA:C1:AB:3A
Bit Rate=54 Mb/s
RTS thr:off Fragment thr:off
Encryption key:6261-6977-656E-7761-6E67-3132-33 Security mode:open //应该就是设置的这两项。
Link Quality=100/100 Signal level:-35 dBm Noise level:-35 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
###############@/之后再按标准的设置应该就可以了。
ifconfig ra0 192.168.15.101 netmask 255.255.255.0 up //给无线网卡分配ip
route add default gw 192.168.15.1 dev ra0 //加入网关。我试过不加也可以
ping 192.168.15.1 //这时候应该可以ping同局域网了
总结:iw虽然编译通过了,但执行总是不成功。不知道为什么。不过现在还是有进步的。起码说明我从网上得来的驱动可以用了。下一节来介绍移植wpa_supplicant
Water Droplet
598323431@qq.com
2020.4.5