ubuntu使用ap-hotspot来创建WIFI热点
$ sudo add-apt-repository ppa:nilarimogard/webupd8
$ sudo apt-get update
$ sudo apt-get install ap-hotspot
$ sudo ap-hotspot configure //这一步会检查ubuntu的网络和WIFI接口,确定后会提示你配置热点,输入ssid和密码之类的就行了
$ sudo ap-hotspot start
一般的ubuntu以上过程走完手机可以顺利识别并连接上了。
如果不顺利的话看看下面常见问题是否能够帮到你
TX1使用ap-hotspot来创建WIFI热点
$ sudo add-apt-repository ppa:nilarimogard/webupd8
$ sudo apt-get update
$ sudo apt-get install ap-hotspot
1提示没有ap-hotspot,不要慌,见问题3
2卡在 Starting Wireless Hotspot,不要慌,见问题2
sudo ./ap-hotspot.sh start
3一切正常就是搜不到wifi
这是因为tx1的网卡模式不对,解决办法
echo 2 > /sys/module/bcmdhd/parameters/op_mode
或者
将下面这一行加到 /etc/modprobe.d/bcmdhd.conf:
options bcmdhd op_mode=2
重新执行,你就会搜到wifi啦
sudo ./ap-hotspot.sh start
这是因为tx1的加解密又问题,编辑/etc/ap-hotspot.conf,不要使用加密模式将以下几行注释掉不需要密码就可以了
#wpa=2
#wpa_passphrase=qwerty0987
#wpa_key_mgmt=WPA-PSK
#wpa_pairwise=TKIP
#rsn_pairwise=CCMP
再重start就好了,可以连上了
常用命令
start start wireless hotspot//开始使用
stop stop wireless hotspot//停止使用
restart restart wireless hotspot//重启
configure configure hotspot//配置使用
常见问题
1、无法出现Wireless Hotspot active,并一直保持Starting Wireless Hotspot…
先移除hostapd
sudo apt-get remove hostapd
64 位ubuntu使用以下方式
cd /tmp
wget http://old-releases.ubuntu.com/ubuntu/pool/universe/w/wpa/hostapd_1.0-3ubuntu2.1_amd64.deb
sudo dpkg -i hostapd*.deb
sudo apt-mark hold hostapd
“sudo apt-mark hold hostapd” 将防止版本升级到有问题的版本。
再重新安装ap-hotspot
sudo apt-get install ap-hotspot
2、出现Another process is already running
sudo rm /tmp/hotspot.pid
3、ubuntu16、tx1等apt-get安装不了ap-hotspot
不要慌,源码在这里https://github.com/hotice/AP-Hotspot,给予可执行权限
chmod +x ap-hotspot.sh
sudo ./ap-host.sh configure
sudo ./ap-host.sh start
ap-hotspot.sh如下
#!/bin/bash
# Global variables
logfile="/tmp/hostapd.log"
pidfile="/tmp/hotspot.pid"
hotspotconfig="/etc/ap-hotspot.conf"
dnsmasqconfig="/etc/dnsmasq.d/ap-hotspot.rules"
user=$(who | awk '{print $1}' | sed '/^root$/d' | uniq)
WMPID=$(ps -u $user | tail -n 1 | awk '{print $1}')
DBUS=$(egrep -z 'DBUS_SESSION_BUS_ADDRESS|DISPLAY' /proc/${WMPID}/environ | sed -r -e 's/(.)DBUS_/\1 DBUS_/' -e 's/(.)DISPLAY/\1 DISPLAY/')
if command -v service > /dev/null; then
UPSTART_EXISTS="yes"
else
UPSTART_EXISTS=
fi
if command -v route > /dev/null; then
IFCONFIG_EXISTS="yes"
else
IFCONFIG_EXISTS=
fi
show_msg() {
echo -e "$@"
}
show_info() {
echo -e "\033[1;34m$@\033[0m"
}
show_warn() {
echo -e "\033[1;33m$@\033[0m"
}
show_err() {
echo -e "\033[1;31m$@\033[0m" 1>&2
}
show_debug() {
while read input; do
[[ "$debug" == "true" ]] && echo -e "$input"
done
}
show_notify() {
su $user -s /bin/bash -c "${DBUS} notify-send -h int:transient:1 -i \"network-wireless\" \"$@\""
}
check_root() {
# Check if user is root
if [[ ! $(whoami) = "root" ]]; then
show_err "Please run the script as root"
exit 1
fi
}
check_supported() {
# Check if the wireless card supports Access Point mode. This script won't work if it doesn't support it
if [[ ! $(iw list 2>&1 | grep -A6 "Supported interface modes" | grep AP$) ]]; then
show_err "Your wireless card or driver does not support Access Point mode"
exit 1
fi
}
check_network() {
# Check if Wireless is disabled
if [[ $(iwconfig "$INTERFACE_WLAN" 2>&1 | grep "Tx-Power=off") ]]; then
show_err "WiFi is disabled,please enable WiFi before running this script"
exit 1
# Check if Wireless is enabled,but connected to a network
elif [[ ! $(iwconfig "$INTERFACE_WLAN" 2>&1 | grep "ESSID:off/any") && $(iwconfig "$INTERFACE_WLAN" 2>&1 | grep "ESSID:") ]]; then
show_err "Please disconnect WiFi before proceeding"
exit 1
fi
}
check_connected() {
# Monitor logfile for connected devices
lines_con="0"
lines_dis="0"
while [[ -f "$logfile" ]]; do
if [[ "$lines_con" < $(grep -c "AP-STA-CONNECTED" "$logfile") ]]; then
show_notify "New device connected to Hotspot"
(( lines_con++ ))
elif [[ "$lines_dis" < $(grep -c "AP-STA-DISCONNECTED" "$logfile") ]]; then
show_notify "Device disconnected from Hotspot"
(( lines_dis++ ))
fi
sleep 5
done
}
configure() {
# Check root
check_root
# Check supported
check_supported
# Reset config
rm -f "$hotspotconfig"
rm -f "$dnsmasqconfig"
# Detect configuration
show_msg "Detecting configuration..."
#Figuring out Default Interent Interface
if command -v route > /dev/null; then
INTERFACE_NET=$(route | grep -iw "default" | awk '{print $NF}')
elif command -v ip > /dev/null; then
INTERFACE_NET=$(ip route | grep -iw "default" | awk '{print $5}')
fi
#Figuring out Wireless Interface
if command -v iwconfig > /dev/null; then #Checking presence of iwconfig
INTERFACE_WLAN=$(iwconfig 2>&1 | grep "^wlan" | sed -e 's/ .*//g' | tail -n 1) #Assuming interface uses old wlan convention
if [[ ! $INTERFACE_WLAN ]]; then
INTERFACE_WLAN=$(iwconfig 2>&1 | grep "^wlp" | sed -e 's/ .*//g' | tail -n 1) #Assuming interface uses new wlp convention
fi
elif command -v iw > /dev/null; then
INTERFACE_WLAN=$(iw dev 2>&1 | grep "wlan" | awk '{print $2}' | tail -n 1)
if [[ ! $INTERFACE_WLAN ]]; then
INTERFACE_WLAN=$(iwconfig 2>&1 | grep "^wlp" | sed -e 's/ .*//g' | tail -n 1)
fi
fi
SSID="myhotspot"
WPAPASS="qwerty0987"
# Network interface connected to the Internet
if [[ ! $INTERFACE_NET ]]; then
show_warn "Failed to detect the network interface connected to the Internet. Please enter your network interface (e.g.- eth1):"
else
show_msg "Detected $INTERFACE_NET as the network interface connected to the Internet. Press ENTER if this is correct or enter the desired interface below (e.g.- eth0,ppp0 etc.):"
fi
read interface_net
[[ "$interface_net" ]] && INTERFACE_NET="$interface_net"
# WiFi interface
if [[ ! $INTERFACE_WLAN ]]; then
show_warn "Failed to detect the WiFi interface. Please enter your WiFi interface (e.g.- wlan0):"
else
show_msg "Detected $INTERFACE_WLAN as your WiFi interface. Press ENTER if this is correct or enter the desired interface (e.g.- wlan1):"
fi
read interface_wlan
[[ "$interface_wlan" ]] && INTERFACE_WLAN="$interface_wlan"
# Hotspot SSID
show_msg "Enter the desired Access Point name or press ENTER to use the default one ($SSID):"
read ssid
[[ "$ssid" ]] && SSID="$ssid"
# WPA Passphrase
show_msg "Enter the desired WPA Passphrase below or press ENTER to use the default one ($WPAPASS):"
read wpapass
[[ "$wpapass" ]] && WPAPASS="$wpapass"
# Write the hostapd config file
cat <<EOF | tee "$hotspotconfig" > /dev/null 2>&1
# WiFi Hotspot
interface=$INTERFACE_WLAN
driver=nl80211
#Access Point
ssid=$SSID
hw_mode=g
# WiFi Channel:
channel=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=$WPAPASS
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF
# Add the required bits to the dnsmasq config file
if [[ ! $(grep "Bind to only one interface" "$dnsmasqconfig" > /dev/null 2>&1) ]]; then
cat <<EOF | tee "$dnsmasqconfig" > /dev/null 2>&1
# Bind to only one interface
bind-interfaces
# Choose interface for binding
interface=$INTERFACE_WLAN
# Specify range of IP addresses for DHCP leases
dhcp-range=192.168.150.2,192.168.150.10,12h
#INTERFACE_NET=$INTERFACE_NET
EOF
chmod +x "$dnsmasqconfig"
fi
}
get_vars() {
# Run Configuration Wizard if config files don't exist
[[ ! -f "$hotspotconfig" || ! -f "$dnsmasqconfig" ]] && configure
# Get $INTERFACE_NET and $INTERFACE_WLAN from the config files
INTERFACE_WLAN=$(grep "interface" "$hotspotconfig" | sed -e 's/interface=//g')
INTERFACE_NET=$(grep "INTERFACE_NET" "$dnsmasqconfig" | sed -e 's/#INTERFACE_NET=//g')
}
start() {
# Check prevIoUs process
if [[ -f "$pidfile" ]]; then
show_err "Another process is already running"
exit 1
fi
# Check root
check_root
# Check supported
check_supported
# Get variables
get_vars
# Check network
check_network
# Write the PID to a file
echo "$$" > "$pidfile"
show_info "Starting Wireless Hotspot..."
# Set up the services
if [[ $UPSTART_EXISTS ]]; then
service hostapd stop 2>&1 | show_debug
service dnsmasq stop 2>&1 | show_debug
update-rc.d hostapd disable 2>&1 | show_debug
update-rc.d dnsmasq disable 2>&1 | show_debug
else
systemctl stop hostapd 2>&1 | show_debug
systemctl stop dnsmasq 2>&1 | show_debug
systemctl disable hostapd 2>&1 | show_debug
systemctl disable dnsmasq 2>&1 | show_debug
fi
# Configure IP address for WLAN
if [[ $IFCONFIG_EXISTS ]]; then
ifconfig "$INTERFACE_WLAN" 192.168.150.1 2>&1 | show_debug
else #using ip command
ip addr flush dev "$INTERFACE_WLAN" 2>&1 | show_debug
ip addr add 192.168.150.1 dev "$INTERFACE_WLAN" 2>&1 | show_debug
fi
# Start DHCP/DNS server
if [[ $UPSTART_EXISTS ]]; then
service dnsmasq restart 2>&1 | show_debug
else
systemctl restart dnsmasq 2>&1 | show_debug
fi
# Enable routing
sysctl net.ipv4.ip_forward=1 2>&1 | show_debug
# Enable NAT
iptables -t nat -A POSTROUTING -o "$INTERFACE_NET" -j MASQUERADE 2>&1 | show_debug
# Run access point daemon
if [[ $(hostapd --help 2>&1 | grep "\-f") ]]; then
rm -f "$logfile"
touch "$logfile"
hostapd -B "$hotspotconfig" -f "$logfile"
while :
do
[[ $(grep "Using interface" "$logfile") ]] && show_info "Wireless Hotspot active" && show_notify "Wireless Hotspot active" && break
sleep 5
done
check_connected 2>&1 &
disown
else
hostapd -B "$hotspotconfig" 2>&1 | show_debug
show_info "Wireless Hotspot active"
fi
}
stop() {
# Check root
check_root
# Get variables
get_vars
# Kill process
show_info "Stopping Wireless Hotspot..."
if [[ -f "$pidfile" ]]; then
pid=$(cat "$pidfile")
rm -f "$pidfile"
[[ $(grep -s "ap-hotspot" "/proc/$pid/cmdline") ]] && kill -9 "$pid"
fi
# Delete log
rm -f "$logfile"
# Disable NAT
iptables -D POSTROUTING -t nat -o "$INTERFACE_NET" -j MASQUERADE 2>&1 | show_debug
# Disable routing
sysctl net.ipv4.ip_forward=0 2>&1 | show_debug
# Set up the services
service hostapd stop 2>&1 | show_debug
service dnsmasq stop 2>&1 | show_debug
# Restart WiFi and disable newly created mon.WLAN network
if [[ $IFCONFIG_EXISTS ]]; then
if [[ ! -z $(ifconfig | grep "mon.$INTERFACE_WLAN") ]]; then
# Check if the hotspot is active
ifconfig "mon.$INTERFACE_WLAN" down
fi
ifconfig "$INTERFACE_WLAN" down
ifconfig "$INTERFACE_WLAN" up
else #Using ip command
if [[ ! -z $(ip addr | grep "mon.$INTERFACE_WLAN") ]]; then
# Check if the hotspot is active
ip link set "mon.$INTERFACE_WLAN" down
fi
ip link set "$INTERFACE_WLAN" down
ip link set "$INTERFACE_WLAN" up
fi
}
restart() {
show_info "Restarting Wireless Hotspot..."
stop
start
}
case "$1" in
start)
start;;
stop)
stop;;
restart)
restart;;
configure)
configure;;
debug)
debug="true"
start;;
*)
args=( "start" "stop" "restart" "configure" "debug" )
desc=( "start wireless hotspot" "stop wireless hotspot" "restart wireless hotspot" "configure hotspot" "start with detailed messages" )
echo -e "Usage:\tap-hotspot [argument]\n"
for ((i=0; i < ${#args[@]}; i++)); do
printf "\t%-15s%-s\n" "${args[i]}" "${desc[i]}"
done
exit;;
esac