5 votes

Le paramètre de délai d'attente pour les hotspots Wi-Fi a disparu dans Nougat 7.0 et 7.1, mais pas le délai d'attente.

Je viens d'obtenir un nouveau téléphone Android 7.0 Nougat, et le seul problème majeur jusqu'à présent est la disparition du paramètre de délai d'attente pour le Wi-Fi. la disparition du paramètre de délai d'attente pour le Wi-Fi-hotspot.

C'est probablement le même problème que : https://Android.stackexchange.com/questions/168549/hotspot-timeout-setting-gone-in-7-1-nougat mais il a commencé avec 7.0, pas 7.1, et puisque personne n'a répondu à cette question, j'ai pensé que je pourrais essayer. question, j'ai pensé que je pouvais aussi bien essayer.

Le Hotspot semble s'éteindre après 1 à 2 minutes d'inactivité, je crois. correspondant à la mise en veille de l'appareil, ce qui m'oblige à redémarrer ISC dhclient & wpa_supplicant manuellement pour se reconnecter.

Le Hotspot se met en veille pour cause d'inactivité bien plus tôt que le bail DHCP. qu'il a donné expire.

J'ai activé les paramètres WiFi avancés 'On during sleep ( ALWAYS )'. Mais je n'ai pas besoin d'activer le WiFi pour activer le Hotspot WiFi (IP Tethering sur WiFi, agissant comme un point d'accès pour mon ordinateur portable), donc Je ne vois pas beaucoup de paramètres WiFi, et je ne sais pas si un paramètre WiFi prendrait effet si le WiFi était désactivé. prendrait effet si le WiFi était désactivé. Je pensais qu'on activait le WiFi uniquement pour se connecter en tant que terminal d'un autre point d'accès, et non pour fournir un AP ?

Cela fonctionne, et fonctionnait de manière fiable et à long terme sous Android 4.2.2 avec des avec les paramètres de délai d'attente appropriés, mais maintenant, sans paramètre de délai d'attente, il est très peu fiable et je dois constamment réveiller l'appareil pour utiliser l'internet par le biais de Hotspot - ou désactiver entièrement le mode veille et vider la batterie très rapidement. Une autre raison d'essayer de Rooter le téléphone, ce qui est également rendu beaucoup plus difficile par la version 7.0.

Cela pourrait avoir un rapport avec :

/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

J'ai donc besoin de Root le téléphone pour changer cette valeur par défaut. Quelqu'un a-t-il trouvé des solutions de contournement ?

1voto

JVD Points 161

Oui, c'est à cause des délais d'inactivité. Mais sans rooter l'appareil, je ne peux pas déterminer avec certitude si c'est ce problème spécifique. hostapd ap_max_inactivity=300 par défaut, mais je crois que c'est le cas. Je ne suis pas sûr que ce soit le cas que mon pilote iwlwifi Linux 4.10 x86_64 (récemment restructuré) n'agit pas de manière appropriée lorsqu'il reçoit la trame de données vide.

Mais, je pense qu'il n'est vraiment pas normal qu'Android décide d'empêcher les utilisateurs de définir ce paramètre, alors qu'il les laissait faire dans les versions précédentes.

La solution est, bien sûr, de lancer un "démon de surveillance ping", comme ce script shell sur l'hôte du client AP (Linux dans mon cas) :

#!/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));

Pour être complet, voici daemon.sh avec lequel le script ci-dessus est invoqué par '/etc/init.d/network start' :

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

Il ne manque que les build-ins bash 'setpgid' et 'noctty', qui le font :

setpgid( pid = getpid(), pid );

y

ioctl(0, TIOCSCTTY , 0 );

Mais il n'est pas strictement nécessaire de les tester - il suffit de les supprimer ou de les commenter. ces built-ins sont faciles à écrire et disponibles sur demande. Ils doivent être des built-ins, pas des programmes, car ils doivent affecter le processus en cours.

Une chose étrange à propos du script ping est qu'il doit envoyer un paquet l'internet WAN pour réinitialiser la minuterie d'inactivité. suffit pas d'envoyer un ping au téléphone, qui peut ne pas répondre aux paquets dans les 4 secondes tout en continuant à transmettre les pings au 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));

Ce démon est également tué par /etc/init.d/network stop (qui est invoqué par 'network restart').

C'est une honte qu'il soit nécessaire, lorsqu'on passe simplement de l'utilisation d'un point d'accès / routeur pour téléphone Android 4.2.2 à l'utilisation d'un AP Android 7.0, que de telles méthodes soient utilisées par les clients pour maintenir une connexion Internet WAN "toujours active" via l'AP.

0voto

Will Hardy Points 6663

J'ai résolu le problème en vérifiant si le hotspot était activé toutes les 30s et s'il ne l'est pas, activer le hot spot.

La solution est suffisamment bonne pour moi puisque j'attends qu'un appareil externe se connecte à mon hotspot. Une fois qu'il est connecté, le hotspot ne se désactive pas. Je dois garder le hotspot allumé en permanence car je ne sais pas quand le système externe va se connecter à mon système.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X