2016-09-13 2 views
5

Je songe à avoir un hammerspoon wifi watcher, qui fait un contrôle périodique et va désactiver le wifi si ce n'est pas connecté.Comment vérifier si l'utilisateur est connecté via wifi ou LAN via hammerspoon

Le script suivant fait cela,

function checkAndDisableWifi() 
    hs.timer.doAfter(45, function() 
    local current_network = hs.wifi.currentNetwork() 
    if current_network == nil then 
     hs.wifi.setPower(false) 
     hs.notify.new({title="Hammerspoon",informativeText="Disabling wifi due to inactivity"}):send() 
    end 
    end) 
end 

function wifi_timer_callback() 
    local wifi_state = hs.wifi.interfaceDetails().power 
    if wifi_state then 
    local current_network = hs.wifi.currentNetwork() 
    if current_network == nil then 
     hs.wifi.setPower(false) 
     hs.notify.new({title="Hammerspoon",informativeText="Disabling wifi due to inactivity"}):send() 
    end 
    else 
    hs.wifi.setPower(true) 
    checkAndDisableWifi() 
    end 
end 

local wifi_timer = hs.timer.doEvery((10*60), wifi_timer_callback) 
wifi_timer:start() 

Ici, je suis face à un problème comme si l'utilisateur est déjà connecté via le réseau local. À ce moment-là, je n'ai pas besoin d'activer cet observateur (afin d'arrêter de faire la commutation de wifi ON et OFF). Donc ce que j'ai besoin est, Y at-il une API qui peut me dire si l'utilisateur est déjà connecté via LAN ou au moins connecté à Internet?

Suis-je clair?

Répondre

3

Juste après avoir posté la question, j'ai eu une idée similaire à @TheFrenchPlays. Ceci est mon approche actuelle d'étendre cette idée par hammerspoon,

status, data, headers = hs.http.get("http://google.com") 

donc quand vous inspectez la variable d'état, il donnera 200 si elle est en ligne et 0 si elle est hors ligne. Donc, en inspectant cette variable, je peux faire la solution de contournement de ce problème.

Si je ne me trompe pas, ce serait génial si le hammerspoon expose une API si elle retourne un BOOL s'il est connecté ou non. Et aussi via WiFi ou LAN.

MISE À JOUR: En ce moment, ce travail autour ne résout pas le problème complètement lorsque le système est connecté via le réseau local. Depuis que je ne sais pas si son connecté via LAN ou WiFi, Je ne peux pas désactiver le WiFi directement. D'où la solution actuelle semble fastidieuse

function checkAndDisableWifi() 
    hs.timer.doAfter(45, function() 
    local current_network = hs.wifi.currentNetwork() 
    if current_network == nil then 
     disableWifi() 
    end 
    end) 
end 

function disableWifi() 
    hs.wifi.setPower(false) 
    hs.notify.new({title="Hammerspoon",informativeText="Disabling wifi due to inactivity"}):send() 
end 

function wifi_timer_callback() 
    local status, data, headers = hs.http.get("http://google.com") 
    local wifi_state = hs.wifi.interfaceDetails().power 
    local current_network = hs.wifi.currentNetwork() 
    if not status == 200 then -- user is offline mean not connected to LAN. So do WiFi check 
    if wifi_state and current_network == nil then 
     disableWifi() 
    else 
     hs.wifi.setPower(true) 
     checkAndDisableWifi() 
    end 
    else 
    --[[ 
     since user is connected to online, check whether user is connected through wifi or not. If wifi is on and not connected to any network then disable wifi 
    --]] 
    if wifi_state and current_network == nil then 
     disableWifi() 
    end 
    end 
end 

local wifi_timer = hs.timer.doEvery((10*60), wifi_timer_callback) 
wifi_timer:start() 

MISE À JOUR 2:

On dirait Hammerspoon (0.9.47) a une solution à ce. Mise à jour du code en utilisant la solution donnée par Chris,

if hs.network.interfaceDetails(v4) then 
    if hs.network.interfaceDetails(v4)["AirPort"] then 
     print("on wifi") 
    else 
     print("on Lan") 
    end 
    else 
    print("not connected to internet") 
    end 
2

fondamentalement, vous pouvez simplement ping google. Si vous obtenez une sortie, et n'êtes pas connecté via un réseau wifi, vous pouvez simplement activer le wifi. C'est mon idée

+0

Appréciez l'idée mec –

+0

merci beaucoup :). –

+0

parce que je n'ai pas la réputation de répondre à VOTRE message: ne pouvez-vous pas voir le nom du conector sans fil? Si oui, vous pouvez simplement tester, si le nom est vide –

1

0.9.47 a quelques nouvelles fonctionnalités hs.network qui devraient aider ici.

hs.network.primaryInterfaces() retourne deux valeurs, montrant l'interface par défaut pour ipv4 et ipv6 trafic, donc si vous deviez faire quelque chose comme:

v4, v6 = hs.network.primaryInterfaces()

Ensuite, en supposant que vous vous intéressiez le plus à la v4, vous pouvez vérifier si hs.network.interfaceDetails (v4) ["AirPort"] est nul. Si c'est nul, vous n'êtes pas sur une interface WiFi, si c'est une table pleine de valeurs wifi, vous êtes sur le wifi.

+0

Appréciez la solution donnée. Selon ma compréhension, j'ai mis à jour ma réponse ci-dessus en utilisant le hs.network.interfaceDetails (v4). Pourriez-vous s'il vous plaît me confirmer, est-ce une bonne solution (même si j'ai vérifié ma fin son travail avec le code veux juste savoir de vous :))? –

+0

Cela me semble raisonnable :) Je note également qu'il y a hs.network.reachability si vous voulez détecter si les différentes formes de connectivité fonctionnent (par exemple, un hôte particulier est routable, n'importe quel routable sur Internet, est un routable VPN , etc.) –

+0

Cool. Merci pour cet excellent outil, Chris. Aimer :) :) –