首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查用户是否通过wifi或LAN通过锤匙连接

如何检查用户是否通过wifi或LAN通过锤匙连接
EN

Stack Overflow用户
提问于 2016-09-13 16:19:18
回答 3查看 836关注 0票数 6

我正在考虑有一个锤击匙wifi观察者,它做一个定期检查,并将禁用wifi,如果它没有连接。

下面的脚本可以这样做,

代码语言:javascript
复制
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()

在这里,我面临着一个问题,如果用户已经通过局域网连接了,该怎么办?在这个时候,我不需要启用这个观察器(以便停止切换wifi的开关)。因此,我需要的是,是否有API可以告诉我,用户是否已经通过局域网连接,或至少连接到互联网?

我说清楚了吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-13 16:26:49

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

代码语言:javascript
复制
status, data, headers = hs.http.get("http://google.com")

因此,当您检查status变量时,如果它是在线的,它将给出200,如果它是脱机的,它将给出0。因此,通过检查这个变量,我可以解决这个问题。

如果我没有错,如果锤子公开了一个API,如果它连接与否,是否返回一个BOOL,那就太好了。也可以通过WiFi或局域网。

更新:现在这个围绕的工作并不能完全解决系统通过局域网连接时的问题。由于我不知道它是通过局域网连接还是通过WiFi连接,所以不能直接关闭WiFi 。因此,目前的解决办法似乎很乏味。

代码语言:javascript
复制
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:

看起来哈默斯彭(0.9.47)已经有了这个的解决方案。使用Chris给出的解决方案更新代码,

代码语言:javascript
复制
  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
票数 4
EN

Stack Overflow用户

发布于 2016-09-13 16:22:22

基本上你只需要点击谷歌。如果你得到一个输出,并且没有通过无线网络连接,你就可以启动无线网络。那是我的主意

票数 2
EN

Stack Overflow用户

发布于 2016-09-16 11:28:06

0.9.47在hs.network中有一些新特性,在这里应该会有所帮助。

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

v4,v6 = hs.network.primaryInterfaces()

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39474726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档