zoukankan      html  css  js  c++  java
  • 使用WIFI网卡 dhcp动态获取IP

    前面几篇博客中,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网卡动态获取IP
    a.1 编译、安装
    tar xzf dhcp-4.2.5-P1.tar.gz
    cd 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.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 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

    sudo cp client/scripts/linux /work/nfs_root/fs_mini_mdev_new/etc/dhclient-script
    chmod +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 -iwlan0
    dhclient -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/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

    a.4 一连接上WIFI AP, 就自动执行dhclient
    创建一脚本:
    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

    总结一下接上网卡和拔掉网卡的过程:

    首先接上网卡时会触发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

  • 相关阅读:
    UILabel 设置字体间的距离 和 行与行间的距离
    IB_DESIGNABLE 和 IBInspectable 的使用
    干货博客
    GitHub克隆速度太慢解决方案
    实时(RTC)时钟,系统时钟和CPU时钟
    折腾了好久的vscode配置c/c++语言环境(Windows环境下)
    c语言中的malloc函数
    记录一下关于在工具类中更新UI使用RunOnUiThread犯的极其愚蠢的错误
    记录关于Android多线程的一个坑
    Android中限制输入框最大输入长度
  • 原文地址:https://www.cnblogs.com/-glb/p/11610609.html
Copyright © 2011-2022 走看看