• 使用WIFI网卡的AP功能


    前几篇博客中,wifi无线网卡都工作于STA模式,那么它能否工作于AP模式。本篇博客就研究使wifi 无线网卡工作于AP模式。
    使用一个应用程序hostapd,关于它的介绍可以去此网站https://wireless.wiki.kernel.org/en/users/documentation/hostapd了解一下。
    1.1 下载源码  :http://w1.fi/hostapd/

    1.2 编译、安装

    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

    把生成的hostapd hostapd_cli复制到NFS的bin目录

    1.3 使用hostapd的配置文件以支持 :WPA/WPA2

    1.3.1 使用hostapd的配置文件
    #change wlan0 to your wireless device
    interface=wlan0 //指定使用哪一个网卡
    driver=nl80211 //指定使用哪一个驱动
    ssid=s3c2440 //AP的名字是什么
    channel=1

    # 认证/加密方式
    macaddr_acl=0 //用来控制mac地址的过滤。
    auth_algs=1
    ignore_broadcast_ssid=0
    wpa=3
    wpa_passphrase=baiwenwang
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=TKIP
    rsn_pairwise=CCMP

    把配置文件存为/etc/myhostapd.conf
    启动 hostapd: hostapd -B /etc/myhostapd.conf

    ps 可以查看一下,将会看到下面的这个进程在运行了。
    hostapd -B /etc/myhostapd.conf
    用手机看一下,能否使用wifi 网卡这个AP。即手机处于STA模式,wifi 网卡处于AP模式。

    打开手机,将会观察到s3c244o这个AP已经存在了,但是连接后,会出现一种现象:

    正在获取ip地址(一直这样),这个ip是从AP上获取,即从s3c2440上面去获取。一直获取不到的原因是什么呢?

    需要我们在开发板上开启一个dhcpd的服务,让它给STA设备(在这里就指手机)分配ip。

    1.3.2  启动dhcpd服务

    修改配置文件/etc/dhcpd.conf,添加:
    subnet 192.168.1.0 netmask 255.255.255.0 {
      range 192.168.1.10 192.168.1.100;
      option domain-name-servers 192.168.1.1;
      option routers 192.168.1.1;
    }

    此时如果直接运行dhcpd -cf /etc/dhcpd.conf wlan0,会出现下面的问题:
    can't open lease database /var/db/dhcpd.lease: No such file or directory

    创建空文件/var/db/dhcpd.leases:
    > /var/db/dhcpd.leases  //命令 >就表示生成一个文件,里面的内容是空的。

    再次运行dhcpd -cf /etc/dhcpd.conf wlan0,会出现下面的问题:
    No subnet declaration for wlan0(no IPv4 address),没有给wifi网卡配置IP地址。

    ifconfig wlan0 192.168.1.1
    dhcpd -cf /etc/dhcpd.conf wlan0

    此时再来实验一下,利用手机能否连接上wifi 网卡这个AP。

    正在从s3c244o获取IP地址---->已连接到s3c2440

    ping 192.168.1.10(利用wifi 网卡去ping 手机),是可以ping的通的。

    问题:怎么确定处于STA模式的设备(在此处指的是手机)ip地址是192.168.1.10呢?

    在/etc/dhcpd.conf文件中已经指定了,处于STA模式的设备的ip地址范围:range 192.168.1.10 192.168.1.100;

    这和常识正好对应起来,一个AP可以被很多处于STA模式的设备所连接。

    1.3.3 能否用命令来查看有多少个客户端连接到wifi 网卡这个AP呢?

    执行:hostapd_cli
    could not connect to hostapd -re-trying
    配置文件中还缺少这些一些内容。什么内容呢?
    在利用wpa_supplicant这个工具时,wpa_supplicant与wpa_cli进行通信需要指定一个socket文件。
    同样在这个地方也需要指定。hostapd与hostapd_cli是通过socket文件进行通信的。如果不指定的话,hostapd_cli无法连接hostapd

     修改 hostapd的配置文件

    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
    wpa=3
    wpa_passphrase=baiwenwang
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=TKIP
    rsn_pairwise=CCMP

    hostapd_cli 进入交互模式:

    all_sta  看一下有多少个STA连接到了AP。

    会显示MAC地址等信息,但是在这个地方是看不到ip的。ip在哪看呢?

    在 var/db/dhcpd.leases中会看到它的ip。
    在这个文件中,可以通过它的mac地址,去查找它的ip地址。

    1.4 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

    1.5 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

    1.6 修改/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

    注意事项:
    对于包含了AR9271网卡驱动的内核,有一个问题:
    在上电之前就接上了网卡,那么系统启动后无法识别出这个网卡。
    解决方法:
    1.上电后再接网卡
    2.把驱动编译为模块,当系统启动后再insmod: 可以在上电之前就接网卡

    可能原因:ath9k_htc.ko要用到固件, 但是固件要到根文件系统被挂载后才能访问

  • 相关阅读:
    eclipse中解决update maven之后jre被改成1.5的问题
    Navicat for MySQL密鈅
    静态创建和动态创建对象的区别
    vector相关操作总结
    C++的编码技巧相关总结
    关于VS中未经处理的异常的梳理
    头文件用于声明而不是定义
    SQL单表查询练习部分总结
    delete对象时会自动调用类的析构函数
    SQL中的sum在何时会返回为null
  • 原文地址:https://www.cnblogs.com/-glb/p/11616560.html
Copyright © 2020-2023  润新知