2016-09-13 22 views
5

Tôi đang nghĩ đến việc có một bộ theo dõi wifi hammerspoon, kiểm tra định kỳ và tắt wifi nếu không kết nối.Cách kiểm tra xem người dùng có được kết nối qua wifi hoặc LAN qua hammerspoon

Các kịch bản sau đây thực hiện điều này,

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

Ở đây tôi đang phải đối mặt với một vấn đề như thế nào nếu người dùng đã được kết nối qua mạng LAN. Tại thời điểm này tôi không cần phải kích hoạt tính năng này watcher (để ngừng làm việc chuyển đổi của wifi ON và OFF). Vì vậy, những gì tôi cần là, Có bất kỳ API mà có thể cho tôi biết liệu người dùng đã được kết nối thông qua mạng LAN hoặc ít nhất là kết nối với internet?

Tôi có rõ ràng không?

Trả lời

3

Ngay sau khi đăng câu hỏi, tôi có ý tưởng tương tự như @TheFrenchPlays. Đây là cách tiếp cận hiện tại của tôi về việc mở rộng ý tưởng này qua hammerspoon,

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

vì vậy khi bạn kiểm tra biến trạng thái, nó sẽ cho 200 nếu nó trực tuyến và 0 nếu nó ngoại tuyến. Vì vậy, bằng cách kiểm tra biến này, tôi có thể giải quyết vấn đề này.

Nếu không sai, nó sẽ là tuyệt vời nếu búa ra một API cho dù trả về một BOOL nếu nó kết nối hay không. Và cũng thông qua WiFi hoặc mạng LAN.

UPDATE: Ngay bây giờ công việc này khoảng không giải quyết được vấn đề hoàn toàn khi hệ thống được kết nối qua mạng LAN. Vì tôi không biết liệu kết nối của nó qua mạng LAN hay WiFi, Tôi không thể TẮT WiFi trực tiếp. Do đó cách giải quyết hiện nay dường như tẻ nhạt

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

UPDATE 2:

Hình như Hammerspoon (0.9.47) có giải pháp cho này. Cập nhật mã bằng cách sử dụng giải pháp do Chris cung cấp,

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 
2

về cơ bản bạn chỉ có thể ping google. Nếu bạn nhận được một đầu ra, và không được kết nối máng một mạng wifi, bạn chỉ có thể thiết lập wifi. Thats ý tưởng của tôi

+0

Đánh giá cao ý tưởng dude –

+0

cảm ơn bạn rất nhiều :). –

+0

vì tôi không có danh tiếng để trả lời bài đăng của bạn: bạn không thể thấy tên của conector không dây? nếu vậy, bạn có thể chỉ cần kiểm tra, nếu tên là trống –

1

0.9.47 có một số tính năng mới trong hs.network sẽ trợ giúp tại đây.

hs.network.primaryInterfaces() trả về hai giá trị, cho thấy giao diện mặc định cho ipv4 và giao thông ipv6, vì vậy nếu bạn đã làm điều gì đó như:

v4, v6 = hs.network.primaryInterfaces()

sau đó, giả sử bạn quan tâm nhất về v4, bạn có thể kiểm tra xem hs.network.interfaceDetails (v4) ["AirPort"] là không. Nếu nó là nil bạn không phải trên một giao diện WiFi, nếu đó là một bảng đầy đủ các giá trị wifi, bạn đang trên wifi.

+0

Đánh giá cao giải pháp đã cho. Dựa trên sự hiểu biết của tôi, tôi đã cập nhật câu trả lời của mình ở trên bằng cách sử dụng hs.network.interfaceDetails (v4). Bạn có thể vui lòng xác nhận tôi, đó là một giải pháp đúng (mặc dù tôi đã kiểm tra kết thúc của tôi làm việc của nó với mã chỉ muốn biết từ bạn :))? –

+0

Có vẻ hợp lý với tôi :) Tôi cũng lưu ý rằng có hs.network.reachability nếu bạn muốn phát hiện xem các dạng kết nối khác nhau có hoạt động không (ví dụ như một máy chủ lưu trữ có thể định tuyến được). , vv) –

+0

Tuyệt. Cảm ơn một công cụ tuyệt vời, Chris. Yêu thích nó :) –

Các vấn đề liên quan