zoukankan      html  css  js  c++  java
  • 软AP的实现------hostapd的编译运行

            版权声明:本文为博主原创文章,未经博主允许不得转载。 http://www.cnblogs.com/ahcc08/p/8495286.html 

            最近要给摄像头做一个软ap,让手机能够连上这个热点,从而能够与摄像头进行通信。

           1、什么是hostapd :

            hostapd能够使得无线网卡切换为master模式,模拟AP(通常可以认为是路由器)功能,也就是我们说的软AP(Soft AP)。 

            Hostapd的功能就是作为AP的认证服务器,负责控制管理stations(通常可以认为带无线网卡的PC)的接入和认证。 

           通过Hostapd可以将无线网卡切换为AP/Master模式,通过修改配置文件,可以建立一个开放式的(不加密)的,WEP,WPA或WPA2的无线网络。

           并且通过修改配置文件可以设置无线网卡的各种参数,包括频率,信号,beacon包时间间隔,是否发送beacon包,如果响应探针请求等等。还可以设置mac地址过滤条件等。

           下面是无线网卡常见的工作模式及其作用。

            

           2、编译移植

           基于RTL8188EUS无线网卡的驱动程序

           版本:wpa_supplicant_hostapd-0.8_rtw_r7475.20130812

           进入hostapd目录,修改Makefile 找到如下语句:

    ifndef CC
    CC=gcc
    endif

          删除上面的语句,改成自己编译服务器的gcc,然后make。

    CROSS_COMPILE=arm-xxxx-linux-
    CC=$(CROSS_COMPILE)gcc

        生成hostapd和hostapd_cli

        3、运行hostapd,创建软AP

        vi /etc/hostapd.conf

       1)、创建不需要密码的AP

    ctrl_interface=/var/run/hostapd
    interface=wlan0
    driver=rtl871xdrv
    ssid=Ap117081234000009
    channel=8
    macaddr_acl=0
    auth_algs=1
    ignore_broadcast_ssid=0

      2)、创建wep加密类型的AP

    ctrl_interface=/var/run/hostapd
    interface=wlan0
    driver=rtl871xdrv
    ssid=Ap117081234000009
    channel=8
    macaddr_acl=0
    auth_algs=2
    ignore_broadcast_ssid=0
    wep_key0=1234567891200
    wep_default_key=0

    3)、创建wpa psk加密类型的AP

    ctrl_interface=/var/run/hostapd
    interface=wlan0
    driver=nl80211
    ssid=Ap117081234000009
    channel=1
    macaddr_acl=0
    auth_algs=1
    ieee80211n=1
    hw_mode=g
    ignore_broadcast_ssid=0
    wpa=2
    wpa_passphrase=123456789
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=TKIP
    rsn_pairwise=CCMP

       运行命令: ./hostapd -B /etc/hostapd.conf -dd

       

      电脑可以搜到这个wifi,但是连接不上                                   手机也可以搜到

                                         

    连不上的原因是没有dhcpserver为其分配IP。

    关于dhcpserver的移植编译见下章

    这个版本使用的驱动是rtl871xdrv,不支持wpa_psk的加密类型,即使创建了wpa_psk的加密类型的AP,也是无法连接成功的。

    重新下载了另一个版本wpa_supplicant_8_M_6.x_rtw_r17190.20160415,这个版本使用的nl80211驱动,是可以的。

    不过编译起来有点麻烦。

    进入hostapd目录,cp defconfig .config

    修改Makefile

    ifndef CC
    CC=gcc
    endif

    将上面的删除,改成

    CROSS_COMPILE=arm-XXX-linux-
    CFLAGS = -mcpu=arm926ej-s -mno-unaligned-access -fno-aggressive-loop-optimizations
    LIBS+= -L../../project/Trunk/Libs/hiXXX/opensource/ -lssl -lcrypto -lnl
    CC=$(CROSS_COMPILE)gcc -L../../project/Trunk/Libs/hiXXX/opensource/ -DCONFIG_WPS
    CFLAGS+= -I../../common-headers/Trunk/libnl-1.1.4

    然后make,报如下错误:

     undefined reference to symbol 'pthread_rwlock_rdlock@@GLIBC_2.4'

    error adding symbols: DSO missing from command line

    collect2: error: ld returned 1 exit status

    在Makefile添加如下语句:

    LDFLAGS +=-Wl,--gc-sections -Wall -lpthread -lc  -ldl 

    ※这个版本的hostapd需要依赖libopenssl.a和libnl.a开源库

    我是把用到的开源库放到了../../project/Trunk/Libs/hiXXX/opensource目录里的

    这样make生成的hostapd是支持wpa_psk加密类型的。

    把hostapd开源库编译成静态链接库,可以给其他项目进行调用
    方法如下:
    修改Makefile
    添加

    AR = $(CROSS_COMPILE)ar
    RANLIB = $(CROSS_COMPILE)ranlib

    把 ALL=libhostapd libhostapd_cli
    改成ALL=libhostapd.a libhostapd_cli.a

    hostapd_cli: $(OBJS_c)
    $(Q)$(CC) $(LDFLAGS) -o hostapd_cli $(OBJS_c) $(LIBS_c)
    @$(E) " LD " $@

    下面添加:

    libhostapd.a: .config $(OBJS)
    $(AR) -r $@ $(OBJS)
    $(RANLIB) $@
    libhostapd_cli.a: $(OBJS_c)
    $(AR) -r $@ $(OBJS_c)
    $(RANLIB) $@
    

    hostapd.conf的字段说明

    macaddr_acl     #可选,指定MAC地址过滤规则,
    
            0表示除非在禁止列表否则允许,
    
            1表示除非在允许列表否则禁止,
    
            2表示使用外部RADIUS服务器;
    
    accept_mac_file:指定允许MAC列表文件所在;
    
    deny_mac_file:指定禁止MAC列表文件所在
    
    auth_algs:指定采用哪种认证算法。
    
                 采用位域(bit fields)方式来制定,其中第一位表示开放系统认证(Open System Authentication, OSA),
    
                 第二位表示共享密钥认证(Shared Key Authentication, SKA)。
    
                 这里设置alth_algs的值为1,表示只采用OSA;如果为3则两种认证方式都支持。
    
                 对于WPA或WPA2,此值必须设为1
    
    #指定802.11协议,包括 a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g
    
    hw_mode:指定802.11协议,包括 a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g;
    
    ignore_broadcast_ssid:
    
      # 是否广播,0 广播SSID,1 不广播SSID(发送空SSID,即长度为0的SSID),
      # 2 忽略广播 SSID 的探测请求,跟1类似,但是兼容某些不支持空SSID的设备
    
    wpa:指定WPA类型,这是一个位域值(bit fields),
    
      第一位表示启用WPA。     1:支持wpa
    
      第二位表示启用WPA2。    2:支持wpa2     3:两者都支持
    
    WPA 是 4 次握手协商单播密钥+2 次握手协商组播密钥,推出时支持的加密算法 TKIP;
    
    WPA2 使用 4 次握手同时协商单播和组播密钥,配套的加密算法是 CCMP
    
    wpa_passphrase:WPA/WPA2加密需要指定密钥,这个选项就是配置WPA/WPA2的密钥。
    
             注意wpa_passphrase要求8~63个字符。
    高山流水,海纳百川!
  • 相关阅读:
    DockerFile体系结构
    Nignx(二) server_name 规则
    解决Redis分布式锁——死锁问题
    redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案
    Docker_Linux
    正则例子
    部属流程
    Mysql insert语句的优化
    MySQL innodb_fast_shutdown参数讲解
    MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)
  • 原文地址:https://www.cnblogs.com/ahcc08/p/8495286.html
Copyright © 2011-2022 走看看