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 launchd
para identificar si hay mejores redes presentes y automatizar el cambio.
He intentado experimentar con networksetup -listnetworkserviceorder
y networksetup -listallhardwareports
pero 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ú?
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.
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
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.
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 --scan
y 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_profiler
deberí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.
airport --getinfo
y airport --scan
es 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.
guaudivertidofeliz
Ruscos
Alano
Ruscos