目录
使用WIFI网卡利用wpa_supplicant(STA模式)
使用WIFI网卡利用wpa_supplicant(STA模式)
对于我们的ARM/手机一般是supplicant(请求者,要访问网络的设备),而AP在术语上是authentic(客服端和认证服务器的中间设备,在客户端和认证服务器之间传递信息),服务器术语上是Authentic Server(对supplicant进行实际身份验证的设备,通常是远程认证拨号用户服务)
1、编译过程
在ubuntu编译和安装wpa_supplicant-2.0.tar.gz、openssl-1.0.1d.tar.gz过程,wpa_supplicant需要依赖于openssl因此需要先安装openssl,对于./config如果没有--prefix=$PWD/tmp也可以在make install的时候指定安装目录,没有指定交叉编译链,在配置的时候修改Makefile,定义了no-asm不使用汇编,里面的汇编是x86平台的,在这里可以根据help信息得知,shared指定将库编译为动态库
tar xzf openssl-1.0.1d.tar.gz
cd openssl-1.0.1d/
./config shared no-asm --prefix=$PWD/tmp
修改Makefile,编译出错提示-m64的问题,这里没有指定ARCH=arm,直接用交叉编译,因此在Makefile中可以把-m64去掉
CC= arm-linux-gcc
AR= arm-linux-ar $(ARFLAGS) r //打包命令
RANLIB= arm-linux-ranlib
NM= arm-linux-nm
MAKEDEPPROG= arm-linux-gcc
安装,将头文件和库放入编译器中,将需要的库放入nfs挂载的文件系统中
把编译出来的头文件应该放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
sudo cp * -rf /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
把编译出来的库文件应该放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
sudo cp * -rf -d /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
把编译出来的库文件应该放入NFS文件系统的lib目录:
sudo cp *.so* -d /work/nfs_root/fs_mini_mdev_new/lib
接下来编译wpa_supplicant,可以参考https://wireless.wiki.kernel.org/en/users/documentation/wpa_supplicant,这里直接使用它的默认配置,修改Makefile将编译器修改为arm-linux-gcc
tar xzf wpa_supplicant-2.0.tar.gz
cd wpa_supplicant-2.0/wpa_supplicant/
cp defconfig .config
修改Makefile:
CC=arm-linux-gcc
然后进行make编译,提示了cannot find -lnl,在wpa_supplicant目录中搜索"lnl"如下,在src/drivers/drivers.mak中31行提示说如果定义了CONFIG_LIBNL32就会去使用lnl-3
src/drivers/drivers.mak:31: DRV_LIBS += -lnl-3
src/drivers/drivers.mak:32: DRV_LIBS += -lnl-genl-3
src/drivers/drivers.mak:36: DRV_LIBS += -lnl-tiny
src/drivers/drivers.mak:38: DRV_LIBS += -lnl
src/drivers/drivers.mak:42: DRV_LIBS += -lnl-genl
src/drivers/drivers.mak:148: DRV_LIBS += -lnl-3
src/drivers/drivers.mak:149: DRV_LIBS += -lnl-genl-3
src/drivers/drivers.mak:150: DRV_LIBS += -lnl-route-3
src/drivers/drivers.mak:154: DRV_LIBS += -lnl-tiny
src/drivers/drivers.mak:156: DRV_LIBS += -lnl
src/drivers/drivers.mak:160: DRV_LIBS += -lnl-genl
src/drivers/drivers.mak:161: DRV_LIBS += -lnl-route
src/drivers/drivers.mk:31: DRV_LIBS += -lnl-3
因此我们修改.config直接加上CONFIG_LIBNL32=y,再进行make就没有问题了,再执行,将安装路径放在tmp中,并将生成的执行程序拷贝到挂载nfs的开发板上去
make DESTDIR=$PWD/tmp install
cp * /work/nfs_root/fs_mini_mdev_new/bin/
2、使用wpa_supplicant
使用的时候,在wpa的说明文档中有解释需要先用哪个配置文件,在wpa目录中搜索.conf,其中可以参考wpa_supplicant.conf,里面有详细说明,这里来参考examples里面的配置文件
./wpa_supplicant.conf
./examples/openCryptoki.conf
./examples/plaintext.conf
./examples/wpa-psk-tkip.conf
./examples/wep.conf
./examples/wpa2-eap-ccmp.conf
./examples/udhcpd-p2p.conf
./examples/ieee8021x.conf
./dbus/dbus-wpa_supplicant.conf
./wpa_supplicant_template.conf
- open模式
wpa_supplicant -B -c/etc/plaintext.conf -iwlan0
wpa_cli -iwlan0 status // 查看状态
ifconfig wlan0 192.168.1.55
ping 192.168.1.1
配置文件内容为:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="dswei"
key_mgmt=NONE
}
- WEP/WEP模式
wpa_supplicant -B -c/etc/wep.conf -iwlan0
wpa_cli -iwlan0 status // 查看状态
ifconfig wlan0 192.168.1.55
ping 192.168.1.1
配置文件:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="dswei"
key_mgmt=NONE
wep_key0="baiwenwang123"
wep_tx_keyidx=0
}
- WPA(TKIP)模式
wpa_supplicant -B -c/etc/wpa-psk-tkip.conf -iwlan0
wpa_cli -iwlan0 status // 查看状态
ifconfig wlan0 192.168.1.55
ping 192.168.1.1
配置文件
ctrl_interface=/var/run/wpa_supplicant # 一个目录,用于wpa_supplicant和wpa_cli的socket通信
network={
ssid="dswei"
proto=WPA # proto: list of accepted protocols, 可取WPA,RSN
# If not set, this defaults to: WPA RSN
key_mgmt=WPA-PSK # 认证方式
# If not set, this defaults to: WPA-PSK WPA-EAP
pairwise=TKIP # If not set, this defaults to: CCMP TKIP
group=TKIP # If not set, this defaults to: CCMP TKIP WEP104 WEP40
psk="baiwenwang12"
}
- WPA2(AES)模式,这种模式与WPA(TKIP)模式共用一种配置文件,看上一种方式,在注释中包含了默认配置,例如如果不设置proto,则为WPA RSN模式即WPA2模式
wpa_supplicant -B -c/etc/wpa-psk-tkip.conf -iwlan0
wpa_cli -iwlan0 status // 查看状态
ifconfig wlan0 192.168.1.55
ping 192.168.1.1
配置文件:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="dswei"
psk="baiwenwang123"
}
wpa_cli可工作于"命令模式"和"交互模式",配置文件里设置多个network
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="dswei"
psk="baiwenwang123"
}
network={
ssid="Programer"
psk="baiwenwang"
}
访问外网:修改/etc/resolv.conf添加DNS
nameserver 192.168.1.1 //AP作为DNS
route add default gw 192.168.1.1 //设置网关
使用WIFI网卡利用dhcp并且自动使用wifi
1、编译过程
编译、安装dhcp-4.2.5-P1.tar.gz,解压之后发现有configure,常用命令执行./configure --host=arm-linux,发现提示/dev/random不存在,在目录中搜索搜索/dev/random,在configure的7688行中提示ac_cv_file__dev_random不是空的话就不会打印出错误,然后再make
./configure --host=arm-linux ac_cv_file__dev_random=yes
make
make后同样会出现错误,在bind/bind-9.8.4-P2/lib/export/isc中file app_api.o等编译出来的是给PC机用的,修改Makefile
./configure BUILD_CC=gcc ac_cv_file__dev_random=yes --host=arm-linux --disable-kqueue //55行
tar xzf bind.tar.gz
cd bind-9.8.4-P2
修改 lib/export/dns/Makefile.in
gen: ${srcdir}/gen.c
${CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ${srcdir}/gen.c ${LIBS}
改为
gen: ${srcdir}/gen.c
${BUILD_CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ${srcdir}/gen.c ${LIBS}
cd ../..
make
make DESTDIR=$PWD/tmp install
安装,把文件复制到开发板挂载的NFS文件系统
sudo cp bin/* /work/nfs_root/fs_mini_mdev_new/bin/
sudo cp sbin/* /work/nfs_root/fs_mini_mdev_new/sbin/
sudo cp etc/dhclient.conf.example /work/nfs_root/fs_mini_mdev_new/etc/dhclient.conf 两个配置文件
sudo cp etc/dhcpd.conf.example /work/nfs_root/fs_mini_mdev_new/etc/dhcpd.conf
执行wpa连接上AP后,执行dhclient -d wlan0,提示需要dhclient-script,在解压的在dhcp目录下,搜索dhclient-script,并将其复制到NFS中
sudo cp client/scripts/linux /work/nfs_root/fs_mini_mdev_new/etc/dhclient-script
sudo chmod +x /work/nfs_root/fs_mini_mdev_new/etc/dhclient-script
dhclient -d wlan0
在这里依然提示没有dhclient-script
sudo vi /work/nfs_root/fs_mini_mdev_new/etc/dhclient-script
并修改
#!/bin/bash
改为
#!/bin/sh
2、使用
执行dhclient -d wlan0,加上-d参数可以打印出信息,执行ifconfig可以看到自动配置IP,执行route可以看到自动配置网关,执行cat /etc/resolv.conf可以看到自动配置域名服务器
3、接上网卡自动连接AP并设置IP
需要参考热拔插:Linux驱动之热拔插,一接入WIFI网卡,就自动执行wpa_supplicant等
cat /etc/mdev.conf
wlan0 0:0 777 * /sbin/auto_wifi.sh
cat /sbin/auto_wifi.sh
#!/bin/sh
if [ $ACTION = "add" ];
then
wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0
wpa_cli -a/sbin/wpa_action.sh -B
else
killall wpa_supplicant
killall wpa_cli
killall dhclient
fi
chmod +x /sbin/auto_wifi.sh
一连接上WIFI AP, 就自动执行dhclient,连接或者断开wpa_cli都会执行/sbin/wpa_action.sh,并加上执行权限
创建一脚本:
cat /sbin/wpa_action.sh
#!/bin/sh
IFNAME=$1 //表示哪个网卡
CMD=$2 //动作CONNECTED或者DISCONNECTED
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
chmod +x /sbin/wpa_action.sh
使用WIFI网卡的AP功能
1、编译安装
需要hostapd来搭建AP,因此我们要安装hostapd,这里以hostapd-2.0.tar.gz为例
tar xzf hostapd-2.0.tar.gz
cd hostapd-2.0/
cd hostapd/
cp defconfig .config
修改.config, 加一行: CONFIG_LIBNL32=y
修改Makefile:
CC=arm-linux-gcc
make
make DESTDIR=$PWD/tmp install
在tmp目录中usr/local/bin把生成的hostapd、hostapd_cli复制到NFS的bin目录,在hostapd目录中可以找到hostapd.conf,里面的解释很全
2、使用
使用前需要写出配置文件,怎么写可以参考hostapd.conf的解释,这里写出一个自己的conf
ctrl_interface=/var/run/hostapd
#change wlan0 to your wireless device
interface=wlan0 //网卡
driver=nl80211 //驱动
ssid=S3C2440 //AP名称
channel=1
# 认证/加密方式
macaddr_acl=0 //mac地址的过滤
auth_algs=1 //来指定是用open还是wep,对于wpa和wpa2这个值必须设置为1
ignore_broadcast_ssid=0
wpa=3 //bit0表示WPA bit1表示WPA2,这里为3表示AP两个都支持
wpa_passphrase=baiwenwang //密码
wpa_key_mgmt=WPA-PSK //密码不经过服务器
wpa_pairwise=TKIP //WPA的加密方式
rsn_pairwise=CCMP //WPA2的加密方式
把配置文件存为/etc/myhostapd.conf,启动hostapd:
hostapd -B /etc/myhostapd.conf
启动dhcpd来自动配置IP、DNS和路由等,修改配置文件/etc/dhcpd.conf,添加以下内容
subnet 192.168.1.0 netmask 255.255.255.0 { //子网掩码
range 192.168.1.10 192.168.1.100; //分配的IP地址的范围
option domain-name-servers 192.168.1.1; //DNS
option routers 192.168.1.1; //路由
}
创建/var/db/dhcpd.leases
> /var/db/dhcpd.leases
使用,手机连上AP后,由于IP分配是从192.168.1.10开始的,因此ping 192.168.1.10
ifconfig wlan0 192.168.1.1
dhcpd -cf /etc/dhcpd.conf wlan0
ping 192.168.1.10
可以通过hostapd_cli来查询hostapd,前提是需要ctrl_interface,这个接口需要在配置文件中定义,可以直接执行hostapd_cli,也可以加上命令执行,这里执行hostapd_cli --help可以知道,例如执行all_sta可以知道有哪些设备接入,设备的IP可以去上面创建的dhcpd.leases查找
/ # hostapd_cli --help
hostapd_cli: invalid option -- '-'
hostapd_cli v2.0
Copyright (c) 2004-2012, Jouni Malinen <j@w1.fi> and contributors
usage: hostapd_cli [-p<path>] [-i<ifname>] [-hvB] [-a<path>] \
[-G<ping interval>] [command..]
Options:
-h help (show this usage text)
-v shown version information
-p<path> path to find control sockets (default: /var/run/hostapd)
-a<file> run in daemon mode executing the action file based on events
from hostapd
-B run a daemon in the background
-i<ifname> Interface to listen on (default: first interface found in the
socket path)
Commands:
mib get MIB variables (dot1x, dot11, radius)
sta <addr> get MIB variables for one station
all_sta get MIB variables for all stations
new_sta <addr> add a new station
deauthenticate <addr> deauthenticate a station
disassociate <addr> disassociate a station
get_config show current configuration
help show this usage help
interface [ifname] show interfaces/select interface
level <debug level> change debug level
license show full hostapd_cli license
quit exit hostapd_cli
3、修改hostapd配置文件实现其他方式
- OPEN方式的配置文件
ctrl_interface=/var/run/hostapd
#change wlan0 to your wireless device
interface=wlan0
driver=nl80211
ssid=S3C2440
channel=1
# 认证/加密方式
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
- WEP方式的配置文件
ctrl_interface=/var/run/hostapd
#change wlan0 to your wireless device
interface=wlan0
driver=nl80211
ssid=S3C2440
channel=1
# 认证/加密方式
macaddr_acl=0
auth_algs=2
ignore_broadcast_ssid=0
wep_key0="baiwenwang123"
wep_default_key=0
4、修改/etc/mdev.conf自动启动AP模式
cat /etc/mdev.conf
wlan0 0:0 777 * /sbin/auto_wifi_ap.sh
cat /sbin/auto_wifi_ap.sh
#!/bin/sh
if [ $ACTION = "add" ];
then
hostapd -B /etc/myhostapd.conf
ifconfig wlan0 192.168.1.1
dhcpd -cf /etc/dhcpd.conf wlan0
else
killall hostapd
killall dhcpd
fi