前面几篇博客中,wifi网卡的ip都是手工设置的,本篇博客将来移植dhcp,使得wifi网卡可以动态的获取ip、路由等信息。
那我们去哪里下载dhcp源码呢?在pc机上执行dh +tab键,看一下有哪些应用程序?其中有一个应用程序为dhclient,执行dhclient -v,可以看到:For info,please visit http://www.isc.org/downloads/dhcp从这可以看出,它就是从网站http://www.isc.org/sw/dhcp获取源码的。
a. dhcp : 使得WIFI网卡动态获取IPa.1 编译、安装tar xzf dhcp-4.2.5-P1.tar.gzcd dhcp-4.2.5-P1./configure --host=arm-linux ac_cv_file__dev_random=yes
cd bind修改Makefile:./configure BUILD_CC=gcc ac_cv_file__dev_random=yes --host=arm-linux --disable-kqueue
tar xzf bind.tar.gzcd 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 DESTDIR=$PWD/tmp install
把文件复制到NFSsudo 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.confsudo cp etc/dhcpd.conf.example //work/nfs_root/fs_mini_mdev_new/etc/dhcpd.conf
sudo cp client/scripts/linux /work/nfs_root/fs_mini_mdev_new/etc/dhclient-scriptchmod +x /work/nfs_root/fs_mini_mdev_new/etc/dhclient-script并修改#!/bin/bash改为#!/bin/sh
a.2 使用:mkdir -p /var/db //解决出现的警告信息wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0dhclient -d wlan0
此时ifconfig看一下,就可以看到wlan0有ip了。
route看一下,也配置了路由了。
cat /etc/resolv.conf,可以看到将域名服务器也设置好了。
直接ping news.qq.com,就会成功。
a.3 这样使用起来还有一些麻烦,能不能一接入WIFI网卡,就自动执行wpa_supplicant等参考第2期视频第28课热拔插cat /etc/mdev.conf wlan0 0:0 777 * /sbin/auto_wifi.sh
cat /sbin/auto_wifi.sh#!/bin/shif [ $ACTION = "add" ];then wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0 //如果添加网卡(包括两种情况:连接与断开)的话,就需要执行这两条命令 wpa_cli -a/sbin/wpa_action.sh -Belse killall wpa_supplicant //拔掉网卡时,执行这些命令。 killall wpa_cli killall dhclientfi
chmod +x /sbin/auto_wifi.sh
a.4 一连接上WIFI AP, 就自动执行dhclient创建一脚本: cat /sbin/wpa_action.sh #!/bin/shIFNAME=$1 //网卡CMD=$2 //命令 有connected和disconnected两种。if [ "$CMD" = "CONNECTED" ]; then echo connect $IFNAME, dhclient for it > /dev/console dhclient $IFNAMEfiif [ "$CMD" = "DISCONNECTED" ]; then echo disconnect $IFNAME, kill dhclient for it > /dev/console killall dhclientfi
总结一下接上网卡和拔掉网卡的过程:
首先接上网卡时会触发mdev,mdev就会根据配置文件mdev.conf执行/sbin/auto_wifi.sh脚本。当它发现是添加网卡时,就会执行下面这两条命令: wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0 wpa_cli -a/sbin/wpa_action.sh -B:
当wpa_supplicant发现wifi网卡连接上AP之后,它就会给wpa_cli发一个事件,wpa_cli就会执行wpa_action.sh的脚本。 当wpa_supplicant发现网卡与AP断开之后,它也会给wpa_cli发送一个事件,wpa_cli就会去执行wpa_action.sh的脚本。
对于wpa_action.sh脚本:
一旦接上wifi 网卡时,执行CONNECTED那个分支,默认的就是这个分支。我感觉这个地方脚本还有点问题。问题在于在wpa_action.sh这个脚本中,你是如何确定它走的是CONNECTED分支还是DISCONNECTED分支。在auto_wifi.sh脚本中,你只是指明了它要执行wpa_action.sh这个脚本,但是具体执行哪个分支,并没有交代清楚。
如果将网卡拔掉时,同样会触发mdev,执行medv.conf,此时它不走add那条分支了,而是直接执行: killall wpa_supplicant killall wpa_cli killall dhclient