本文章向你们介绍嵌入式Linux开发板_WIFI无线网卡驱动移植,主要内容包括其使用实例、应用方法、基本知识点总结和须要注意事项,具有一定的参考价值,须要的同学可以参考一下。
本文所用开发板:tiny4412,其实也可以在jz2440上实现。
嵌入式中设备想要联网,无非就有线和无线两种形式。
有线就插上网线,没哪些好说的;无线的话一种是将WIFI模块集成点焊在板子上,另一种是WIFI模块以USB的形式接到板子上。
本次使用的就是USB插口的WIFI无线网卡,实现开发板使用WIFI无线网卡访问互联网和作为个人热点。
1.打算工作1.2WIFI基础知识
WIFI网卡有两种工作模式,一种是无线终端模式(STA),也就是手机日常使用的模式,通过该模式联接网路上网;一种是无线热点模式(AP),也就是手机的个人热点模式,通过该模式提供热点供其它设备上网;
认证:致使只有容许的设备能够联接到无线网路;加密:确保数据的保密性和完整性,即数据在传输过程中不会被篡改;
安全策略
认证方法
加密方法
备注
Open
open
open
开放WiFi,无任何加密
open
WEP
开放WiFi,仅数据加密
WEP
WEP
WEP
共享秘钥认证,容易破解
WAP
802.11X
TKIP/WEP
比较安全,用于企业
PSK
TKIP/WEP
比较安全,用于个人
WAP2
802.11X
CCMP/TKIP/WEP
目前最安全,用于个人
PSK
CCMP/TKIP/WEP
目前最安全,用于个人
连入商场、商场等公共WIFI的时侯,不须要输入密码,但要通过网页输入手机号,使用验证码验证,也就是采用802.11X进行的验证,通过服务器完成的验证。
使用手机开个人热点的时侯,可以选择安全性OPEN、WEP、WAP、WAP2,也就对应不同的安全等级。
我手里的MIX2S,MIUI10个人热点上面就仅OPEN和WAP2两个选项,觉得这是个趋势,要么最简单的OPEN,要么就最安全的WAP2(WAP2是向上兼容的),逐步丢弃历史的包袱。
1.2选择无线网卡
首先是选择合适的无线网卡,选定的原则是按照WIFI无线网卡的VID和PID判定内核是否支持该无线网卡。
我的无线网卡VID是0x148F,PID是0x3070;
1.3移植WIFI驱动
grep "0x3070" drivers/net/wireless/ -nr
得到:drivers/net/wireless/ralink/rt2x00/rt2800usb.c:1091:{USB_DEVICE(0x148f,0x3070)},晓得了对应的驱动文件是rt2800usb.c;
cat drivers/net/wireless/ralink/rt2x00/Makefile
得到:obj-$(CONFIG_RT2800USB)+=rt2800usb.o,晓得了对应的宏是CONFIG_RT2800USB;
make menuconfig
搜索CONFIG_RT2800USB,得悉其依赖:Dependson:NETDEVICES[=y]&&WLAN[=y]&&WLAN_VENDOR_RALINK[=y]&&RTRT22XX0000[=n]&&USB[=y],可以晓得RTRT22XX0000[=n]没有打开,再搜索它linux安装usb网卡驱动,这么循环,直至RT2800USB[=y]。
这儿有个注意的就是,当开启的下层的某个依赖,上层的某个选项可能会多下来许多选项,而这种选项原先是没有的,不要固化思维。
最后重新编译内核即可。
1.4使用buildroot移植应用
想要使用无线网卡,须要用到四个软件:
也就是须要移植这四个软件,目前的方式有:**1.**挨个下载源码,交叉编译,配置,可以还须要相关依赖库,缺点是费时吃力;
**2.**使用Yocto等工具,制做发行版的根文件系统,比如Ubuntu16.04,上面有apt-get,可以手动下载安装,缺点是制做发行版根文件系统比较麻烦,且容积较大;
**3.**使用buildroot制做根文件系统,选择须要的软件,手动生成根文件系统,相对简单,容积也较小;
本次就以buildroot为例,制做包含应用程序的根文件系统。
git clone -b board_tiny4412 https://github.com/hceng/buildroot.git
cd buildroot/
make list-defconfigs
得悉tiny4412对应的配置文件:tiny4412_defconfig-Buildfortiny4412;
make tiny4412_defconfig
make menuconfig
对应勾选所需软件:
Target packages --->
Networking applications --->
[*] dhcp (ISC)
[*] dhcp server
[*] Enable delayed ACK feature
[*] dhcp relay
[*] dhcp client
……
[*] hostapd
[*] Enable ACS (NEW)
[*] Enable EAP
[*] Enable WPS
……
[*] iw
……
[*] wpa_supplicant
[*] Enable nl80211 support
[*] Enable AP mode
[ ] Enable EAP
[ ] Enable HS20
[ ] Enable syslog support
[ ] Enable WPS
[*] Install wpa_cli binary
[*] Install wpa_client shared library
[*] Install wpa_passphrase binary
System configuration --->
(tiny_4412) System hostname
(Welcome to hceng's board.) System banner
……
[*] Enable root login with password
(123456) Root password
make
buildroot会手动下载相关源码包,整个过程时间比较久,最后生成buildroot/output/images/rootfs.tarlinux主机,解压到SD卡rootfs分区即可。
1.5添加firmware
此时开发板启动Linux后,使用ifconfigwlan0up启动无线网卡,提示:
ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
rt2800usb 2-2.2:1.0: Direct firmware load for rt2870.bin failed with error -2
ieee80211 phy0: rt2x00lib_request_firmware: Error - Failed to request Firmware
ifconfig: SIOCSIFFLAGS: No such file or directory
提示须要firmware文件rt2870.bin。
继续通过网站去下载该固件。
得到rt2870.bin后,拷贝到单板/lib/firmware/下即可。
1.6启动WIFI网卡
注意:双网卡的单板的两个网卡IP不能设置为同一公网。缘由参考:()。
也就是先把有线网卡IP设置为其它网关,例如:
ifconfig eth0 192.168.2.220
之后启动WIFI网卡,并设置IP(路由器IP为192.168.1.1):
ifconfig wlan0 up
ifconfig wlan0 192.168.1.220
此时疗效如下:
2.无线终端模式——STA
完成上面的打算工作后,就可以通过软件使用无线网卡了。
2.1iw的使用
iw list
iw dev wlan0 scan
iw dev wlan0 scan | grep SSID:
iw wlan0 connect hceng
iw dev wlan0 link
iw wlan0 disconnect
还可以联接加密的WEP,这儿就不研究了。
注意:1.假如联接的不是路由器(IP为192.168.1.1),而是Android手机热点(IP通常为192.168.43.1),这么要将WIFI网卡IP设置为43网关,如:192.168.43.10,就能ping通192.168.43.1。2.此时只能ping路由器和局域网设备,假如要联内网,还须要如下操作:①修改/etc/resolv.conf,添加DNS:nameserver192.168.1.1,假若是手机热点为nameserver192.168.43.1;②设置网段,输入命令:routeadddefaultgw192.168.1.1,假若是手机热点为routeadddefaultgw192.168.43.1;
2.2wpa_supplicant的使用
wpa_supplicant本是开源项目,被微软更改后加入android联通平台,它主要是拿来支持WEP,WPA/WPA2和WAPI无线合同和加密认证的。
wpa_supplicant是一个联接、配置WIFI的工具,它主要包含wpa_supplicant(命令行模式)与wpa_cli(交互模式)两个程序。
一般情况下,可以通过wpa_cli来进行WIFI的配置与联接,假如有特殊的须要,可以编撰应用程序直接调用wpa_supplicant的插口直接开发。
记得曾经想查看Android手机联接过的WIFI热点密码时,就直接使用RE文件管理器查看/data/misc/wifi/wpa_supplicant.conf即可(需ROOT),上面有所有联接过的WIFI名子和密码。
从这儿可以看出,最后WIFI名子和密码,就会被保存到一个配置文件里,在Linux中,路径就是/etc/wpa_supplicant.conf。
network={
ssid="hceng"
key_mgmt=NONE
}
初始化wpa_supplicant,执行:
wpa_supplicant -B -d -i wlan0 -c /etc/wpa_supplicant.conf
查看联接状态:
wpa_cli -iwlan0 status
断掉联接:
wpa_cli -iwlan0 disconnect
killall wpa_supplicant
重新联接:
wpa_cli -iwlan0 reconnect
network={
ssid="hceng_test"
psk="12345678"
}
初始化wpa_supplicant,执行:
wpa_supplicant -B -d -i wlan0 -c /etc/wpa_supplicant.conf
至于WEP和WAP形式,也就是配置文件的不同,这儿就不去探询了,之后遇见了再说。
2.3dhclient的使用
至此,早已可以联接WIFI了,但还有一些问题。
就如上面,须要自动设置设备的IP,且要按照热点的网关设置linux安装usb网卡驱动,还可能与同网关的设备IP冲突。为了解决这个问题,引入了DHCP,手动分配IP地址。
如同家里的设备联接到路由器一样,不仅输入名子,密码,其它都不用操作,但是还不会出现IP冲突的情况。
联接好WIFI后,输入:
dhclient wlan0
实现手动获取分配的IP,并设置。
2.4手动脚本
如今早已从功能上实现了WIFI无线网卡的使用,但使用过程步骤比较多,相对麻烦。理想的疗效无论何时插上WIFI无线网卡,都手动联接WIFI,且手动获取IP地址。
这就要用到USB的热插拔机制,许久曾经写过一篇U盘手动挂载的文章,用的就是这个机制。
# hceng add for wifi
wlan0 root:root 660 * /sbin/auto_wifi.sh
其中*表示拔插都执行前面的脚本。
#!/bin/sh
if [ $ACTION = "add" ];
then
echo --------usb wifi connect--------- > /dev/console
wpa_supplicant -B -d -i wlan0 -c /etc/wpa_supplicant.conf
wpa_cli -B -i wlan0 -a/sbin/auto_dhcp.sh
else
echo --------usb wifi disconnect--------- > /dev/console
killall wpa_supplicant
killall wpa_cli
killall dhclient
fi
若果是插入USB无线网卡,将执行wpa_supplicant-B-d-iwlan0-c/etc/wpa_supplicant.conf联接wifi,再执行wpa_cli-B-iwlan0-a/sbin/auto_dhcp.sh调用dhcp的脚本;
若果是拔出USB无线网卡,将消除所有相关进程;
#!/bin/sh
IFNAME=$1
CMD=$2
if [ "$CMD" = "CONNECTED" ]; then
echo ========connect $IFNAME, dhclient for it======= > /dev/console
dhclient $IFNAME
fi
if [ "$CMD" = "DISCONNECTED" ]; then
echo ========disconnect $IFNAME, kill dhclient for it======= > /dev/console
killall dhclient
fi
若果是联接,将调用dhclient分配IP,反之清理dhclient进程。
chmod +x /sbin/auto_wifi.sh
chmod +x /sbin/auto_dhcp.sh
最后便可实现手动联接WIFI,且手动获取IP地址。
3.无线热点模式——AP
无线热点模式共须要两步操作,先使用hostapd将无线网卡切换成AP模式,再使用dhcpd分配IP。
3.1hostapd的使用
先去除上面STA模式的所有操作,重新启动单板。
1.OPEN模式:
ctrl_interface=/var/run/hostapd
ssid=hceng
channel=1
interface=wlan0
driver=nl80211
2.WAP/WAP2模式:
ctrl_interface=/var/run/hostapd
ssid=hceng
#hw_mode=g
channel=1
interface=wlan0
#bridge=br0
driver=nl80211
macaddr_acl=0
#accept_mac_file=/etc/hostapd.accept
#deny_mac_file=/etc/hostapd.deny
auth_algs=1
wpa=3
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
注释:ctrl_interface:为了前面hostapd_cli链接上hostapd;ssid:无线热点名子;hw_mode:指定802.11合同,其中a=IEEE802.11a,b=IEEE802.11b,g=IEEE802.11g;channel:设定无线信道;interface:指定使用哪一个无线网卡;bridge:指定所处集线器,对于一个同时接入网段、提供内部网和无线接入的路由器来说,设定集线器很有必要;driver:指定无线驱动;macaddr_acl:指定MAC地址过滤规则:0表示准许除严禁列表外的设备;1表示只容许在容许列表的设备;2表示使用外部RADIUS服务器;accept_mac_file:指定容许MAC列表文件所在路径;deny_mac_file:指定严禁MAC列表文件所在路径;auth_algs:指定采用哪种认证算法,采用位域(bitfields)形式来制订;1表示使用WPA;2表示使用WEP;3表示使用WPA/WEP;wpa:指定WPA类型linux 常用命令,采用位域(bitfields)形式来制订;1表示使用WPA;2表示使用WPA2;3表示使用WPA2/WPA;wpa_passphrase:WIFI的秘钥;wpa_key_mgmt:PSK为个人AP,不使用服务器认证;wpa_pairwise:指定WPA的加密方法;rsn_pairwise:指定WPA2的加密方法;
3.2dhcpd的使用
假如此时启动热点,实测手机仍然卡在获取IP地址,难以联接到热点,因而热点还需手动分配IP地址。
subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.10 192.168.2.100;
option domain-name-servers 192.168.2.1;
option routers 192.168.2.1;
}
指定了子网IP起始地址、子网网段、动态分配的IP范围、DNS服务器、路由。
3.3启动热点
ifconfig wlan0 up
ifconfig wlan0 192.168.2.1
hostapd -B /etc/hostapd.conf
dhcpd -cf /etc/dhcpcd.conf wlan0
对应的停止命令:
killall hostapd
killall dhcpd
hostapd_cli all_sta
查看热点配置:
hostapd_cli get_config
查看已联接的设备:
iw dev wlan0 station dump
3.4手动脚本
和上面的一样,如果希望实现USB无线网卡的热插拔,手动步入AP模式,只需如下操作:
# hceng add for wifi
#wlan0 root:root 660 * /sbin/auto_wifi.sh
wlan0 root:root 660 * /sbin/auto_wifi_ap.sh
#!/bin/sh
if [ $ACTION = "add" ];
then
echo --------usb wifi connect--------- > /dev/console
hostapd -B /etc/hostapd.conf
ifconfig wlan0 192.168.2.1
dhcpd -cf /etc/dhcpcd.conf wlan0
else
echo --------usb wifi disconnect--------- > /dev/console
killall hostapd
killall dhcpd
fi
chmod +x /sbin/auto_wifi_ap.sh
然后插上无线网卡,手动启动热点;拔除无线网卡,手动关掉热点。
参考教程:韦东山第3期视频之WiFi网卡移植