class MqttRails::Packet::Connect

Constants

ATTR_DEFAULTS

Default attribute values

Attributes

clean_session[RW]

Set to false to keep a persistent session with the server

client_id[RW]

The client identifier string

keep_alive[RW]

Period the server should keep connection open for between pings

password[RW]

The password for authenticating with the server

protocol_level[RW]

The version number of the protocol

protocol_name[RW]

The name of the protocol

username[RW]

The username for authenticating with the server

will_payload[RW]

The payload of the Will message

will_qos[RW]

The QoS level to send the Will message as

will_retain[RW]

Set to true to make the Will message retained

will_topic[RW]

The topic name to send the Will message to

Public Class Methods

new(args={}) click to toggle source

Create a new Client Connect packet

Calls superclass method MqttRails::Packet::Base::new
# File lib/mqtt_rails/packet/connect.rb, line 70
def initialize(args={})
  super(ATTR_DEFAULTS.merge(args))

  if version == '3.1.0' || version == '3.1'
    self.protocol_name ||= 'MQIsdp'
    self.protocol_level ||= 0x03
  elsif version == '3.1.1'
    self.protocol_name ||= 'MQTT'
    self.protocol_level ||= 0x04
  else
    raise MqttRails::PacketFormatException.new(
            "Unsupported protocol version: #{version}")
  end
end

Public Instance Methods

check_version() click to toggle source
# File lib/mqtt_rails/packet/connect.rb, line 109
def check_version
  if @version == '3.1.0'
    if @client_id.nil? || @client_id.bytesize < 1
      raise MqttRails::PacketFormatException.new(
              "Client identifier too short while serialising packet")
    elsif @client_id.bytesize > 23
      raise MqttRails::PacketFormatException.new(
              "Client identifier too long when serialising packet")
    end
  end
end
encode_body() click to toggle source

Get serialisation of packet's body

# File lib/mqtt_rails/packet/connect.rb, line 86
def encode_body
  body = ''
  check_version
  body += encode_string(@protocol_name)
  body += encode_bytes(@protocol_level.to_i)
  if @keep_alive < 0
    raise MqttRails::PacketFormatException.new(
            "Invalid keep-alive value: cannot be less than 0")
  end

  body += encode_flags(@connect_flags)
  body += encode_short(@keep_alive)
  body += encode_string(@client_id)
  unless will_topic.nil?
    body += encode_string(@will_topic)
    # The MQTT v3.1 specification says that the payload is a UTF-8 string
    body += encode_string(@will_payload)
  end
  body += encode_string(@username) unless @username.nil?
  body += encode_string(@password) unless @password.nil?
  body
end
encode_flags(flags) click to toggle source
# File lib/mqtt_rails/packet/connect.rb, line 121
def encode_flags(flags)
  # Set the Connect flags
  flags = 0
  flags |= 0x02 if @clean_session
  flags |= 0x04 unless @will_topic.nil?
  flags |= ((@will_qos & 0x03) << 3)
  flags |= 0x20 if @will_retain
  flags |= 0x40 unless @password.nil?
  flags |= 0x80 unless @username.nil?
  encode_bytes(flags)
end
inspect() click to toggle source

Returns a human readable string, summarising the properties of the packet

# File lib/mqtt_rails/packet/connect.rb, line 172
def inspect
  str = "\#<#{self.class}: "
  str += "keep_alive=#{keep_alive}"
  str += ", clean" if clean_session
  str += ", client_id='#{client_id}'"
  str += ", username='#{username}'" unless username.nil?
  str += ", password=..." unless password.nil?
  str += ">"
end
parse_body(buffer) click to toggle source

Parse the body (variable header and payload) of a Connect packet

Calls superclass method MqttRails::Packet::Base#parse_body
# File lib/mqtt_rails/packet/connect.rb, line 134
def parse_body(buffer)
  super(buffer)
  @protocol_name = shift_string(buffer)
  @protocol_level = shift_byte(buffer).to_i
  if @protocol_name == 'MQIsdp' && @protocol_level == 3
    @version = '3.1.0'
  elsif @protocol_name == 'MQTT' && @protocol_level == 4
    @version = '3.1.1'
  else
    raise MqttRails::PacketFormatException.new(
            "Unsupported protocol: #{@protocol_name}/#{@protocol_level}")
  end

  @connect_flags = shift_byte(buffer)
  @keep_alive = shift_short(buffer)
  @client_id = shift_string(buffer)
  parse_connect_flags(@connect_flag, buffer)
end
parse_connect_flags(flags, buffer) click to toggle source
# File lib/mqtt_rails/packet/connect.rb, line 153
def parse_connect_flags(flags, buffer)
  @clean_session = ((@connect_flags & 0x02) >> 1) == 0x01
  if ((flags & 0x04) >> 2) == 0x01
    # Last Will and Testament
    @will_qos = ((flags & 0x18) >> 3)
    @will_retain = ((flags & 0x20) >> 5) == 0x01
    @will_topic = shift_string(buffer)
    # The MQTT v3.1 specification says that the payload is a UTF-8 string
    @will_payload = shift_string(buffer)
  end
  if ((@connect_flags & 0x80) >> 7) == 0x01 && buffer.bytesize > 0
    @username = shift_string(buffer)
  end
  if ((@connect_flags & 0x40) >> 6) == 0x01 && buffer.bytesize > 0
    @password = shift_string(buffer)
  end
end