硬件:IMX6的arm板、树莓派 Raspberry Pi 无线USB网卡 EDUP EP-N8508GS 黄金版 免驱,并且已经带了驱动
关于wifi连接可以看 https://blog.csdn.net/chenjk10/article/details/90521093
- 普通热点
开启普通热点,只有一个无线网卡,无法上网的热点
# 如果启动了wpa_supplicant,先要停止
killall wpa_supplicant > /dev/null 2>&1
# 在停止了wpa_supplicant后,关联的网卡会被变成禁用状态
# 注意:如果使用代码停止wpa_supplicant,需要休眠等待一下,要等待wpa_supplicant真的退出并且网卡状态变化
修改或者创建hostapd.conf文件,这个文件一般在/etc/hostapd.conf
##### hostapd configuration file ##############################################
interface=wlan0
ctrl_interface=/var/run/hostapd
ssid=MyAPName
# Channel number (IEEE 802.11)
# (default: 0, i.e., not set)
# Please note that some drivers do not use this value from hostapd and the
# channel will need to be configured separately with iwconfig.
#
# If CONFIG_ACS build option is enabled, the channel can be selected
# automatically at run time by setting channel=acs_survey or channel=0, both of
# which will enable the ACS survey based algorithm.
channel=6
# Enable WPA. Setting this variable configures the AP to require WPA (either
# WPA-PSK or WPA-RADIUS/EAP based on other configuration). For WPA-PSK, either
# wpa_psk or wpa_passphrase must be set and wpa_key_mgmt must include WPA-PSK.
# Instead of wpa_psk / wpa_passphrase, wpa_psk_radius might suffice.
# For WPA-RADIUS/EAP, ieee8021x must be set (but without dynamic WEP keys),
# RADIUS authentication server must be configured, and WPA-EAP must be included
# in wpa_key_mgmt.
# This field is a bit field that can be used to enable WPA (IEEE 802.11i/D3.0)
# and/or WPA2 (full IEEE 802.11i/RSN):
# bit0 = WPA
# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
wpa=2
# WPA pre-shared keys for WPA-PSK. This can be either entered as a 256-bit
# secret in hex format (64 hex digits), wpa_psk, or as an ASCII passphrase
# (8..63 characters) that will be converted to PSK. This conversion uses SSID
# so the PSK changes when ASCII passphrase is used and the SSID is changed.
# wpa_psk (dot11RSNAConfigPSKValue)
# wpa_passphrase (dot11RSNAConfigPSKPassPhrase)
#wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
wpa_passphrase=12345678
# Set of accepted key management algorithms (WPA-PSK, WPA-EAP, or both). The
# entries are separated with a space. WPA-PSK-SHA256 and WPA-EAP-SHA256 can be
# added to enable SHA256-based stronger algorithms.
# (dot11RSNAConfigAuthenticationSuitesTable)
#wpa_key_mgmt=WPA-PSK WPA-EAP
wpa_key_mgmt=WPA-PSK
# Set of accepted cipher suites (encryption algorithms) for pairwise keys
# (unicast packets). This is a space separated list of algorithms:
# CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
# TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
# Group cipher suite (encryption algorithm for broadcast and multicast frames)
# is automatically selected based on this configuration. If only CCMP is
# allowed as the pairwise cipher, group cipher will also be CCMP. Otherwise,
# TKIP will be used as the group cipher.
# (dot11RSNAConfigPairwiseCiphersTable)
# Pairwise cipher for WPA (v1) (default: TKIP)
wpa_pairwise=TKIP CCMP
#wpa_pairwise=CCMP
# Pairwise cipher for RSN/WPA2 (default: use wpa_pairwise value)
#rsn_pairwise=CCMP
rsn_pairwise=CCMP TKIP
#rsn_pairwise=CCMP
# Time interval for rekeying GTK (broadcast/multicast encryption keys) in
# seconds. (dot11RSNAConfigGroupRekeyTime)
#wpa_group_rekey=600
#wpa_group_rekey=86400
# auto add current network card into bridge
#bridge=br0
# IEEE 802.11 specifies two authentication algorithms. hostapd can be
# configured to allow both of these or only one. Open system authentication
# should be used with IEEE 802.1X.
# Bit fields of allowed authentication algorithms:
# bit 0 = Open System Authentication
# bit 1 = Shared Key Authentication (requires WEP)
#auth_algs=3
##### Wi-Fi Protected Setup (WPS) #############################################
eap_server=1
# WPS state
# 0 = WPS disabled (default)
# 1 = WPS enabled, not configured
# 2 = WPS enabled, configured
wps_state=2
uuid=12345678-9abc-def0-1234-56789abcdef0
# Device Name
# User-friendly description of device; up to 32 octets encoded in UTF-8
device_name=RTL8192CU
# Manufacturer
# The manufacturer of the device (up to 64 ASCII characters)
manufacturer=Realtek
# Model Name
# Model of the device (up to 32 ASCII characters)
model_name=RTW_SOFTAP
# Model Number
# Additional device description (up to 32 ASCII characters)
model_number=WLAN_CU
# Serial Number
# Serial number of the device (up to 32 characters)
serial_number=12345
# Primary Device Type
# Used format: --
# categ = Category as an integer value
# OUI = OUI and type octet as a 4-octet hex-encoded value; 0050F204 for
# default WPS OUI
# subcateg = OUI-specific Sub Category as an integer value
# Examples:
# 1-0050F204-1 (Computer / PC)
# 1-0050F204-2 (Computer / Server)
# 5-0050F204-1 (Storage / NAS)
# 6-0050F204-1 (Network Infrastructure / AP)
device_type=6-0050F204-1
# OS Version
# 4-octet operating system version number (hex string)
os_version=01020300
# Config Methods
# List of the supported configuration methods
config_methods=label display push_button keypad
##### default configuration #######################################
driver=rtl871xdrv
beacon_int=100
# Operation mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g,
# ad = IEEE 802.11ad (60 GHz); a/g options are used with IEEE 802.11n, too, to
# specify band)
# Default: IEEE 802.11b
hw_mode=g
ieee80211n=1
wme_enabled=1
ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40+]
max_num_sta=8
部分配置说明
# 设置使用的网卡
interface=wlan0
# 配置热点名称
ssid=MyAPName
# 热点支持的加密类型,
# bit0 = WPA
# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
wpa=2
# 热点加密类型
wpa_key_mgmt=WPA-PSK
# 热点密码
wpa_passphrase=12345678
# 接受的密匙类型
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP TKIP
官方配置文件:http://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf
热点要使用DHCP功能,所以还要配置DHCP配置文件,使用是udhcpd,配置文件在/etc/udhcpd.conf
如果使用静态IP地址也可以不使用DHCP
# Sample udhcpd configuration file (/etc/udhcpd.conf)
# The start and end of the IP lease block
start 192.168.0.150 #default: 192.168.0.20
end 192.168.0.240 #default: 192.168.0.254
# The interface that udhcpd will use
interface wlan0 #default: eth0
# The maximim number of leases (includes addressesd reserved
# by OFFER's, DECLINE's, and ARP conficts
max_leases 21 #default: 254
# If remaining is true (default), udhcpd will store the time
# remaining for each lease in the udhcpd leases file. This is
# for embedded systems that cannot keep time between reboots.
# If you set remaining to no, the absolute time that the lease
# expires at will be stored in the dhcpd.leases file.
#remaining yes #default: yes
# The time period at which udhcpd will write out a dhcpd.leases
# file. If this is 0, udhcpd will never automatically write a
# lease file. (specified in seconds)
#auto_time 7200 #default: 7200 (2 hours)
# The amount of time that an IP will be reserved (leased) for if a
# DHCP decline message is received (seconds).
#decline_time 3600 #default: 3600 (1 hour)
# The amount of time that an IP will be reserved (leased) for if an
# ARP conflct occurs. (seconds
#conflict_time 3600 #default: 3600 (1 hour)
# How long an offered address is reserved (leased) in seconds
#offer_time 60 #default: 60 (1 minute)
# If a lease to be given is below this value, the full lease time is
# instead used (seconds).
#min_lease 60 #defult: 60
# The location of the leases file
#lease_file /var/lib/misc/udhcpd.leases #defualt: /var/lib/misc/udhcpd.leases
# The location of the pid file
#pidfile /var/run/udhcpd.pid #default: /var/run/udhcpd.pid
# Everytime udhcpd writes a leases file, the below script will be called.
# Useful for writing the lease file to flash every few hours.
#notify_file #default: (no script)
#notify_file dumpleases # <--- usefull for debugging
# The following are bootp specific options, setable by udhcpd.
#siaddr 192.168.0.22 #default: 0.0.0.0
#sname zorak #default: (none)
#boot_file /var/nfs_root #default: (none)
# The remainer of options are DHCP options and can be specifed with the
# keyword 'opt' or 'option'. If an option can take multiple items, such
# as the dns option, they can be listed on the same line, or multiple
# lines. The only option with a default is 'lease'.
#Examles
opt dns 116.116.116.116
option subnet 255.255.255.0
opt router 192.168.0.1
#opt wins 192.168.10.10
option dns 129.219.13.81 # appened to above DNS servers for a total of 3
option domain local
option lease 864000 # 10 days of seconds
# Currently supported options, for more info, see options.c
#opt subnet
#opt timezone
#opt router
#opt timesvr
#opt namesvr
#opt dns
#opt logsvr
#opt cookiesvr
#opt lprsvr
#opt bootsize
#opt domain
#opt swapsvr
#opt rootpath
#opt ipttl
#opt mtu
#opt broadcast
#opt wins
#opt lease
#opt ntpsrv
#opt tftp
#opt bootfile
# Static leases map
#static_lease 00:60:08:11:CE:4E 192.168.0.54
#static_lease 00:60:08:11:CE:3E 192.168.0.44
部分参数说明:
# 使用的无线网卡
interface wlan0
# IP池范围
start 192.168.0.100
end 192.168.0.240
# 路由地址
opt router 192.168.0.1
官方配置文件说明:https://udhcp.busybox.net/udhcpd.conf
开始配置热点:
# 启用网卡
ifconfig wlan0 up
# 给无线网卡设置IP地址
ifconfig wlan0 192.168.0.1
# 启动DHCP,必须先设置无线网卡地址,不然启动udhcp会失败
udhcpd /etc/udhcpd.conf
# 启动热点
hostapd /etc/hostapd.conf -B
桥接方式建立热点
配置文件和上面的一样,这里桥接的是以太网卡eth0。
# 设置两个网卡IP为0.0.0.0
ifconfig eth0 0.0.0.0
ifconfig wlan0 0.0.0.0
# 如果网桥已经存在则删除
brctl delbr br0 >/dev/null 2>&1
# 新建网桥br0
brctl addbr br0
# Stop STP(spanning tree protocol, this protocol seems to prevent the network from generating loops, because the self-defined network, there should be no loop, this protocol can be stopped)
brctl stp br0 off
# 添加无线网卡和以太网卡到网桥br0中
brctl addif br0 wlan0
brctl addif br0 eth0
# Set the bridge forwarding delay time
brctl setfd br0 0
# 设置网桥静态IP地址
ifconfig br0 192.168.1.205 netmask 255.255.255.0
# 查看当前网桥配置
brctl show
# 启动hostapd
hostapd /etc/hostapd.conf -B
# 给无线网卡设置IP地址,这个和udhcpd.conf中配置的路由地址一样
ifconfig wlan0 192.168.0.1
# 启动udhcpd, 必须先设置wlan0的IP地址,不然这步会失败
udhcpd /etc/udhcpd.conf
感觉上面有些步骤似乎是多余的,桥接eth0后,连通了eth0的路由,实际上似乎也是使用eth0连接的外部路由的DHCP,arm板上似乎也没必要开DHCP服务。
启动热点后,连接并使用热点可能会有错误br0: received packet on eth0 with own address as source address,看了一下网桥br0和eth0的MAC地址是一样的,估计br0是复制了eth0的MAC地址,这里需要修改eth0的MAC地址,修改br0的MAC地址似乎还是继续报错,修改命令为:
ifconfig eth0 hw ether dc:07:c1:00:ed:BB
尝试了一下,去掉udhcpd部分,修改成如下:
# 设置两个网卡IP为0.0.0.0
ifconfig eth0 0.0.0.0
ifconfig wlan0 0.0.0.0
# 如果网桥已经存在则删除
brctl delbr br0 >/dev/null 2>&1
# 新建网桥br0
brctl addbr br0
# Stop STP(spanning tree protocol, this protocol seems to prevent the network from generating loops, because the self-defined network, there should be no loop, this protocol can be stopped)
brctl stp br0 off
# 添加无线网卡和以太网卡到网桥br0中
brctl addif br0 wlan0
brctl addif br0 eth0
# Set the bridge forwarding delay time
brctl setfd br0 0
# 启用网桥
ifconfig br0 up
# 查看当前网桥配置
brctl show
# 启动hostapd
hostapd /etc/hostapd.conf -B
# 由于没有设置静态IP,这里使用udhcpc更新IP地址和DNS
# -n Exit with failure if lease is not immediately obtained
udhcpc -i br0 -n
完成后使用ifconfig显示的网卡配置为,可以正常连接热点上网
br0 Link encap:Ethernet HWaddr dc:07:c1:00:ed:85
inet addr:192.168.1.62 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1274 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:65848 (64.3 KiB) TX bytes:1590 (1.5 KiB)
eth0 Link encap:Ethernet HWaddr dc:07:c1:00:ed:85
inet6 addr: fe80::de07:c1ff:fe00:ed85/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4801 errors:0 dropped:0 overruns:0 frame:0
TX packets:271 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:395515 (386.2 KiB) TX bytes:44022 (42.9 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:9 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:612 (612.0 B) TX bytes:612 (612.0 B)
wlan0 Link encap:Ethernet HWaddr e8:4e:06:6f:87:dc
inet6 addr: fe80::ea4e:6ff:fe6f:87dc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:240 errors:0 dropped:7 overruns:0 frame:0
TX packets:1113 errors:0 dropped:7 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:183837 (179.5 KiB) TX bytes:161991 (158.1 KiB)
下面是一个arm上的脚本,用于启动wifi热点,原来有个脚本不过有些问题,我修改了一下
#!/bin/sh
# Check that the /etc/udhcpd.conf file exists and can be executed
if [ ! -x /usr/sbin/hostapd ]
then
echo "/usr/sbin/hostapd no exist or can't execute"
exit 0
fi
# check network card wlanX
ifconfig -a|grep wlan > /dev/null
if [[ $? -ne 0 ]]
then
echo no device wlanX
exit 0
fi
# Gets the full name of the wlan and assigns it to wlanx
wlanx=`ifconfig -a|grep wlan|awk '{print $1}'`
if [[ $? -ne 0 ]]
then
echo failed to get device wlanX name
exit 0
fi
# Check that the /etc/hostapd.conf file exists and can be write
if [ ! -w /etc/hostapd.conf ]
then
echo "/etc/hostapd.conf no exist or can't write"
exit 0
fi
# Check that the /etc/udhcpd.conf file exists and can be write
if [ ! -w /etc/udhcpd.conf ]
then
echo "/etc/udhcpd.conf no exist or can't write"
exit 0
fi
# network card configure file: /etc/network/interfaces
#busybox sed -i "s/eth0/br0/g" /etc/network/interfaces
#busybox sed -i "s/auto wlan0/#auto wlan0/g" /etc/network/interfaces
#busybox sed -i "s/iface wlan0 inet dhcp/#iface wlan0 inet dhcp/g" /etc/network/interfaces
# check command
if [ "$1" != "start" -a "$1" != "stop" -a "$1" != "restart" ]
then
echo paramter error.only accept start/stop/restart.
fi
# Close all related programs
if [ "$1" = "stop" -o "$1" = "restart" -o "$1" = "start" ]
then
echo "Stopping the hostapd and udhcpd and wpa_supplicant : "
killall hostapd >/dev/null 2>&1
killall udhcpd >/dev/null 2>&1
killall wpa_supplicant > /dev/null 2>&1
fi
if [ "$1" = "start" -o "$1" = "restart" ]
then
# /etc/hostapd.conf
echo "Starting the hostapd and udhcpd : "
wlan_old=`cat /etc/hostapd.conf|grep '^interface'`
wlan_new="interface="$wlanx
busybox sed -i "s/$wlan_old/$wlan_new/g" /etc/hostapd.conf
# /etc/udhcpd.conf
#wlan_old=`cat /etc/udhcpd.conf|grep '^interface'`
#wlan_new="interface "$wlanx" #default: eth0"
#busybox sed -i "s/$wlan_old/$wlan_new/g" /etc/udhcpd.conf
#start bridge eth0
ifconfig eth0 0.0.0.0
ifconfig $wlanx 0.0.0.0
ifconfig $wlanx up
# Delete possible Bridges
brctl delbr br0 >/dev/null 2>&1
# add new bridge br0
brctl addbr br0
# Stop STP(spanning tree protocol, this protocol seems to prevent the network from generating loops, because the self-defined network, there should be no loop, this protocol can be stopped)
brctl stp br0 off
# Add the port eth0 and the wireless port to the bridge
brctl addif br0 $wlanx
brctl addif br0 eth0
# Set the bridge forwarding delay time
brctl setfd br0 0
# set static ip addr
#ifconfig br0 192.168.1.205 netmask 255.255.255.0
# enabel br0
ifconfig br0 up
# Displays the current bridge configuration
brctl show
# Check the status of network card,Network cable plug status
#ifplugd -I -i eth0 -d 0 -t 0 -r /usr/sbin/auto_bridge.sh
# start hostapd
hostapd /etc/hostapd.conf -B
# set wlan new ip
#ifconfig $wlanx 192.168.0.1
# start udhcpd, must set $wlan static ip addr before start udhcpd
#udhcpd /etc/udhcpd.conf
# get ip from dhcp server
udhcpc -i br0 -n
fi
echo 'wifi ap shell exit'
NAT方式建立热点:
这种方式试的时候失败了,似乎是arm不支持
start NAT
sysctl net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
上面这个命令一直失败,似乎是iptables不支持
下面是一个shell脚本,以NAT方式启动热点,因为不支持,没测试过
#!/bin/sh
# Check that the /etc/udhcpd.conf file exists and can be executed
if [ ! -x /usr/sbin/hostapd ]
then
echo "/usr/sbin/hostapd no exist or can't execute"
exit 0
fi
# check network card wlanX
ifconfig -a|grep wlan > /dev/null
if [[ $? -ne 0 ]]
then
echo no device wlanX
exit 0
fi
# Gets the full name of the wlan and assigns it to wlanx
wlanx=`ifconfig -a|grep wlan|awk '{print $1}'`
if [[ $? -ne 0 ]]
then
echo failed to get device wlanX name
exit 0
fi
# Check that the /etc/hostapd.conf file exists and can be write
if [ ! -w /etc/hostapd.conf ]
then
echo "/etc/hostapd.conf no exist or can't write"
exit 0
fi
# Check that the /etc/udhcpd.conf file exists and can be write
if [ ! -w /etc/udhcpd.conf ]
then
echo "/etc/udhcpd.conf no exist or can't write"
exit 0
fi
# network card configure file: /etc/network/interfaces
#busybox sed -i "s/eth0/br0/g" /etc/network/interfaces
#busybox sed -i "s/auto wlan0/#auto wlan0/g" /etc/network/interfaces
#busybox sed -i "s/iface wlan0 inet dhcp/#iface wlan0 inet dhcp/g" /etc/network/interfaces
# check command
if [ "$1" != "start" -a "$1" != "stop" -a "$1" != "restart" ]
then
echo paramter error.only accept start/stop/restart.
fi
# Close all related programs
if [ "$1" = "stop" -o "$1" = "restart" -o "$1" = "start" ]
then
echo "Stopping the hostapd and udhcpd and wpa_supplicant : "
killall hostapd >/dev/null 2>&1
killall udhcpd >/dev/null 2>&1
killall wpa_supplicant > /dev/null 2>&1
fi
if [ "$1" = "start" -o "$1" = "restart" ]
then
# /etc/hostapd.conf
echo "Starting the hostapd and udhcpd : "
wlan_old=`cat /etc/hostapd.conf|grep '^interface'`
wlan_new="interface="$wlanx
busybox sed -i "s/$wlan_old/$wlan_new/g" /etc/hostapd.conf
# /etc/udhcpd.conf
wlan_old=`cat /etc/udhcpd.conf|grep '^interface'`
wlan_new="interface "$wlanx" #default: eth0"
busybox sed -i "s/$wlan_old/$wlan_new/g" /etc/udhcpd.conf
#start bridge eth0
ifconfig eth0 0.0.0.0
ifconfig $wlanx 0.0.0.0
# Delete possible Bridges
brctl delbr br0 >/dev/null 2>&1
# Check the status of network card,Network cable plug status
#ifplugd -I -i eth0 -d 0 -t 0 -r /usr/sbin/auto_bridge.sh
ifplugd -I -i eth0 -d 0 -t 0 -r `udhcpc -i eth0 -n`
# start hostapd
hostapd /etc/hostapd.conf -B
# set wlan new ip
ifconfig $wlanx 192.168.0.1
# start udhcpd, must set $wlan static ip addr before start udhcpd
udhcpd /etc/udhcpd.conf
# start NAT
sysctl net.ipv4.ip_forward=1
#echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
fi
echo 'wifi ap shell exit'
参考:
http://w1.fi/
http://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf
http://hantianliliang.blog.sohu.com/304891332.html
http://hantianliliang.blog.sohu.com/304879882.html