最近要给摄像头做一个软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) $@