天天看点

Ubuntu下配置AP热点(TX1配置热点)

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
           

4连接wifi提示密码错误,多试几次提示无法加入

这是因为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-ubuntu2_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  | 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 "[email protected]"
}

show_info() {
echo -e "\033[1;34m[email protected]\033[0m"
}

show_warn() {
echo -e "\033[1;33m[email protected]\033[0m"
}

show_err() {
echo -e "\033[1;31m[email protected]\033[0m" >&
}

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\" \"[email protected]\""
}

check_root() {
# Check if user is root
if [[ ! $(whoami) = "root" ]]; then
    show_err "Please run the script as root"
    exit 
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 >& | grep -A6 "Supported interface modes" | grep AP$) ]]; then
    show_err "Your wireless card or driver does not support Access Point mode"
    exit 
fi
}

check_network() {
# Check if Wireless is disabled
if [[ $(iwconfig "$INTERFACE_WLAN" >& | grep "Tx-Power=off") ]]; then
    show_err "WiFi is disabled, please enable WiFi before running this script"
    exit 
# Check if Wireless is enabled, but connected to a network
elif [[ ! $(iwconfig "$INTERFACE_WLAN" >& | grep "ESSID:off/any") && $(iwconfig "$INTERFACE_WLAN" >& | grep "ESSID:") ]]; then
    show_err "Please disconnect WiFi before proceeding"
    exit 
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 
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 >& | grep "^wlan" | sed -e 's/ .*//g' | tail -n ) #Assuming interface uses old wlan convention
    if [[ ! $INTERFACE_WLAN ]]; then
        INTERFACE_WLAN=$(iwconfig >& | grep "^wlp" | sed -e 's/ .*//g' | tail -n )  #Assuming interface uses new wlp convention
    fi
elif command -v iw > /dev/null; then
    INTERFACE_WLAN=$(iw dev >& | grep "wlan" | awk '{print $2}' | tail -n )
    if [[ ! $INTERFACE_WLAN ]]; then
        INTERFACE_WLAN=$(iwconfig >& | grep "^wlp" | sed -e 's/ .*//g' | tail -n )
    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 >&
# WiFi Hotspot
interhljs-variable">$INTERFACE_WLAN
driver=nl80211
#Access Point
ssid=$SSID
hw_mode=g
# WiFi Channel:
channel=
macaddr_acl=
auth_algs=
ignore_broadcast_ssid=
wpa=
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 >&) ]]; then
cat <<EOF | tee "$dnsmasqconfig" > /dev/null >&
# Bind to only one interface
bind-interfaces
# Choose interface for binding
interhljs-variable">$INTERFACE_WLAN
# Specify range of IP addresses for DHCP leases
dhcp-range=.,.,h
#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/inter)
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 
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 >& | show_debug
    service dnsmasq stop >& | show_debug
    update-rc.d hostapd disable >& | show_debug
    update-rc.d dnsmasq disable >& | show_debug
else
    systemctl stop hostapd >& | show_debug
    systemctl stop dnsmasq >& | show_debug
    systemctl disable hostapd >& | show_debug
    systemctl disable dnsmasq >& | show_debug
fi
# Configure IP address for WLAN
if [[ $IFCONFIG_EXISTS ]]; then
    ifconfig "$INTERFACE_WLAN" . >& | show_debug
else #using ip command
    ip addr flush dev "$INTERFACE_WLAN" >& | show_debug
    ip addr add . dev "$INTERFACE_WLAN" >& | show_debug
fi
# Start DHCP/DNS server
if [[ $UPSTART_EXISTS ]]; then
    service dnsmasq restart >& | show_debug
else
    systemctl restart dnsmasq >& | show_debug
fi
# Enable routing
sysctl net.ipv4.ip_forward= >& | show_debug
# Enable NAT
iptables -t nat -A POSTROUTING -o "$INTERFACE_NET" -j MASQUERADE >& | show_debug
# Run access point daemon
if [[ $(hostapd --help >& | 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 
    done
    check_connected >& &
    disown
else    
    hostapd -B "$hotspotconfig" >& | 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 - "$pid"
fi
# Delete log
rm -f "$logfile"
# Disable NAT
iptables -D POSTROUTING -t nat -o "$INTERFACE_NET" -j MASQUERADE >& | show_debug
# Disable routing
sysctl net.ipv4.ip_forward= >& | show_debug
# Set up the services
service hostapd stop >& | show_debug
service dnsmasq stop >& | 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=; i < ${#args[@]}; i++)); do
                printf "\t%-15s%-s\n" "${args[i]}" "${desc[i]}"
            done
            exit;;
esac
           

继续阅读