如何检查用户是否通过wifi或LAN通过hammerspoon连接

Gop*_*iva 5 applescript automation hammerspoon

我想有一个Hammerspoon 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()
Run Code Online (Sandbox Code Playgroud)

在这里,我面临一个问题,比如用户是否已通过LAN连接.在这个时间点我不需要启用这个观察者(以便停止开启和关闭wifi).所以我需要的是,是否有任何API可以告诉我用户是通过局域网连接还是至少连接到互联网?

我清楚了吗?

Gop*_*iva 4

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

status, data, headers = hs.http.get("http://google.com")
Run Code Online (Sandbox Code Playgroud)

因此,当您检查状态变量时,如果在线,则会给出 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()
Run Code Online (Sandbox Code Playgroud)

更新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
Run Code Online (Sandbox Code Playgroud)