6

我正在考虑有一个hammerspoon wifi watcher,它会定期检查并在wifi未连接时禁用wifi。

以下脚本执行此操作,

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()

在这里,我遇到了一个问题,例如如果用户已经通过 LAN 连接了怎么办。此时我不需要启用此观察程序(以停止打开和关闭 wifi 的切换)。所以我需要的是,是否有任何 API 可以告诉我用户是否已经通过 LAN 连接或至少连接到互联网?

我清楚了吗?

4

3 回答 3

4

在发布问题后,我得到了一个类似于@TheFrenchPlays 的想法。这是我目前通过hammerspoon扩展这个想法的方法,

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

因此,当您检查状态变量时,如果它在线,它将给出 200,如果它离线,它将给出 0。所以通过检查这个变量,我可以解决这个问题。

如果没记错的话,如果hammerspoon 公开一个API,不管它是否连接都返回一个BOOL,那就太好了。也可以通过 WiFi 或 LAN。

更新:目前,当系统通过 LAN 连接时,这种解决方法并不能完全解决问题。由于我不知道它是通过 LAN 连接还是 WiFi 连接,所以我无法直接关闭 WiFi。因此,当前的解决方法似乎很乏味

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()

更新 2:

看起来Hammerspoon (0.9.47) 对此有解决方案。使用 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
于 2016-09-13T16:26:49.757 回答
2

0.9.47 在 hs.network 中有一些新功能应该会有所帮助。

hs.network.primaryInterfaces() 返回两个值,显示 ipv4 和 ipv6 流量的默认接口,因此如果您要执行以下操作:

v4,v6 = hs.network.primaryInterfaces()

然后,假设您最关心 v4,您可以检查 hs.network.interfaceDetails(v4)["AirPort"] 是否为零。如果它是 nil 你不在 WiFi 接口上,如果它是一个充满 wifi 值的表,你在 wifi 上。

于 2016-09-16T11:28:06.013 回答
2

基本上你可以ping google。如果你得到一个输出,并且没有通过 wifi 网络连接,你可以关闭 wifi。这就是我的想法

于 2016-09-13T16:22:22.513 回答