¿Cómo usar Wi-Fi y punto de acceso al mismo tiempo en Android?

¿Es posible crear un punto de acceso Wi-Fi desde un dispositivo Android usando su conexión Wi-Fi en lugar de datos móviles?

¿Sin la ayuda de ninguna aplicación de terceros (como Netshare), cambiando algún código en la configuración de la aplicación?

Nota:
tengo AOSP 7.0, por lo que no hay dudas sobre el dispositivo raíz.

Esto está relacionado con AOSP7, que es bastante antiguo. En Android 11 en mi Pixel 3A y mi Pixel 5, ambos admiten la conexión a datos móviles mediante Wi-Fi y el punto de acceso de transmisión de la ruta predeterminada, al mismo tiempo.

Respuestas (3)

MODO REPETIDOR WI-FI EN ANDROID

No conozco ninguna herramienta sencilla que no sean las aplicaciones de Android (que usan Wi-Fi Direct) que permitan usar wi-fi y punto de acceso al mismo tiempo. Tampoco es una característica estándar introducida en las ROM personalizadas hasta ahora (AFAIK). Sin embargo, puede hacerlo manualmente si se siente cómodo con el uso de la línea de comandos. Pero NO es posible sin root.

QUE SE NECESITA

  • Dispositivo rooteado
  • El dispositivo debe ser compatible con el controlador nl80211

    Todos los dispositivos más nuevos con chipset Qualcomm MSM son compatibles con este AFAIK, por ejemplo, Redmi Note 4 (mido) de Xiaomi construido con MSM8953 .

    El núcleo también debe ser compatible con este controlador. Para confirmar:

    ~# 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
    
  • El dispositivo debe admitir managedmodo y APmodo al mismo tiempo.

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

    Esto significa que su chip inalámbrico admite la creación de un máximo de 3 interfaces, una de las cuales puede estar en APmodo, mientras que otras pueden estar en modo managedo P2P, y se admite un máximo de 1 canal . Si el valor de los canales es 2, puede operar ambas interfaces en diferentes canales. Sin embargo, se recomienda utilizar el mismo canal para evitar interferencias.

    La interfaz Wi-Fi estándar en dispositivos Android (generalmente wlan0) siempre se ejecuta en managedmodo. Vamos a crear una interfaz inalámbrica virtual para que se ejecute en APmodo.

  • Herramientas Linux: iw, ip, iptables, hostapd, dnsmasqetc.

    También puede usar wpa_supplicanten lugar de hostapdcon una configuración ligeramente diferente.

    Por lo general, estos archivos binarios vienen incluidos con Android. Sin embargo, hay modificaciones por parte de Google y los proveedores para que estas herramientas se ajusten a las necesidades de Android. Por lo tanto, es posible que no se comporten como herramientas estándar de Linux y, en casos excepcionales, es posible que deba compilarlos desde la fuente.

    Las herramientas inalámbricas deberían ser lo suficientemente nuevas como para admitir el controlador nl80211.

  • Emulador de terminal (Termux es bueno)

PASOS:

Para facilitar el uso, he resumido todos los pasos en un script de shell con una breve explicación. Puede poner esto en su $PATH, por ejemplo, /system/bin/android_apy ejecutarlo directamente: ~# android_ap start. También se puede crear un mosaico de configuración rápida personalizado para facilitar su uso.

#!/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.

FUENTES:

Muy interesante, probaré esto en mi mido, noté que la aplicación de configuración rápida personalizada en el enlace proporcionado no es gratuita, cualquier herramienta similar gratuita para lograr lo mismo, ¡gracias por cierto!
@xavier_fakerat Tengo mi propia aplicación para mosaicos y envío de notificaciones desde la línea de comandos, pero no está muy bien terminada para publicarla. Lo haré una vez que tenga algo de tiempo.
Traté de ejecutar el script y dice "opción desconocida" todo lo que me falta. Con Android 9 en Redmi Note 4, ¿es posible obtener el script como módulo magisk?
@xavier_fakerat elimine el comentario set -xy vea qué comando arroja el error. // Sí tu puedes. Pero no lo he hecho. Prefiero initlos servicios.

Hay una aplicación llamada VPN Hopspot - Tethering/Wi-Fi repeater en Google Play, es de código abierto en GitHub aquí . Debería funcionar en los dispositivos Android más recientes con Snapdragon SoC (se requiere root).

Descargo de responsabilidad: no estoy afiliado a esta aplicación.

Gracias por mencionarlo. Solo para aclarar, la aplicación secuestra Wi-Fi directo para transmitir un segundo SSID, pero funciona.
La aplicación de punto de acceso VPN también admite el uso de un punto de acceso Wi-Fi de otra red Wi-Fi, esencialmente en modo repetidor pero sin restricciones directas de Wi-Fi. Tuve que desactivar la aceleración de hardware para que funcionara, pero no veo una reducción de velocidad. Obtengo una descarga de 80 Mbps, a través de un teléfono cliente de un teléfono repetidor rooteado no acelerado por hardware de un teléfono hotspot de 200 Mbps no rooteado.

No puedes simplemente hacerlo sin root. Pero puede usar la conexión USB y BlueTooth usando una red Wi-Fi. Sugeriría usar el anclaje de BlueTooth si desea compartir Internet en otros teléfonos porque es un desastre hacer todo eso para usar Wi-Fi y punto de acceso al mismo tiempo.

Estoy usando Xiaomi Redmi Note 6 Pro. Puede convertir WiFi y HotSpot al mismo tiempo, sin root.