我正在考虑使用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可以告诉我用户是通过局域网连接还是至少连接到互联网?
我清楚了吗?
答案 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上。