5 votos

La configuración del tiempo de espera del hotspot Wi-Fi ha desaparecido en Nougat 7.0 , 7.1, pero el tiempo de espera no ha

Acabo de recibir un nuevo teléfono Android 7.0 Nougat , y la única queja importante hasta ahora es desaparición de la configuración de tiempo de espera de Wi-Fi-hotspot .

Este es probablemente el mismo problema que : https://Android.stackexchange.com/questions/168549/hotspot-timeout-setting-gone-in-7-1-nougat pero empezó con la 7.0, no con la 7.1, y como nadie ha respondido a esa pregunta, pensé que podría intentarlo.

El Hotspot parece que se apaga después de 1-2 minutos de inactividad, creo que que el dispositivo entra en reposo, lo que me obliga a reiniciar ISC dhclient & wpa_supplicant manualmente para volver a conectarse.

El Hotspot se apaga por inactividad mucho antes de que expire el contrato de arrendamiento DHCP que ha dado expira.

Tengo activada la configuración avanzada de WiFi 'Activado durante el reposo ( SIEMPRE )'. Pero no necesito habilitar el WiFi para habilitar el WiFi-Hotspot (IP Tethering sobre WiFi, actuando como Punto de Acceso para mi portátil), así que No veo muchos ajustes de WiFi, y no sé si algún ajuste de WiFi tendría efecto si el WiFi está desactivado. Pensé que uno permite WiFi sólo para conectarse como terminal de otro punto de acceso, no cuando se proporciona un AP?

Funciona, y solía funcionar de forma fiable y a largo plazo en Android 4.2.2 con con los ajustes de tiempo de espera adecuados, pero ahora sin ajuste de tiempo de espera es muy poco fiable y tengo que seguir despertando el dispositivo para usar Internet a través de Hotspot - o desactivar el modo de suspensión por completo y agotar la batería muy rápidamente. Otra razón para tratar de Root el teléfono, que también se hace mucho más difícil por 7.0.

Podría ser algo relacionado con :

/etc/hostapd/hostapd_default.conf :

    # Station inactivity limit
    #
    # If a station does not send anything in ap_max_inactivity seconds, an
    # empty data frame is sent to it in order to verify whether it is
    # still in range. If this frame is not ACKed, the station will be
    # disassociated and then deauthenticated. This feature is used to
    # clear station table of old entries when the STAs move out of the
    # range.
    #
    # The station can associate again with the AP if it is still in range;
    # this inactivity poll is just used as a nicer way of verifying
    # inactivity; i.e., client will not report broken connection because
    # disassociation frame is not sent immediately without first polling
    # the STA with a data frame.
    # default: 300 (i.e., 5 minutes)
    #ap_max_inactivity=300

Así que tengo que rootear el teléfono para cambiar este valor por defecto. ¿Alguien ha encontrado alguna solución?

0 votos

Aha! Podría ser algo relacionado con este archivo :

1voto

JVD Puntos 16

Sí, es debido a los tiempos de inactividad. Pero sin rootear el dispositivo no puedo determinar con seguridad si es eso específico hostapd ap_max_inactivity=300 por defecto, pero creo que sí. No estoy seguro de si es el caso de que mi controlador iwlwifi de Linux 4.10 x86_64 (recientemente reestructurado) no esté actuando adecuadamente cuando recibe la trama de datos vacía.

Pero, creo que realmente no está de moda que Android decida impedir que los usuarios sigan configurando este parámetro, cuando en versiones anteriores sí lo permitía.

La solución es, por supuesto, iniciar un 'demonio de monitorización de ping', como este shell script en el host del cliente AP (Linux en mi caso):

#!/usr/bin/bash
declare -i wpm_should_exit=0;
function wpm_exit()
{ wpm_should_exit=1;
}
function wlan_ping_monitor()
{ trap 'wpm_exit' HUP INT QUIT TERM;
  local the_IF="$1";
  declare -i ok=1 i=0;
  def_router=$(ip route show default  2>/dev/null |\
  sed -rn \
      '/^default[[:space:]]via/{s/^.*via[[:space:]]+'\
      '//;s/[[:space:]].*$//;p}'); # join above lines! 
  if [ x == x"$def_router" ]; then
     echo "$FUNCNAME: default router is not set. Nothing to do." >&2;
     return 1;
  fi
  kernel_org=$(host www.kernel.org | sed -rn \
     '/has[[:space:]]+address/{s/^.*address' \
     '[[:space:]]'//;p}'); # join above lines!
  if [ x = x"$kernel_org" ]; then
     echo "$FUNCNAME: Unable to resolve kernel.org -"\
          " must be able to ping an internet host." >&2;
     return 1;
  fi
  logger -p user.info "$FUNCNAME : started.";
  sleep 60;
  while ((0 == wpm_should_exit)); do
      ((ok=0));
        for (( i=0; i < 3 ; i+=1 )); do
        if /usr/bin/ping -n -q -c 2 -W 8 $kernel_org >/dev/null 2>&1 || \
           /usr/bin/ping -n -q -c 2 -W 4 $def_router >/dev/null 2>&1; \
        then ((ok=1)); break 1 ; fi 
        logger -p daemon.error \
             "$FUNCNAME: ping $def_router or $kernel_org failed.";
        sleep 1;
     done
     if (( ok == 0 )); then
        logger -p daemon.error \
            "$FUNCNAME"': interface '"$the_IF"\
            ' is down. Could not ping '$def_router' or '$kernel_org\
            '. Restarting Network...' ;
        /etc/init.d/network restart || break;
        ((ok=1));
        sleep 60;
    else
        sleep 8;
    fi
 done
 logger -p daemon.error "$FUNCNAME: restarting network failed.";
 rm -vf $PID_FILE;
}
declare -i status=0;
case "$0" in
  (\*${BASH_SOURCE})
      wlan_ping_monitor ;
      status=$?;
  ;;
esac
((status==0));

Para completar, aquí está daemon.sh con el que el anterior script es invocado por '/etc/init.d/network start':

PID_FILE=/run/wlan_ping_monitor.pid \
   daemon /etc/init.d/wlan_ping_monitor.sh

Sólo faltan los build-ins de bash 'setpgid' y 'noctty', que sí lo hacen:

setpgid( pid = getpid(), pid );

y

ioctl(0, TIOCSCTTY , 0 );

Pero, no son estrictamente necesarios para probar - sólo eliminar / comentar - estos complementos son fáciles de escribir y están disponibles a petición. Deben ser programas, porque deben afectar al proceso actual.

Una cosa extraña sobre el ping script es que debe enviar un paquete a la WAN de Internet para restablecer el temporizador de inactividad - no es no es suficiente con hacer un ping al teléfono, que puede no responder a los paquetes ICMP dentro de los 4 segundos, mientras que todavía pasa a través de pings a la WAN.

#!/usr/bin/bash
. /usr/lib64/bash-${BASH_VERSION}_loadables/load.sh
if [ ! -v N_DAEMONS ]; then
   declare -xi N_DAEMONS=0;
fi
if [ ! -v TMPDIR ]; then
   declare -x TMPDIR=/tmp;
fi
if [ ! -v USER ]; then
   declare -x USER=$(whoami);
fi
declare -i daemon_status=0;
function daemon()
{   export \
      PID_FILE=${PID_FILE:-${TMPDIR}/${USER}- daemon-${N_DAEMONS}.pid};
    declare -xi N_DAEMONS=0;
    if [[ "$PID_FILE" =~ ^(.*)[\.][pP][iI][dD]$ ]]; then
       export PID_FILE="${BASH_REMATCH[1]}";
    fi
    while [ -f "$PID_FILE".pid ]; do
       ((N_DAEMONS+=1));
       export PID_FILE="${PID_FILE%-\*}-${N_DAEMONS}";
    done
    export PID_FILE="${PID_FILE}.pid" LOG_FILE="${PID_FILE}.log";
    echo "daemon: PID_FILE: $PID_FILE LOG_FILE: $LOG_FILE" >&2;
    declare -i checkjobs_enabled=0;
    if shopt -q checkjobs; then
       ((checkjobs_enabled=1));
       shopt -u checkjobs;
    fi
    trap "" CHLD HUP TERM QUIT EXIT ERR;
    { tty=$(ps -o 'tty=' -p $BASHPID 2>/dev/null);
      { trap "-" CHLD HUP TERM QUIT EXIT ERR;
        if [ x != x$tty ] && [ -e /dev/$tty ]; then 
           noctty < /dev/$tty || :; # another built-in -just comment out
        fi
        setpgid;
        echo "$BASHPID" > "$PID_FILE";
        declare -a ps=($(cat /proc/${BASHPID}/stat));
        if [ x != x"${ps[3]}" ] && [ "${ps[3]}" != 1 ] && \
           [ -d /proc/${ps[3]} ] ; then
           echo 'DAEMON: '${ps[3]}' : '$(readlink  \
              /proc/${ps[3]}/exe) >&2;
        fi
        exec "$@" </dev/null  >${LOG_FILE} 2>&1 ;
      } &
      exit $?; # our child becomes child of init
    }&
    declare -i ok=$?;
    trap "-" CHLD HUP TERM QUIT EXIT ERR;
    if ((checkjobs_enabled)); then
       shopt -s checkjobs;
    fi
    return $ok;
 }
 case "$0" in
   (\*/${BASH_SOURCE}) ;&
   (${BASH_SOURCE})
      daemon "$@";
      ((daemon_status=$?));
   ;;
 esac
 ((daemon_status==0));

Este demonio también es eliminado por /etc/init.d/network stop (que es invocado por "reinicio de la red").

Es una pena que sea necesario, cuando simplemente se pasa de utilizar un punto de acceso/router para teléfonos Android 4.2.2 a utilizar un AP Android 7.0, que los clientes tengan que utilizar estos métodos para mantener una conexión a Internet WAN "siempre encendida" a través del AP.

0 votos

O podrías usar NetworkManager, que yo no lo hago.

0 votos

Esto es un error del kernel de linux: bugzilla.kernel.org/show_bug.cgi?id=194931 El kernel podría estar respondiendo mejor a la trama de datos vacía enviada por hostapd de Nougat en el timeout ap_max_inactivity=300. Además, wpa_supplicant debería detectar que el enlace ha muerto y reiniciarlo.

0voto

Will Hardy Puntos 6663

Resolví el problema comprobando si el hotspot estaba habilitado cada 30s y si no lo está, habilitar el hotspot.

La solución es lo suficientemente buena para mí, ya que espero a que un dispositivo externo se conecte a mi hotspot. Una vez que se conecta, el hotspot no se desactiva. Tengo que mantener el hotspot encendido todo el tiempo ya que no sé cuando el sistema externo se va a conectar a mi sistema.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X