[Ruby] Abfrage / Schalten (korr.)
Verfasst: Sonntag 11. Oktober 2009, 16:43
Hier zwei Proof-of-Concept Skripte, zuerst die Abfrage, die mit meiner Home-Leiste (2.96) / OS X 10.6.1 / Ruby 1.8.7 einwandfrei funktioniert.
[code0t0]require 'socket'
require 'pp'
abort 'Usage: broadcast_addr send_port receive_port' unless ARGV.length == 3
UDP_RECV_TIMEOUT = 1 # seconds
def pwrctrl(ip, send_port, recv_port)
extensions = Hash.new
begin
cmd = "wer da?\015\012"
sendSocket = UDPSocket.new
sendSocket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
sendSocket.send(cmd, 0, ip, send_port)
recvSocket = UDPSocket.new
recvSocket.bind('0.0.0.0', recv_port)
while select([recvSocket], nil, nil, UDP_RECV_TIMEOUT)
resp = recvSocket.recvfrom(65536)
fields = resp[0].split(':')
ext_ip = fields[2]
extensions[ext_ip] = fields
end
rescue IOError, SystemCallError
ensure
sendSocket.close if sendSocket
recvSocket.close if recvSocket
end
return extensions
end
ip, send_port, recv_port = *ARGV
result = pwrctrl(ip, send_port, recv_port)
pp(result)
[/code0t0]
Nach kleiner Korrektur funktioniert jetzt auch das schalten:
[code0t0]require 'socket'
require 'pp'
abort 'Usage: ip_addr send_port outlet_nr ON|OFF' unless ARGV.length == 4
PASSWORD = 'user' # you might want to change this
def pwrctrl_switch(ip, port, outlet, state)
begin
cmd = state + outlet + PASSWORD + "\000\015\012"
pp(cmd)
s = UDPSocket.new
s.send(cmd, 0, ip, port)
rescue IOError, SystemCallError
ensure
s.close if s
end
end
ip, port, outlet, state = *ARGV
new_state = 'Sw_on' if state == 'ON'
new_state = 'Sw_off' if state == 'OFF'
abort 'Invalid state speicified' if not new_state
pwrctrl_switch(ip, port, outlet, new_state)[/code0t0]
[code0t0]require 'socket'
require 'pp'
abort 'Usage: broadcast_addr send_port receive_port' unless ARGV.length == 3
UDP_RECV_TIMEOUT = 1 # seconds
def pwrctrl(ip, send_port, recv_port)
extensions = Hash.new
begin
cmd = "wer da?\015\012"
sendSocket = UDPSocket.new
sendSocket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
sendSocket.send(cmd, 0, ip, send_port)
recvSocket = UDPSocket.new
recvSocket.bind('0.0.0.0', recv_port)
while select([recvSocket], nil, nil, UDP_RECV_TIMEOUT)
resp = recvSocket.recvfrom(65536)
fields = resp[0].split(':')
ext_ip = fields[2]
extensions[ext_ip] = fields
end
rescue IOError, SystemCallError
ensure
sendSocket.close if sendSocket
recvSocket.close if recvSocket
end
return extensions
end
ip, send_port, recv_port = *ARGV
result = pwrctrl(ip, send_port, recv_port)
pp(result)
[/code0t0]
Nach kleiner Korrektur funktioniert jetzt auch das schalten:
[code0t0]require 'socket'
require 'pp'
abort 'Usage: ip_addr send_port outlet_nr ON|OFF' unless ARGV.length == 4
PASSWORD = 'user' # you might want to change this
def pwrctrl_switch(ip, port, outlet, state)
begin
cmd = state + outlet + PASSWORD + "\000\015\012"
pp(cmd)
s = UDPSocket.new
s.send(cmd, 0, ip, port)
rescue IOError, SystemCallError
ensure
s.close if s
end
end
ip, port, outlet, state = *ARGV
new_state = 'Sw_on' if state == 'ON'
new_state = 'Sw_off' if state == 'OFF'
abort 'Invalid state speicified' if not new_state
pwrctrl_switch(ip, port, outlet, new_state)[/code0t0]