Bei mir zu Hause habe ich zwei separate Router aufgrund schlechter Signale, wenn ich mich an einem Ort gegenüber einem anderen befinde.
Wenn ich von verschiedenen Standorten aus an meinem Macbook arbeite, finde ich es nervig, wenn ich zwischen Routern wechseln muss. Das letztendliche Ziel besteht darin, ein komplexeres Skript auszuführen, launchd
um festzustellen, ob ein besseres Netzwerk vorhanden ist, und die Umstellung zu automatisieren.
Ich habe versucht, mit zu experimentieren networksetup -listnetworkserviceorder
, networksetup -listallhardwareports
hatte aber kein Glück.
In AppleScript oder einer anderen Skriptsprache eine Möglichkeit, die Stärke von zwei Routern zu messen, ähnlich dem, was auf dem WLAN-Signal der Menüleiste sichtbar ist?
Wenn Ihre Hauptpriorität darin besteht, dass Ihr Mac automatisch zum nächststärksten Zugriffspunkt wechselt.....
Ihr Mac kann das bereits für Sie tun.
Natürlich müssen Sie beide Router als Automatisch beitreten und oben in Ihrer Liste eingerichtet haben.
Sagen Sie ihm dann, dass er roamen soll, und er verbindet sich automatisch mit dem nächststärkeren Signalnetzwerk.
Noch besser ist es, wenn Ihre SSID und WPA für beide gleich sind.
Um das Roaming einzuschalten, falls es ausgeschaltet war, tun Sie dies im Terminal:
sudo defaults write /Library/Preferences/com.apple.airport.opproam enabled -bool true
Richten Sie es dann so ein, dass es automatisch dem nächsten stärksten Zugangspunkt beitritt
sudo /System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport prefs joinMode=Strongest
Sie sind fertig, jetzt können Sie sich bewegen und Ihr Mac hält Sie mit dem stärksten Signal verbunden.
Und Apple erklärt, wie es funktioniert
Wenn Sie es dennoch vorziehen, diesen Prozess zu skripten, finden Sie hier die Liste der Flughafenbefehle/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport
Hier ist ein JavaScript for Automation (JXA)-Skript, das nach WLAN-Netzwerken sucht und die SSIDs und RSSI-Werte abruft:
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;
})();
Es zeigt die Ausgabe von Schlüssel-Wert-Paaren sortiert nach Signalstärke (RSSI) in der Reihenfolge, beginnend mit dem stärksten WLAN-Netzwerksignal zuerst:
{"CK.net":-38, "NCC-1701-D":-59, "Peter's Wi-Fi Network":-67,
"BTWifi-X":-68, "BTWifi-with-FON":-68, "BTHub4-WMJM":-68}
Hier sind die RSSI-Werte negative Zahlen, wobei eine Zahl näher an 0 (positiver) auf ein stärkeres WLAN-Signal hinweist.
Ja – sowohl das aktuelle Netzwerk als auch potenzielle Netzwerke können von der Unix-Befehlszeile/-Shell aus skriptgesteuert werden, sodass sich dies auf die meisten Automatisierungssprachen erstreckt – einschließlich AppleScript. Ich würde Ihr endgültiges Programm in Python oder Swift erstellen, aber hier erfahren Sie, wie Sie Ihren Prozess mit Signalstärke starten.
Das Abrufen des aktuell verbundenen Netzwerks ist einfach und schnell. Die relevanten Einträge für Signal und Rauschen sind die rohen Funkwerte auf dem ausgehandelten Kanal, aber es wäre besser, die Übertragungsrate auszuschalten, da es, solange Sie ein schnelleres als X-Netzwerk haben, keine Rolle spielt, welches Rauschen / Signal seit der Übertragung vorliegt Die Rate sinkt, wenn das Signal abfällt oder das Rauschen zunimmt.
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
Das Scannen aller möglichen Funkgeräte und Kanäle ist ziemlich langsamer (5 bis 10 Sekunden statt eines Bruchteils einer Sekunde) als der einfache Dump oben, also benötigen Sie ein Programm, um damit umzugehen, oder ein Skript, das viel versierter ist. Ich würde mit airport --scan
Ihrer bevorzugten SSID oder bekannten MAC-Adresse auf Ihren Basisstationen beginnen und filtern:
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport --scan
Sobald Sie gescannt haben, system_profiler
sollten mehr Ergebnisse gemeldet werden, da die Scanergebnisse für eine Weile lokal zwischengespeichert zu sein scheinen.
WiFi-Ingenieure führen diese Optimierung ständig durch, indem sie die MCS/Übertragungsrate steuern. Wählen Sie einfach alle Übertragungsraten aus, mit denen Sie alle Clients für Ihr Hauptfunkgerät entfernen möchten, und sobald sie die Verbindung bei den bevorzugten hohen Geschwindigkeiten verlieren, werden alle Betriebssysteme fallen gelassen und nehmen dann das nächste verfügbare Funkgerät auf. Viel einfacher, als benutzerdefinierte Skripte auf alle Geräte auszurollen, die mit Ihren beiden Radios verbunden sind.
Außerdem versteht es sich von selbst, dass, wenn Sie beide Radios auf derselben SSID senden könnten, Ihre Apple-Produkte nur roamen würden, aber vielleicht haben Sie einen guten Grund, nicht denselben Netzwerknamen zu haben und Ihre Arbeit zu vereinfachen.
Und um die @nohillside-Frage zu beantworten, „wie man entscheidet, welches Wi-Fi stärker ist“, finden Sie hier einige Richtlinien.
airport --getinfo
und airport --scan
alles ist, was hier benötigt wird, und die Erklärung, um sich die Übertragungsrate anzusehen, wenn Sie stattdessen ein Netzwerk verlassen möchten von RSSI / SNR / Signal / Noise Dezibelwerten.
Wowfunhappy
Zwieback
Allan
Zwieback