2 votos

¿Por qué es networksetup tan lento en comparación a cambiar manualmente las redes Wi-Fi?

si me quedo networksetup -setairportnetwork en0 myssid

se tarda entre 10 y 15 segundos.

Si yo manualmente, haga clic en el icono Wi-Fi en la barra de notificación y seleccione myssid, es instantáneo.

Como alternativa, me encantaría ser capaz de hacer un applescript que manualmente clics para cambiar las redes Wi-Fi, pero no puedo encontrar un buen ejemplo, todo el mundo lo dice "utilizar networksetup".

Respuesta: @CJK's solución funciona muy bien, estoy usando su segundo script que hace el manual haga clic en. El primero funciona en la mayoría de los casos, excepto en donde estoy tratando de conectarse a la red de una empresa que utiliza un certificado. Por alguna razón la conexión de esta manera no funciona en ese caso. Pero en todos los demás casos, ambos scripts gran trabajo.

3voto

qarma Puntos 71

Tomo nota de lo que @Allan ha dicho en su comentario debajo de tu pregunta.

Mientras que no tengo un retraso tan largo como 10 a 15 segundos usando la línea de comandos, me parece que es demostrable y consistentemente más lento (unos pocos segundos) de hacer clic en el icono de WiFi. No sé los subyacentes de las operaciones realizadas por networksetup, pero me pregunto si se realiza un análisis de la red y cada vez que se realiza una solicitud para unirse a una nueva red, lo que puede explicar el retraso. Escaneado en red de las veces se puede estar influenciada por muchos factores, por lo que este retraso es probable que varían entre los usuarios en diferentes entornos. Esto es sólo hipótesis, sin embargo.

Me encantaría ser capaz de hacer un applescript que manualmente clics para cambiar las redes Wi-Fi

Te voy a dar dos secuencias de comandos.

1. Servicio de secuencias de comandos con AppleScriptObjC

La primera secuencia de comandos utiliza AppleScriptObjC a la interfaz con el sistema directamente y de control de la interfaz WiFi. Un resumen rápido, que me ampliar a continuación:

  • + Robusto/fiable
  • + Más rápido que networksetup
  • + No hay necesidad de introducir manualmente las contraseñas
  • + No hay alteraciones visuales en la pantalla; opera en segundo plano
  • Más lento que hacer clic en el icono de WiFi
  • SSID mayúsculas y minúsculas, toda la frase matching (se puede cambiar)
use framework "CoreWLAN"

property this : a reference to current application
property nil : a reference to missing value
property _1 : a reference to reference

property CWWiFiClient : a reference to CWWiFiClient of this
property NSPredicate : a reference to NSPredicate of this


to joinNetwork given name:ssid as text, password:pw as text : missing value
    local ssid, pw

    set |?| to NSPredicate's predicateWithFormat:("self.ssid ==[c] %@") ¬
        argumentArray:{ssid}

    tell CWWiFiClient's sharedWiFiClient()'s interface()
        its setPower:true |error|:nil

        set networks to {}
        tell cachedScanResults() to if it ≠ missing value then ¬
            set networks to filteredSetUsingPredicate_(|?|)

        if the number of networks = 0 then set networks to ¬
            (its scanForNetworksWithName:ssid |error|:nil)

        set network to (allObjects() in networks)'s firstObject()
        its associateToNetwork:network |password|:pw |error|:_1

        set [success, E] to the result
        if E ≠ missing value then return ¬
            E's localizedDescription() ¬
            as text
        success
    end tell
end joinNetwork

Tendría que llamar a la joinNetwork controlador desde dentro de tu script así:

joinNetwork given name:"my network ssid", password:"Passw0rd1"

Este script será robusto y fiable (salvo alguna humanos error de mi parte, que me corrija si usted encuentra un error que he pasado por alto durante las pruebas). Se utiliza preferentemente en caché los resultados del análisis para conectarse a las redes; si no hay ninguno disponible, o el SSID especificado no aparecen cuando los resultados del análisis fueron los últimos en caché, se realizará un nuevo análisis de la red. Por lo tanto, si mi hipótesis acerca de la networksetup es un factor que contribuye, este script será más rápido que el de la línea de comandos en la mayoría de carreras, pero puede tomar la misma cantidad de tiempo en el ocasional ejecutar cuando se ven obligados a hacer un análisis.

Uno de los beneficios es que, debido a que puede especificar una contraseña de red cuando se llama a la joinNetwork de controlador, usted no tendrá que introducir manualmente al unirse a una nueva red.

El SSID-especificada por el name de parámetro es sensible a las mayúsculas en ambas secuencias de comandos; la contraseña, obviamente, no lo es. El script de arriba, se ha elegido para realizar toda una concordancia de frase en el SSID, es decir, "mi red" no siempre va a unirse a una red que se llama "mi red"; la secuencia de comandos a continuación ha elegido para hacer una coincidencia aproximada, es decir, "net" se podría unirse a "mi red" o "mi red".

2. Interfaz de usuario de secuencias de comandos

Este segundo script es realmente la que usted solicitó: que se comunica con la interfaz de usuario para que haga clic en el WiFi icono de menú y, a continuación, seleccione la red (si aparece en la lista). Un resumen:

  • + A pesar de ser una interfaz de usuario de secuencia de comandos, que no debe sufrir de las mismas debilidades inherentes a la mayoría de las secuencias de comandos de interfaz de usuario; así que espero fiable
  • + Más rápido de la implementación de las redes unió inmediatamente
  • Visualmente discordante cuando aparezca el menú; además, el usuario no debe interactuar con el sistema hasta que el script ha salido (de la naturaleza de la interfaz de usuario de secuencia de comandos)
  • Debe introducir manualmente las contraseñas si no se ha guardado
  • SSID mayúsculas y minúsculas, de coincidencia aproximada (se puede cambiar)
    use application "System Events"

    property process : a reference to application process "SystemUIServer"
    property menu bar : a reference to menu bar 1 of my process
    property menu bar item : a reference to (menu bar items of my menu bar ¬
        where the description contains "Wi-Fi")
    property menu : a reference to menu 1 of my menu bar item
    property menu item : a reference to menu items of my menu


    to joinNetwork given name:ssid as text
        local ssid

        if not (my menu bar item exists) then return false
        click my menu bar item

        repeat until my menu exists
            delay 0.5
        end repeat

        set M to a reference to (my menu item where the name contains ssid)

        repeat 20 times --> 10 seconds @ 0.5s delay
            if M exists then exit repeat
            delay 0.5
        end repeat
        click M
    end joinNetwork


    joinNetwork given name:"my network ssid"

Secuencias de comandos que intente controlar la interfaz de usuario está utilizando un método llamado interfaz de usuario o GUI de secuencias de comandos. Estos son muy populares entre y popularizado por novato generadores de secuencias de comandos, simplemente porque estos son los más comúnmente encontrado secuencias de comandos en internet. No voy a entrar aquí demasiado distinto de advertir contra el uso de secuencias de comandos que dependen de clics y pulsaciones del teclado que son inherentemente frágil y poco fiable, incluso si está bien escrito, pero la mayoría de las secuencias de comandos de interfaz de usuario (escrito por novatos) son terriblemente escrito, lo que agrava el problema. Casi siempre hay una mejor manera de lograr el resultado deseado.

Dicho esto, este es uno de los pocos tipos de interfaz de usuario de secuencias de comandos que son tal vez una excepción a mi advertencia, y en mi opinión, bastante aceptable la aplicación. Esto es debido a que la orientación de un aspecto de la interfaz de usuario de un menú (el icono de la barra de propiedad por el sistema) que está prácticamente garantizado para siempre accesible, independientemente de lo que la ventana o el escritorio tiene el foco, etc. La situación en la que el guión de esta naturaleza podría romper es si el menú del icono de la barra no estaba allí (es decir, que el usuario específicamente establecer una preferencia que no tiene el icono de WiFi disponible); sin embargo, he de poner una línea en el script que comprueba la existencia de este, y realiza una salida airosa de la situación.

Esta secuencia de comandos que parece ser rápidas de ejecución, lo cual no me sorprende, ya que será igual en velocidad a hacer clic en el icono manualmente; pero, lo que me impresiona en que no puedo pensar en muchas secuencias de comandos de interfaz de usuario que acabaría fuera la realización de una aplicación o servicio dirigida a la secuencia de comandos. La red está unido de forma casi instantánea, siempre que la contraseña ya está guardado en su llavero. En la ocasión, la red se esperaría ver en el menú de la lista pueden no estar ahí hasta el análisis en segundo plano, refresca y la lista de actualizaciones. Por lo tanto, he construido en un espacio de 10 segundos dentro de los cuales el script comprueba cada medio segundo para ver si el elemento de menú que ha aparecido; si no, la secuencia de comandos de salidas y tendrás que intentarlo de nuevo.

El inconveniente es la ausencia de un llavero de la contraseña de una red se requieren de tener que introducir manualmente la contraseña cuando se le solicite. Esto es posible secuencia de comandos de esta con interfaz de usuario técnicas, pero inmediatamente hace que la secuencia de comandos altamente susceptibles a los problemas que he mencionado y, a continuación, yo, personalmente, no lo uso.


Sistema de información: AppleScript versión: 2.7 Sistema de versión: 10.13.6

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X