Skip to main content

Hello World TRP in Ruby

Lets look at a sample program in Ruby that sends a Hello Request command to Trisul and gets back a Hello Response.

Also see : Programming model , Messages and Fields

div(info). Pre-requisites You must have Ruby installed on your machine

Step 1 : Install required gems

As root run

  gem install protobuf
gem install ffi-rzmq

Step 2 : Generate the Ruby TRP definitions

The TRP protocol is completely defined in a file called trp.proto. Download the file and save it in your working directory. You then need to process the trp.proto file and generate bindings for your language.

C:\Users\Vivek\Documents\devbo>protoc trp.proto --ruby_out . ./trp.pb.rb writing...

Step 3 : Save and run this program

Lets get to the good stuff first. Run this program first and understand the output. We can explain the parts in the next section.

Save this program into your working directory.

if RUBY_VERSION =~ /1.8/
require 'rubygems'
gem 'ruby_protobuf'
end

require './trp.pb'
begin
FFI_RZMQ_AVAIL=true
require 'ffi-rzmq'
rescue
FFI_RZMQ_AVAIL=false
end

# dispatch and get trp response
def get_trp_response(endpoint,trp_request,timeout_seconds=-1)

outbuf=""

# out
outbuf=trp_request.encode
ctx=ZMQ::Context.new
sock = ctx.socket(ZMQ::REQ)

# time out for context termination
sock.setsockopt(ZMQ::LINGER, 5*1_000)

# Initialize a poll set
poller = ZMQ::Poller.new
poller.register(sock, ZMQ::POLLIN)


sock.connect(endpoint)
sock.send_string(outbuf)

ret = poller.poll(timeout_seconds * 1_000 )
if ret == -1
sock.close
ctx.terminate
raise "zeromq poll error #{endpoint} "
end
if ret == 0
sock.close
ctx.terminate
raise "no registerted sockets #{endpoint} "
end

poller.readables.each do |rsock|
#in
dataarray=""
rsock.recv_string(dataarray)
resp =TRP::Message.new
resp.decode dataarray
if resp.trp_command.to_i == TRP::Message::Command::ERROR_RESPONSE
print "TRP ErrorResponse: #{resp.error_response.error_message}\n"
rsock.close
ctx.terminate
raise resp.error_response.error_message
end

rsock.close
ctx.terminate
#unwrap_resp = unwrap_response(resp)
#unwrap_resp.instance_variable_set("@trp_resp_command_id",resp.trp_command.to_i)
yield resp if block_given?
return resp

end
end


raise "Usage : $0 trp_zmq_endpount" if ARGV.length !=1
conn = ARGV.shift

# create a new command of type HelloRequest
request=TRP::Message.new
request.trp_command = TRP::Message::Command::HELLO_REQUEST
request.hello_request =TRP::HelloRequest.new
request.hello_request.station_id = "TRP_TUTORIAL"

get_trp_response(conn,request) do |response|
puts "Got Hello Response"
puts "Station ID : " + response.hello_response.station_id
puts "Station ID Request: " + response.hello_response.station_id_request
puts "Message : " + response.hello_response.message

end

Run the program

Before you run the program :

  1. You need to know the zmq endpoint of the trp server
  2. Ensure that the linux firewall allows endpoint connection through

Now run the program

    $ruby testtrp.rb ipc:///usr/local/var/lib/trisul-hub/domain0/hub0/context0/run/trp_0

Got Hello Response
Got Hello Response
Station ID : TRP:1
Station ID Request : TRP_TUTORIAL
Message : hello from trp