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

时间:2016-09-13 16:19:19

标签: automation applescript 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()

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

我清楚了吗?

3 个答案:

答案 0 :(得分:3)

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

$(function () {
    $.getJSON('https://www.highcharts.com/samples/data/jsonp.php?    filename=usdeur.json&callback=?', function (data) {

    $('#container').highcharts({
        chart: {
            zoomType: 'x'
        },
        title: {
            text: 'USD to EUR exchange rate over time'
        },
        subtitle: {
            text: document.ontouchstart === undefined ?
                    'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'
        },
        xAxis: {
            type: 'datetime'
        },
        yAxis: {
            title: {
                text: 'Exchange rate'
            }
        },
        legend: {
            enabled: false
        },
        plotOptions: {
            area: {
                fillColor: {
                    linearGradient: {
                        x1: 0,
                        y1: 0,
                        x2: 0,
                        y2: 1
                    },
                    stops: [
                        [0, Highcharts.getOptions().colors[0]],
                        [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
                    ]
                },
                marker: {
                    radius: 2
                },
                lineWidth: 1,
                states: {
                    hover: {
                        lineWidth: 1
                    }
                },
                threshold: null
            }
        },

        series: [{
            type: 'area',
            name: 'USD to EUR',
            data: data
        }]
    });
});

因此,当您检查状态变量时,如果它处于联机状态,则会给出200;如果它处于脱机状态,则为0。因此,通过检查此变量,我可以解决此问题。

如果没有错,那么如果Hammerspoon暴露一个API,如果它连接或不连接则返回BOOL会很好。还可以通过WiFi或LAN。

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

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

更新2:

看起来 Hammerspoon(0.9.47)有解决方案。使用Chris提供的解决方案更新代码,

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

答案 1 :(得分:2)

基本上你可以ping谷歌。如果你得到一个输出,并且没有通过wifi网络连接,你可以设置wifi。多数民众赞成我的想法

答案 2 :(得分:1)

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

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

v4,v6 = hs.network.primaryInterfaces()

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