Как использовать Wi-Fi и точку доступа одновременно на Android?

Можно ли создать точку доступа Wi-Fi с устройства Android, используя его соединение Wi-Fi, а не данные сотовой связи?

Без помощи какого-либо стороннего приложения (например, Netshare), изменив какой-либо код в настройках приложения?

Примечание.
У меня AOSP 7.0, поэтому вопрос о корневом устройстве не стоит.

Это связано с AOSP7, который довольно старый. В Android 11 на моем Pixel 3A и моем Pixel 5 поддерживается одновременное подключение к мобильным данным с использованием Wi-Fi и передача точки доступа по маршруту по умолчанию.

Ответы (3)

РЕЖИМ ПОВТОРИТЕЛЯ WI-FI НА ANDROID

Я не знаю какого-либо простого инструмента, кроме приложений для Android (которые используют Wi-Fi Direct), которые позволили бы одновременно использовать Wi-Fi и точку доступа. Также это не стандартная функция, представленная в пользовательских ПЗУ до сих пор (AFAIK). Однако вы можете сделать это вручную, если вам удобно использовать командную строку. Но это НЕ возможно без рута.

ЧТО НУЖНО

  • Устройство с root-доступом
  • Устройство должно поддерживать драйвер nl80211

    Все новые устройства с чипсетом Qualcomm MSM поддерживают этот AFAIK, например, Xiaomi Redmi Note 4 (mido), построенный на MSM8953 .

    Ядро также должно поддерживать этот драйвер. Подтвердить:

    ~# zcat /proc/config.gz | grep CONFIG_CFG80211
    CONFIG_CFG80211=y
    
    ~# lshw | grep wireless=
           configuration: broadcast=yes driver=wcnss_wlan multicast=yes wireless=Qcom:802.11n
    
  • Устройство должно поддерживать managedрежим и APрежим одновременно.

    ~# iw phy | grep -iA2 'valid interface combinations'
            valid interface combinations:
             * #{ managed } <= 3, #{ IBSS, AP } <= 1, #{ P2P-client, P2P-GO } <= 1,
               total <= 3, #channels <= 1
    

    Это означает, что ваш беспроводной чип поддерживает создание не более 3 интерфейсов, один из которых может быть в APрежиме, а другие в режиме managedили , и поддерживается P2Pне более 1 канала . Если значение канала равно 2, вы можете использовать оба интерфейса на разных каналах. Однако рекомендуется использовать один и тот же канал, чтобы избежать помех.

    Стандартный интерфейс wi-fi на Android-устройствах (обычно wlan0) всегда работает в managedрежиме. Мы собираемся создать виртуальный беспроводной интерфейс, который будет работать в APрежиме.

  • Инструменты Linux: iw, ip, iptables, hostapd, и dnsmasqт.д.

    Вы также можете использовать wpa_supplicantвместо hostapdс немного другой конфигурацией.

    Обычно эти бинарники идут в комплекте с Android. Однако Google и поставщики внесли модификации, чтобы эти инструменты соответствовали потребностям Android. Поэтому они могут не вести себя как стандартные инструменты Linux, и в редких случаях вам может потребоваться скомпилировать их из исходного кода.

    Беспроводные инструменты должны быть достаточно новыми, чтобы иметь поддержку драйвера nl80211.

  • Эмулятор терминала (хороший Termux)

ШАГИ:

Для простоты использования я суммировал все шаги в сценарии оболочки с краткими пояснениями. Вы можете поместить это в свой $PATH, например, /system/bin/android_apи выполнить его напрямую: ~# android_ap start. Пользовательская плитка быстрых настроек также может быть создана для простоты использования.

#!/system/bin/sh
set -e
#set -x

[ "$(id -u)" != 0 ] && echo 'Not running as root!' && exit

SSID=MyAP                           # set this to your desired string (avoid spaces and non-ascii characters)
PASSCODE=foobarfoobar               # set this to your desired string (8 to 63 characters)
WIFI_INTERFACE=wlan0                # set this according to your device (lshw | grep -A10 Wireless | grep 'logical name')
SUBNET=192.168.42                   # must be different than WIFI_INTERFACE
AP_INTERFACE=${WIFI_INTERFACE}-AP
IP=${SUBNET}.1
DIR=/data/local/tmp/$AP_INTERFACE

USAGE()
{
    echo 'Usage:'
    printf '\t%s\n' "$(basename "$0") start|stop"
    exit
}

STOP() {
    # hope there are no other instances of same daemons
    pkill -15 hostapd dnsmasq
    # remove iptables rules
    iptables -D INPUT -i $AP_INTERFACE -p udp -m udp --dport 67 -j ACCEPT
    iptables -t nat -D POSTROUTING -s ${SUBNET}.0/24 ! -o $AP_INTERFACE -j MASQUERADE
    iptables -D FORWARD -i $AP_INTERFACE -s ${IP}/24 -j ACCEPT
    iptables -D FORWARD -i $WIFI_INTERFACE -d ${SUBNET}.0/24 -j ACCEPT
    # delete AP interface
    ip link show | grep "${AP_INTERFACE}:" && iw $AP_INTERFACE del
    rm -rf $DIR
} >/dev/null 2>&1

CHECKS()
{
    for binary in iw ip iptables hostapd dnsmasq; do
        which $binary >/dev/null && continue
        exit
    done

    # this check is necessary if need to use single channel
    if iw dev $WIFI_INTERFACE link | grep -q '^Not connected'
    then
        echo 'First connect to Wi-Fi for internet sharing.'
        exit
    fi

    if ! iw phy | grep -iqE '{.*managed.*AP.*}' && ! iw phy | grep -iqE '{.*AP.*managed.*}'
    then
        echo 'AP mode not supported.'
        exit
    fi
}

CREATE_AP()
{
    if ! iw dev $WIFI_INTERFACE interface add $AP_INTERFACE type __ap
    then
        echo "Couldn't create AP."  # :(
        exit
    fi
}

FIND_CHANNEL()
{
    # find what channel wi-fi is using
    CHANNEL="$(iw $WIFI_INTERFACE scan | grep -C5 "$(iw $WIFI_INTERFACE link | grep SSID | cut -d: -f2-)" | grep -i channel | tail -c3)"
    if [ -z "$CHANNEL" ]
    then
        echo  "Couldn't find channel info. Are you are connected to Wi-Fi?"
        STOP
        exit
    fi

    # if more than 1 channels are supported, use any frequency
    [ ! -z "$CHANNEL" ] || CHANNEL=11
}

ADD_IP_ROUTE()
{
    # activate the interface and add IP
    ip link set up dev $AP_INTERFACE
    ip addr add ${IP}/24 broadcast ${SUBNET}.255 dev $AP_INTERFACE

    # routing table 97 needs to be put necessarily on Android
    # because in main table, route for $WIFI_INTERFACE takes priority (ip route show)
    # and all traffic goes there ignoring $AP_INTERFACE
    ip route add ${SUBNET}.0/24 dev $AP_INTERFACE table 97
}

HOSTAPD_CONFIG()
{
    mkdir -p "$DIR"
    cat <<-EOF >$DIR/hostapd.conf
        # network name
        ssid=$SSID
        # network interface to listen on
        interface=$AP_INTERFACE
        # wi-fi driver
        driver=nl80211
        # WLAN channel to use
        channel=$CHANNEL
        # ser operation mode, what frequency to use
        hw_mode=g
        # enforce Wireless Protected Access (WPA)
        wpa=2
        # passphrase to use for protected access
        wpa_passphrase=$PASSCODE
        # WPA protocol
        wpa_key_mgmt=WPA-PSK
    EOF

    # you can tune other parameters such as mtu, beacon_int, ieee80211n, wowlan_triggers (if supported)
    # for better performace and options such as *_pairwise for better security
}

INTERNET_SHARE()
{
    # allow IP forwarding
    echo 1 >/proc/sys/net/ipv4/ip_forward
    # route and allow forwrding through firewall
    iptables -t nat -I POSTROUTING -s ${SUBNET}.0/24 ! -o $AP_INTERFACE -j MASQUERADE
    iptables -I FORWARD -i $AP_INTERFACE -s ${IP}/24 -j ACCEPT
    iptables -I FORWARD -i $WIFI_INTERFACE -d ${SUBNET}.0/24 -j ACCEPT
}

DHCP_SERVER()
{
    # configuration
    cat <<-EOF >$DIR/dnsmasq.conf
        # we dont want DNS server, only DHCP
        port=0
        # only listen on AP interface
        interface=$AP_INTERFACE
        listen-address=$IP

        #bind-interfaces

        # range of IPs to make available to wlan devices andwhen to renew IP
        dhcp-range=$IP,${SUBNET}.254,24h
        # where to save leases
        dhcp-leasefile=$DIR/dnsmasq.leases
        # set default gateway
        dhcp-option-force=option:router,$IP
        # add OpenDNS servers for DNS lookup to announce
        dhcp-option-force=option:dns-server,208.67.220.220,208.67.222.222

        #dhcp-option-force=option:mtu,1500

        # respond to a client who is requesting from a different IP broadcast subnet
        # or requesting an out of range / occupied IP
        # or requesting an IP from expired lease of previous sessions
        # or obtained from some other server which is offline now
        dhcp-authoritative
        # don't look for any hosts file and resolv file
        no-hosts
        no-resolv
    EOF

    # open listening port
    iptables -I INPUT -i $AP_INTERFACE -p udp -m udp --dport 67 -j ACCEPT

    # start dhcp server
    dnsmasq -C $DIR/dnsmasq.conf
}

if [ "$1" = stop ]
then
    STOP || true
    exit
fi

[ "$1" = start ] || USAGE

# basic check
CHECKS
# stop running instances
STOP || true
# create virtual wireless interface
CREATE_AP
# find channed already used ny wi-fi
FIND_CHANNEL
# configre newly created interface
ADD_IP_ROUTE
# configure acces point daemon
HOSTAPD_CONFIG
# start hostapd
hostapd -B $DIR/hostapd.conf
# share internet from Wi-Fi to AP
INTERNET_SHARE
# run a dhcp server to assign IP's dynamically
# otherwise assign a static IP to connected device in subnet range (2 to 254)
DHCP_SERVER

echo Done.

ИСТОЧНИКИ:

Очень интересно, попробую это на моем мидо, я заметил, что пользовательское приложение быстрых настроек по предоставленной ссылке не бесплатное, любой бесплатный аналогичный инструмент для достижения того же, кстати, спасибо!
@xavier_fakerat У меня есть собственное приложение для плиток и отправки уведомлений из командной строки, но оно не очень красиво оформлено для публичного выпуска. Я когда-нибудь получу немного времени.
Я попытался выполнить скрипт, и он говорит «неизвестный вариант» все, что мне не хватает. Запустив Android 9 на Redmi Note 4, можно ли получить скрипт как модуль magisk?
@xavier_fakerat раскомментируйте set -xи посмотрите, какая команда выдает ошибку. // Да, ты можешь. Но я этого не сделал. Я предпочитаю initуслуги.

В Google Play есть приложение под названием VPN Hopspot — Tethering/Wi-Fi Repeater , оно открыто на GitHub здесь . Должен работать на самых последних устройствах Android на базе Snapdragon SoC (требуется рут).

Отказ от ответственности: я не связан с этим приложением.

Спасибо, что упомянули об этом. Просто чтобы уточнить, приложение захватывает Wi-Fi, чтобы транслировать второй SSID, но это работает.
Приложение точки доступа VPN также поддерживает использование точки доступа Wi-Fi из другой сети Wi-Fi, по сути, в режиме повторителя, но без прямых ограничений Wi-Fi. Мне пришлось отключить аппаратное ускорение, чтобы заставить его работать, но я не вижу снижения скорости. Я получаю загрузку со скоростью 80 Мбит / с через клиентский телефон телефона с корневым ретранслятором без аппаратного ускорения телефона с точкой доступа 200 Мбит / с без root.

Вы не можете просто сделать это без рута. Но вы можете использовать модем USB и BlueTooth, используя сеть Wi-Fi. Я бы предложил использовать модем BlueTooth, если вы хотите поделиться Интернетом на других телефонах, потому что делать все это, чтобы одновременно использовать Wi-Fi и точку доступа, беспорядок.

Я использую Xiaomi Redmi Note 6 Pro. Он может включать Wi-Fi и HotSpot одновременно, без рута.