Hi everyone,
I'm currently researching the capabilities of a SmartDust network, my
goal is to build an application that will get statistics from a network
management device.
The device is connected to my networkcontroller, I can request for
information using xml-rpc. This part of the application works (more or
less), but here's the problem.
The device can also detect network events, and spam them back (xml) to
the pc. The procedure is like this:
1. Connect to the management device
2. Login with credentials
3. Ask for a event-port
4. Listen on this port for incoming data
Asking the device for stats was quite straightforward, but I don't have
a clue how to capture/parse the incoming data. (threads? xml-rpc
server?)
I have included some (read: most) information about the device as
attachment, and copy-pasted my basestation-class below. Sorry for the
long-ish post. (EDIT: to bad, the pdf file was slightly too large...)
Everyone told me to go Java, but stubborn me decided to go Ruby, so I
now have to prove Im not a total idiot after all =) Thanks in advance,
'cause I'm really stuck at this one .. =(
#required libraries
require 'xmlrpc/client'
require 'socket'
require 'pp'
class BaseStation
#constructor that will create a token that can be
#used in other xml-rpc requests or an error message
#if the logincredentials are incorrect
def initialize(username, password, url = "192.168.99.100", port =
"4445")
@url = url;
@port = port;
@username = username;
@password = password
begin
@client = XMLRPC::Client.new3({ :port => port, :host => url })
result = @client.call "login", username, password
@token = result
rescue
puts "Something went wrong"
false
end
end
#method that will generate a configuration
#request, the return value depends on the
#querystring
def get_config(depth, query)
begin
result = @client.call "getConfig", @token, depth, query
rescue
puts "Something went wrong"
false
end
end
#method that will subscribe user to all notifications
#the return value is a portnumber where these notifications
#will occur
def get_notification_port(notification = "all")
begin
result = @client.call "subscribe", @token, notification
result[1]
rescue
puts "Something went wrong"
false
end
end
#method that will spam the notifications generated by the
#base-station directly to the terminal
def start_listening_for_notifications(port = 0)
port = get_notification_port()
pp port
server = TCPserver.new("0.0.0.0", get_notification_port())
loop do
Thread.start(server.accept) do |s|
print(server, " is accepted\n")
s.write(Time.now)
print(server, " is gone\n")
s.close
end
end
end
#getter for the token variable
def login_token
@token
end
end
···
--
Posted via http://www.ruby-forum.com/.