¿Puede AppleScript o cualquier otro script medir la intensidad de la señal wifi de una Macbook?

En mi casa tengo dos enrutadores separados debido a las malas señales cuando estoy en un lugar opuesto a otro.

Cuando trabajo en mi Macbook desde diferentes ubicaciones, me resulta molesto tener que cambiar entre enrutadores. El objetivo final es ejecutar un script más complejo launchdpara identificar si hay mejores redes presentes y automatizar el cambio.

He intentado experimentar con networksetup -listnetworkserviceordery networksetup -listallhardwareportspero no he tenido suerte.

En AppleScript o cualquier otro lenguaje de secuencias de comandos, ¿una forma de medir la fuerza de dos enrutadores similar a lo que se ve en la señal wifi de la barra de menú?

Respuestas (3)

Si su principal prioridad es que su Mac cambie automáticamente al siguiente punto de acceso más potente...

Tu Mac ya puede hacer eso por ti.

Por supuesto, debe haber configurado ambos enrutadores como Unirse automáticamente y en la parte superior de su lista.

Luego dígale que se desplace y se conectará automáticamente a la próxima red de señal más fuerte.

Aún mejor es si su SSID y WPA son los mismos para ambos.

Para activar el roaming en caso de que estuviera desactivado, haga lo siguiente en la Terminal:

sudo defaults write /Library/Preferences/com.apple.airport.opproam enabled -bool true

Luego configúrelo para unirse automáticamente al siguiente punto de acceso más fuerte

sudo /System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport prefs joinMode=Strongest

Ya terminó, ahora puede moverse y su Mac lo mantendrá conectado a la señal más fuerte.

Más material de lectura aquí

Y Apple te explica cómo funciona

Si aún prefiere crear secuencias de comandos para este proceso, aquí está la lista de comandos del aeropuerto./System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport

El artículo que vinculó ("Más material de lectura aquí") dice que el sistema operativo ha ignorado el contenido de com.apple.airport.opproam desde Yosemite. Así que no creo que su comando funcione a menos que esté ejecutando un sistema operativo antiguo.
@Wowfunhappy, acabo de comprobar que sigue ahí y activo en High Sierra.` /Library/Preferences/com.apple.airport.opproam.plist`
Está ahí, pero no se usa. El "traspaso" (lo que fuerza a los clientes de un AP al siguiente) es manejado por el controlador de la red WiFi. Para que esto funcione, tiene que haber un mínimo de -12dBM delta entre las dos señales.
@Wowfunhappy Umbral de activación El umbral de activación es el nivel de señal mínimo que requiere un cliente para mantener la conexión actual. Los clientes de macOS supervisan y mantienen la conexión del BSSID actual hasta que el RSSI cruza el umbral de -75 dBm. Después de que RSSI cruza ese umbral, macOS busca BSSID candidatos de roaming para el ESSID actual.

Aquí hay un script de JavaScript para automatización (JXA) que buscará redes WiFi y recuperará los valores SSID y RSSI:

ObjC.import('CoreWLAN');
nil = $();

(() => {

    const defaultInterface = $.CWWiFiClient.sharedWiFiClient.interface;

    if (!defaultInterface.powerOn) return false;

    const networks = defaultInterface
                    .scanForNetworksWithNameError(nil,nil)
                    .allObjects;

    const SSIDs = ObjC.deepUnwrap(networks.valueForKey('ssid'));
    const RSSIValues = ObjC.deepUnwrap(networks.valueForKey('rssiValue'));

    const WiFi = SSIDs.reduce((ξ, item, i)=>{ 
                    ξ[item] = RSSIValues[i];
                    return ξ;
               }, {})

    var WiFiByStrength = {};
    Object.keys(WiFi).sort((i,j)=>{ return WiFi[j] - WiFi[i]; })
                     .map(key=>WiFiByStrength[key] = WiFi[key]);

    return WiFiByStrength;

})();

Presenta la salida de pares clave-valor ordenados por intensidad de señal (RSSI), comenzando primero con la señal de red WiFi más fuerte:

{"CK.net":-38, "NCC-1701-D":-59, "Peter's Wi-Fi Network":-67, 
"BTWifi-X":-68, "BTWifi-with-FON":-68, "BTHub4-WMJM":-68}

Aquí, los valores de RSSI son números negativos, con un número más cercano a 0 (más positivo) que indica una señal WiFi más fuerte.

¿Hay documentación en alguna parte sobre el uso de JXA y la API de CoreWLAN a la que accede JXA?
@David JXA: no, no realmente, pero si conoce AppleScript y JavaScript, entonces traducir uno a otro es sencillo. Si no conoce JavaScript, ese es el lugar para comenzar, para lo cual hay muchos documentos. Aquí está la referencia de CoreWLAN , que es lo que usé para escribir el script anterior. Es una referencia de Objective-C pero, de nuevo, si conoces Objective-C y JavaScript, entonces...

Sí, tanto la red actual como las redes potenciales se pueden programar desde la línea de comandos/shell de Unix para que se extienda a la mayoría de los lenguajes de automatización, incluido AppleScript. Haría su programa final en python o swift, pero aquí le mostramos cómo comenzar su proceso con la intensidad de la señal.

Obtener la red conectada actual es fácil y rápido. Las entradas relevantes para la señal y el ruido son los valores de radio sin procesar en el canal negociado, pero sería mejor desactivar la velocidad de transmisión, ya que siempre que tenga una red más rápida que X, realmente no importa qué ruido/señal desde la transmisión. la tasa cae cuando la señal cae o el ruido aumenta.

system_profiler SPAirPortDataType:

       AC88U_5G:
          PHY Mode: 802.11ac
          BSSID: 54:36:9b:2d:78:e2
          Channel: 149
          Country Code: CN
          Network Type: Infrastructure
          Security: WPA2 Personal
          Signal / Noise: -26 dBm / -81 dBm
          Transmit Rate: 867
          MCS Index: 9
      Other Local Wi-Fi Networks:
        AC88U:
          PHY Mode: 802.11n
          BSSID: 54:36:9b:2d:78:e1
          Channel: 7
          Country Code: CN
          Network Type: Infrastructure
          Security: WPA2 Personal
          Signal / Noise: -18 dBm / 0 dBm

Escanear todas las radios y canales posibles es bastante más lento (de 5 a 10 segundos en lugar de una fracción de segundo para ejecutar) que el simple volcado anterior, por lo que necesitaría un programa para manejar eso o un script que sea mucho más inteligente. Comenzaría airport --scany filtraría por su SSID preferido o dirección MAC conocida en sus estaciones base:

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport --scan

Una vez que haya escaneado, system_profilerdebería informar más resultados, ya que los resultados del escaneo parecen almacenarse en caché localmente por un tiempo.

Los ingenieros de WiFi realizan esta optimización todo el tiempo controlando la velocidad de transmisión/MCS. Simplemente elija todas las velocidades de transmisión que desea desalojar a todos los clientes de su radio principal y, una vez que pierdan la conexión a las altas velocidades preferidas, todos los sistemas operativos se desconectarán y luego recuperarán la siguiente radio que esté disponible. Mucho más fácil que implementar scripts personalizados en todos los dispositivos que se conectan a sus dos radios.

Además, no hace falta decir que, si pudiera hacer que ambas radios transmitieran en el mismo SSID, entonces sus productos de Apple simplemente estarían en roaming, pero tal vez tenga una buena razón para no tener el mismo nombre de red y simplificar su trabajo.

Y para responder a la pregunta de @nohillside "cómo decidir qué Wi-Fi es más fuerte", aquí hay algunas pautas.

ingrese la descripción de la imagen aquí

¿Puede agregar algún detalle sobre cómo leer el resultado, especialmente sobre cómo decidir qué Wi-Fi es más fuerte?
@nohillside Ok, no soy bueno con los guiones, pero probaré uno simple.
Te tengo @maP1EbluE: este es un problema de diseño muy conocido para los ingenieros de Wi-Fi. El RSSI y Signal son cosas malas para automatizar, pero si el OP quiere señal, está ahí. Los dos elementos reales para ingresar son el índice MCS y la velocidad de transmisión, y su respuesta es perfecta para obtener una medida de cuándo el OP desea iniciar el proceso de caída. Tratar de escribir todo el programa/guión es demasiado amplio para una sola pregunta, por lo que su respuesta debería ser perfecta para comenzar. +1
En realidad, no pedí un guión, sino solo una explicación sobre cuáles de los valores son importantes.
@nohillside No pediste un guión, pero el OP lo tenía después de la pregunta principal. He editado la pregunta para que no sea demasiado amplia. Hay buena información; espero no haber agregado demasiadas palabras aquí; por favor, alguien reduzca mi texto si la respuesta corta de airport --getinfoy airport --scanes todo lo que se necesita aquí y la explicación para ver la velocidad de transmisión cuando desea rescatar una red en su lugar. de valores de decibelios RSSI / SNR / Señal / Ruido.
@nohillside mira mi edición que debería responder a tu pregunta.