CloudAMQP with MQTT and Ruby Getting started

Currently the most mature client library for Ruby is the synchronous ruby-mqtt. The async em-mqtt library need to support user/password before it's usable with CloudAMQP MQTT protocol.

First you need to add mqtt as a dependency to your Gemfile and execute bundle install

In the following code snippet you can see how to publish and subscribe from CloudAMQP MQTT. Note that the client is synchronous so you have to use threads if you want to subscribe and in the same time do other things.

CLOUDAMQP_MQTT_URL Structure mqtt://cloudamqp_username:cloudamqp_password@hostname:port

Code example Publish and subscribe

require 'mqtt'
require 'uri'

# Create a hash with the connection parameters from the URL
uri = URI.parse ENV['CLOUDAMQP_MQTT_URL'] || 'mqtt://localhost:1883'
conn_opts = {
  remote_host: uri.host,
  remote_port: uri.port,
  username: uri.user,
  password: uri.password,
}

Thread.new do
  MQTT::Client.connect(conn_opts) do |c|
    # The block will be called when you messages arrive to the topic
    c.get('test') do |topic, message|
      puts "#{topic}: #{message}"
    end
  end
end

MQTT::Client.connect(conn_opts) do |c|
  # publish a message to the topic 'test'
  loop do
    c.publish('test', 'Hello World')
    sleep 1
  end
end

Full sample code can be found here. Worth noting is that the client does not yet support other QoS levels than 0, ie. no publish acknowledge or redelivery.