Kann AppleScript oder ein anderes Skript die WLAN-Signalstärke eines Macbooks messen?

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, launchdum festzustellen, ob ein besseres Netzwerk vorhanden ist, und die Umstellung zu automatisieren.

Ich habe versucht, mit zu experimentieren networksetup -listnetworkserviceorder, networksetup -listallhardwareportshatte 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?

Antworten (3)

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.

Mehr Lesestoff hier

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

Der von Ihnen verlinkte Artikel ("Mehr Lesematerial hier") besagt, dass der Inhalt von com.apple.airport.opproam seit Yosemite vom Betriebssystem ignoriert wurde. Ich glaube also nicht, dass Ihr Befehl funktioniert, wenn Sie kein altes Betriebssystem ausführen.
@Wowfunhappy, habe gerade überprüft, dass es noch da ist und auf High Sierra aktiv ist.` /Library/Preferences/com.apple.airport.opproam.plist`
Es ist da, wird aber nicht benutzt. "Handoff" (was Clients von einem AP zum nächsten zwingt) wird vom Controller des WiFi-Netzwerks gehandhabt. Damit dies funktioniert, muss zwischen den beiden Signalen ein Delta von mindestens -12dBM vorhanden sein
@Wowfunhappy Auslöseschwelle Die Auslöseschwelle ist der minimale Signalpegel, den ein Client benötigt, um die aktuelle Verbindung aufrechtzuerhalten. macOS-Clients überwachen und halten die Verbindung der aktuellen BSSID aufrecht, bis der RSSI den Schwellenwert von -75 dBm überschreitet. Nachdem RSSI diesen Schwellenwert überschritten hat, sucht macOS nach Roam-Kandidaten-BSSIDs für die aktuelle ESSID.

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.

Gibt es irgendwo eine Dokumentation zur Verwendung von JXA und der CoreWLAN-API, auf die JXA zugreift?
@David JXA - nein, nicht wirklich, aber wenn Sie AppleScript und JavaScript kennen, ist das Übersetzen ineinander einfach. Wenn Sie JavaScript nicht kennen, sollten Sie hier anfangen, wofür es viele Dokumente gibt. Hier ist die CoreWLAN-Referenz , mit der ich das obige Skript geschrieben habe. Es ist eine Objective-C-Referenz, aber noch einmal, wenn Sie Objective-C und JavaScript kennen, dann ...

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 --scanIhrer 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_profilersollten 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.

Geben Sie hier die Bildbeschreibung ein

Können Sie einige Details zum Lesen der Ausgabe hinzufügen, insbesondere zur Entscheidung, welches Wi-Fi stärker ist?
@nohillside Ok, ich bin nicht gut in Skripten, aber ich werde es mit einem einfachen versuchen.
Ich habe dich @maP1EbluE - Dies ist ein sehr bekanntes Designproblem für WiFi-Ingenieure. RSSI und Signal sind schlecht zu automatisieren, aber wenn das OP ein Signal will - es ist da. Die eigentlichen zwei Elemente, die Sie eingeben müssen, sind MCS-Index und Übertragungsrate, und Ihre Antwort ist perfekt, um ein Maß dafür zu erhalten, wann das OP den Drop-Prozess starten möchte. Der Versuch, das gesamte Programm / Skript zu schreiben, ist für eine Frage viel zu weit gefasst, daher sollte Ihre Antwort perfekt für den Einstieg sein. +1
Ich habe eigentlich nicht nach einem Skript gefragt, sondern nur nach einer Erklärung, welche der Werte wichtig sind.
@nohillside Sie haben nicht nach einem Skript gefragt, aber das OP hatte es nach der Hauptfrage. Ich habe die Frage bearbeitet, um sie nicht zu weit zu fassen. Es gibt einige gute Informationen - hoffentlich habe ich hier nicht zu viele Wörter hinzugefügt - bitte reduzieren Sie meinen Text, wenn die kurze Antwort von airport --getinfound airport --scanalles 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.
@nohillside siehe meine Bearbeitung, die Ihre Frage beantworten sollte.