I am trying to create an application written in ruby which communicates
with multiple input/output interfaces over TCP/IP. The IO interface I am
using is called a NETIOM. The interface has 16 digital inputs and 16
digital outputs.
For us it is more important to know the protocol that this device
speaks (I mean the _network_ protocol which you are trying to
utilize).
This code works for one Netiom device and is also able to detect inputs
being pressed but the code exits after a little while. I have been
experimenting with classes and arrays but not getting anywhere.
require 'socket'
server = TCPServer.open(3012)
@socket = server.accept
@socket.puts "SEND\r\n"
This should be @socket.write "SEND\r\n".
while line = @socket.gets
If your line terminator is "\r\n" then you probably also want to use
TERM = "\r\n".freeze
while line = @socket.gets TERM
puts line.chop
I'd rather use
line.chomp! TERM
end
this code returns:
Digital inputs 1-8 : 11111111
Digital inputs 9-16: 11111111
Digital outputs 1-8 : 00000000
Digital outputs 9-16: 00000000
It would be great if I can have some help with the following:
> handling multiple interfaces
Not sure what that means. Do you want multiple clients to connect?
> being able to send a message to a single interface and then see its
response
You may want to look at IO#expect ("ri19 IO#expect").
> 'doing something' when an input is triggered and being able to
identify which input and interface it was triggered on.
Take a look at this for more info.
sockets - Using Ruby to connect with multiple IP Input output interface, Netiom - Stack Overflow
I'd start by creating a handler class per connection. This could look
like this:
require 'socket'
class DeviceHandler
TERM = "\r\n".freeze
def initialize(socket)
@socket = socket
@thread = Thread.new do
@socket.each_line TERM do |line|
data = parse(line)
end
end
end
# more methods...
private
def send(...)
@socket.write(... + TERM)
end
end
server = TCPServer.open(3012)
handlers =
while (client = server.accept)
handlers << DeviceHandler.new(client)
end
But how this is really set up (and especially if you need to start a
thread in the constructor) hugely depends on the protocol spoken by
the device and what you want to do with it.
Cheers
robert
···
On Mon, Feb 21, 2011 at 3:15 PM, Nick Jackson <nick.jackson25@gmail.com> wrote:
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/