paho-mqtt 1.0.7 → 1.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -29,7 +29,8 @@ module PahoMqtt
29
29
  def parse_body(buffer)
30
30
  super(buffer)
31
31
  unless buffer.empty?
32
- raise "Extra bytes at end of Disconnect packet"
32
+ raise PacketFormatException.new(
33
+ "Extra bytes at the end of Disconnect packet")
33
34
  end
34
35
  end
35
36
  end
@@ -29,7 +29,8 @@ module PahoMqtt
29
29
  def parse_body(buffer)
30
30
  super(buffer)
31
31
  unless buffer.empty?
32
- raise "Extra bytes at end of Ping Response packet"
32
+ raise PahoMqtt::PacketFormatException.new(
33
+ "Extra bytes at end of Ping Response packet")
33
34
  end
34
35
  end
35
36
  end
@@ -30,7 +30,8 @@ module PahoMqtt
30
30
  super(buffer)
31
31
  @id = shift_short(buffer)
32
32
  unless buffer.empty?
33
- raise "Extra bytes at end of Publish Acknowledgment packet"
33
+ raise PahoMqtt::PacketFormatException.new(
34
+ "Extra bytes at end of Publish Acknowledgment packet")
34
35
  end
35
36
  end
36
37
 
@@ -30,7 +30,8 @@ module PahoMqtt
30
30
  super(buffer)
31
31
  @id = shift_short(buffer)
32
32
  unless buffer.empty?
33
- raise "Extra bytes at end of Publish Complete packet"
33
+ raise PahoMqtt::PacketFormatException.new(
34
+ "Extra bytes at end of Publish Complete packet")
34
35
  end
35
36
  end
36
37
 
@@ -37,7 +37,7 @@ module PahoMqtt
37
37
 
38
38
  # Default attribute values
39
39
  ATTR_DEFAULTS = {
40
- :topic => nil,
40
+ :topic => nil,
41
41
  :payload => ''
42
42
  }
43
43
 
@@ -79,8 +79,9 @@ module PahoMqtt
79
79
  # Set the Quality of Service level (0/1/2)
80
80
  def qos=(arg)
81
81
  @qos = arg.to_i
82
- if @qos < 0 or @qos > 2
83
- raise "Invalid QoS value: #{@qos}"
82
+ if @qos < 0 || @qos > 2
83
+ raise PahoMqtt::PacketFormatException.new(
84
+ "Invalid QoS value: #{@qos}")
84
85
  else
85
86
  @flags[1] = (arg & 0x01 == 0x01)
86
87
  @flags[2] = (arg & 0x02 == 0x02)
@@ -90,8 +91,9 @@ module PahoMqtt
90
91
  # Get serialisation of packet's body
91
92
  def encode_body
92
93
  body = ''
93
- if @topic.nil? or @topic.to_s.empty?
94
- raise "Invalid topic name when serialising packet"
94
+ if @topic.nil? || @topic.to_s.empty?
95
+ raise PahoMqtt::PacketFormatException.new(
96
+ "Invalid topic name when serialising packet")
95
97
  end
96
98
  body += encode_string(@topic)
97
99
  body += encode_short(@id) unless qos == 0
@@ -102,8 +104,8 @@ module PahoMqtt
102
104
  # Parse the body (variable header and payload) of a Publish packet
103
105
  def parse_body(buffer)
104
106
  super(buffer)
105
- @topic = shift_string(buffer)
106
- @id = shift_short(buffer) unless qos == 0
107
+ @topic = shift_string(buffer)
108
+ @id = shift_short(buffer) unless qos == 0
107
109
  @payload = buffer
108
110
  end
109
111
 
@@ -111,10 +113,12 @@ module PahoMqtt
111
113
  # @private
112
114
  def validate_flags
113
115
  if qos == 3
114
- raise "Invalid packet: QoS value of 3 is not allowed"
116
+ raise PahoMqtt::PacketFormatException.new(
117
+ "Invalid packet: QoS value of 3 is not allowed")
115
118
  end
116
- if qos == 0 and duplicate
117
- raise "Invalid packet: DUP cannot be set for QoS 0"
119
+ if qos == 0 && duplicate
120
+ raise PahoMqtt::PacketFormatException.new(
121
+ "Invalid packet: DUP cannot be set for QoS 0")
118
122
  end
119
123
  end
120
124
 
@@ -133,7 +137,7 @@ module PahoMqtt
133
137
 
134
138
  def inspect_payload
135
139
  str = payload.to_s
136
- if str.bytesize < 16 and str =~ /^[ -~]*$/
140
+ if str.bytesize < 16 && str =~ /^[ -~]*$/
137
141
  "'#{str}'"
138
142
  else
139
143
  "... (#{str.bytesize} bytes)"
@@ -30,7 +30,8 @@ module PahoMqtt
30
30
  super(buffer)
31
31
  @id = shift_short(buffer)
32
32
  unless buffer.empty?
33
- raise "Extra bytes at end of Publish Received packet"
33
+ raise PahoMqtt::PacketFormatException.new(
34
+ "Extra bytes at end of Publish Received packet")
34
35
  end
35
36
  end
36
37
 
@@ -48,7 +48,8 @@ module PahoMqtt
48
48
  # @private
49
49
  def validate_flags
50
50
  if @flags != [false, true, false, false]
51
- raise "Invalid flags in PUBREL packet header"
51
+ raise PahoMqtt::PacketFormatException.new(
52
+ "Invalid flags in #{type_name} packet header")
52
53
  end
53
54
  end
54
55
 
@@ -41,14 +41,16 @@ module PahoMqtt
41
41
  elsif value.is_a?(Integer)
42
42
  @return_codes = [value]
43
43
  else
44
- raise "return_codes should be an integer or an array of return codes"
44
+ raise PahoMqtt::PacketFormatException.new(
45
+ "return_codes should be an integer or an array of return codes")
45
46
  end
46
47
  end
47
48
 
48
49
  # Get serialisation of packet's body
49
50
  def encode_body
50
51
  if @return_codes.empty?
51
- raise "no granted QoS given when serialising packet"
52
+ raise PahoMqtt::PacketFormatException.new(
53
+ "No granted QoS given when serialising packet")
52
54
  end
53
55
  body = encode_short(@id)
54
56
  return_codes.each { |qos| body += encode_bytes(qos) }
@@ -59,14 +61,14 @@ module PahoMqtt
59
61
  def parse_body(buffer)
60
62
  super(buffer)
61
63
  @id = shift_short(buffer)
62
- while(buffer.bytesize>0)
64
+ while buffer.bytesize > 0
63
65
  @return_codes << shift_byte(buffer)
64
66
  end
65
67
  end
66
68
 
67
69
  # Returns a human readable string, summarising the properties of the packet
68
70
  def inspect
69
- "\#<#{self.class}: 0x%2.2X, rc=%s>" % [id, return_codes.map{|rc| "0x%2.2X" % rc}.join(',')]
71
+ "\#<#{self.class}: 0x%2.2X, rc=%s>" % [id, return_codes.map { |rc| "0x%2.2X" % rc }.join(',')]
70
72
  end
71
73
  end
72
74
  end
@@ -64,13 +64,14 @@ module PahoMqtt
64
64
  # Peek at the next item in the array, and remove it if it is an integer
65
65
  if input.first.is_a?(Integer)
66
66
  qos = input.shift
67
- @topics << [item,qos]
67
+ @topics << [item, qos]
68
68
  else
69
- @topics << [item,0]
69
+ @topics << [item, 0]
70
70
  end
71
71
  else
72
72
  # Meh?
73
- raise "Invalid topics input: #{value.inspect}"
73
+ raise PahoMqtt::PacketFormatException.new(
74
+ "Invalid topics input: #{value.inspect}")
74
75
  end
75
76
  end
76
77
  @topics
@@ -79,7 +80,8 @@ module PahoMqtt
79
80
  # Get serialisation of packet's body
80
81
  def encode_body
81
82
  if @topics.empty?
82
- raise "no topics given when serialising packet"
83
+ raise PahoMqtt::PacketFormatException.new(
84
+ "No topics given when serialising packet")
83
85
  end
84
86
  body = encode_short(@id)
85
87
  topics.each do |item|
@@ -97,7 +99,7 @@ module PahoMqtt
97
99
  while(buffer.bytesize>0)
98
100
  topic_name = shift_string(buffer)
99
101
  topic_qos = shift_byte(buffer)
100
- @topics << [topic_name,topic_qos]
102
+ @topics << [topic_name, topic_qos]
101
103
  end
102
104
  end
103
105
 
@@ -105,7 +107,8 @@ module PahoMqtt
105
107
  # @private
106
108
  def validate_flags
107
109
  if @flags != [false, true, false, false]
108
- raise "Invalid flags in SUBSCRIBE packet header"
110
+ raise PahoMqtt::PacketFormatException.new(
111
+ "Invalid flags in SUBSCRIBE packet header")
109
112
  end
110
113
  end
111
114
 
@@ -113,7 +116,7 @@ module PahoMqtt
113
116
  def inspect
114
117
  _str = "\#<#{self.class}: 0x%2.2X, %s>" % [
115
118
  id,
116
- topics.map {|t| "'#{t[0]}':#{t[1]}"}.join(', ')
119
+ topics.map { |t| "'#{t[0]}':#{t[1]}" }.join(', ')
117
120
  ]
118
121
  end
119
122
  end
@@ -35,7 +35,8 @@ module PahoMqtt
35
35
  super(buffer)
36
36
  @id = shift_short(buffer)
37
37
  unless buffer.empty?
38
- raise "Extra bytes at end of Unsubscribe Acknowledgment packet"
38
+ raise PahoMqtt::PacketFormatException.new(
39
+ "Extra bytes at end of Unsubscribe Acknowledgment packet")
39
40
  end
40
41
  end
41
42
 
@@ -26,7 +26,7 @@ module PahoMqtt
26
26
  # Default attribute values
27
27
  ATTR_DEFAULTS = {
28
28
  :topics => [],
29
- :flags => [false, true, false, false],
29
+ :flags => [false, true, false, false],
30
30
  }
31
31
 
32
32
  # Create a new Unsubscribe packet
@@ -46,7 +46,8 @@ module PahoMqtt
46
46
  # Get serialisation of packet's body
47
47
  def encode_body
48
48
  if @topics.empty?
49
- raise "no topics given when serialising packet"
49
+ raise PahoMqtt::PacketFormatException.new(
50
+ "No topics given when serialising packet")
50
51
  end
51
52
  body = encode_short(@id)
52
53
  topics.each { |topic| body += encode_string(topic) }
@@ -57,7 +58,7 @@ module PahoMqtt
57
58
  def parse_body(buffer)
58
59
  super(buffer)
59
60
  @id = shift_short(buffer)
60
- while(buffer.bytesize>0)
61
+ while buffer.bytesize > 0
61
62
  @topics << shift_string(buffer)
62
63
  end
63
64
  end
@@ -66,7 +67,8 @@ module PahoMqtt
66
67
  # @private
67
68
  def validate_flags
68
69
  if @flags != [false, true, false, false]
69
- raise "Invalid flags in UNSUBSCRIBE packet header"
70
+ raise PahoMqtt::PacketFormatException.new(
71
+ "Invalid flags in UNSUBSCRIBE packet header")
70
72
  end
71
73
  end
72
74
 
@@ -74,7 +76,7 @@ module PahoMqtt
74
76
  def inspect
75
77
  "\#<#{self.class}: 0x%2.2X, %s>" % [
76
78
  id,
77
- topics.map {|t| "'#{t}'"}.join(', ')
79
+ topics.map { |t| "'#{t}'" }.join(', ')
78
80
  ]
79
81
  end
80
82
  end
@@ -16,15 +16,15 @@ module PahoMqtt
16
16
  class Publisher
17
17
 
18
18
  def initialize(sender)
19
- @waiting_puback = []
20
- @waiting_pubrec = []
21
- @waiting_pubrel = []
19
+ @waiting_puback = []
20
+ @waiting_pubrec = []
21
+ @waiting_pubrel = []
22
22
  @waiting_pubcomp = []
23
- @puback_mutex = Mutex.new
24
- @pubrec_mutex = Mutex.new
25
- @pubrel_mutex = Mutex.new
26
- @pubcomp_mutex = Mutex.new
27
- @sender = sender
23
+ @puback_mutex = Mutex.new
24
+ @pubrec_mutex = Mutex.new
25
+ @pubrel_mutex = Mutex.new
26
+ @pubcomp_mutex = Mutex.new
27
+ @sender = sender
28
28
  end
29
29
 
30
30
  def sender=(sender)
@@ -33,23 +33,31 @@ module PahoMqtt
33
33
 
34
34
  def send_publish(topic, payload, retain, qos, new_id)
35
35
  packet = PahoMqtt::Packet::Publish.new(
36
- :id => new_id,
37
- :topic => topic,
36
+ :id => new_id,
37
+ :topic => topic,
38
38
  :payload => payload,
39
- :retain => retain,
40
- :qos => qos
39
+ :retain => retain,
40
+ :qos => qos
41
41
  )
42
- @sender.append_to_writing(packet)
43
42
  case qos
44
43
  when 1
45
- @puback_mutex.synchronize{
46
- @waiting_puback.push({:id => new_id, :packet => packet, :timestamp => Time.now})
47
- }
44
+ @puback_mutex.synchronize do
45
+ if @waiting_puback.length >= MAX_PUBACK
46
+ PahoMqtt.logger.error('PUBACK queue is full, could not send with qos=1') if PahoMqtt.logger?
47
+ return MQTT_ERR_FAIL
48
+ end
49
+ @waiting_puback.push(:id => new_id, :packet => packet, :timestamp => Time.now)
50
+ end
48
51
  when 2
49
- @pubrec_mutex.synchronize{
50
- @waiting_pubrec.push({:id => new_id, :packet => packet, :timestamp => Time.now})
51
- }
52
+ @pubrec_mutex.synchronize do
53
+ if @waiting_pubrec.length >= MAX_PUBREC
54
+ PahoMqtt.logger.error('PUBREC queue is full, could not send with qos=2') if PahoMqtt.logger?
55
+ return MQTT_ERR_FAIL
56
+ end
57
+ @waiting_pubrec.push(:id => new_id, :packet => packet, :timestamp => Time.now)
58
+ end
52
59
  end
60
+ @sender.append_to_writing(packet)
53
61
  MQTT_ERR_SUCCESS
54
62
  end
55
63
 
@@ -61,8 +69,8 @@ module PahoMqtt
61
69
  when 2
62
70
  send_pubrec(packet_id)
63
71
  else
64
- @logger.error("The packet qos value is invalid in publish.") if logger?
65
- raise PacketException
72
+ PahoMqtt.logger.error("The packet QoS value is invalid in publish.") if PahoMqtt.logger?
73
+ raise PacketException.new('Invalid publish QoS value')
66
74
  end
67
75
  MQTT_ERR_SUCCESS
68
76
  end
@@ -76,27 +84,31 @@ module PahoMqtt
76
84
  end
77
85
 
78
86
  def do_puback(packet_id)
79
- @puback_mutex.synchronize{
87
+ @puback_mutex.synchronize do
80
88
  @waiting_puback.delete_if { |pck| pck[:id] == packet_id }
81
- }
82
- MQTT_ERR_SUCCESS
89
+ end
90
+ MQTT_ERR_SUCCESS
83
91
  end
84
-
92
+
85
93
  def send_pubrec(packet_id)
86
94
  packet = PahoMqtt::Packet::Pubrec.new(
87
95
  :id => packet_id
88
96
  )
97
+ @pubrel_mutex.synchronize do
98
+ if @waiting_pubrel.length >= MAX_PUBREL
99
+ PahoMqtt.logger.error('PUBREL queue is full, could not acknowledge qos=2') if PahoMqtt.logger?
100
+ return MQTT_ERR_FAIL
101
+ end
102
+ @waiting_pubrel.push(:id => packet_id , :packet => packet, :timestamp => Time.now)
103
+ end
89
104
  @sender.append_to_writing(packet)
90
- @pubrel_mutex.synchronize{
91
- @waiting_pubrel.push({:id => packet_id , :packet => packet, :timestamp => Time.now})
92
- }
93
105
  MQTT_ERR_SUCCESS
94
106
  end
95
107
 
96
108
  def do_pubrec(packet_id)
97
- @pubrec_mutex.synchronize {
109
+ @pubrec_mutex.synchronize do
98
110
  @waiting_pubrec.delete_if { |pck| pck[:id] == packet_id }
99
- }
111
+ end
100
112
  send_pubrel(packet_id)
101
113
  MQTT_ERR_SUCCESS
102
114
  end
@@ -105,17 +117,21 @@ module PahoMqtt
105
117
  packet = PahoMqtt::Packet::Pubrel.new(
106
118
  :id => packet_id
107
119
  )
120
+ @pubcomp_mutex.synchronize do
121
+ if @waiting_pubcomp.length >= MAX_PUBCOMP
122
+ PahoMqtt.logger.error('PUBCOMP queue is full, could not acknowledge qos=2') if PahoMqtt.logger?
123
+ return MQTT_ERR_FAIL
124
+ end
125
+ @waiting_pubcomp.push(:id => packet_id, :packet => packet, :timestamp => Time.now)
126
+ end
108
127
  @sender.append_to_writing(packet)
109
- @pubcomp_mutex.synchronize{
110
- @waiting_pubcomp.push({:id => packet_id, :packet => packet, :timestamp => Time.now})
111
- }
112
128
  MQTT_ERR_SUCCESS
113
129
  end
114
130
 
115
131
  def do_pubrel(packet_id)
116
- @pubrel_mutex.synchronize {
132
+ @pubrel_mutex.synchronize do
117
133
  @waiting_pubrel.delete_if { |pck| pck[:id] == packet_id }
118
- }
134
+ end
119
135
  send_pubcomp(packet_id)
120
136
  MQTT_ERR_SUCCESS
121
137
  end
@@ -129,52 +145,47 @@ module PahoMqtt
129
145
  end
130
146
 
131
147
  def do_pubcomp(packet_id)
132
- @pubcomp_mutex.synchronize {
148
+ @pubcomp_mutex.synchronize do
133
149
  @waiting_pubcomp.delete_if { |pck| pck[:id] == packet_id }
134
- }
150
+ end
135
151
  MQTT_ERR_SUCCESS
136
152
  end
137
153
 
138
154
  def config_all_message_queue
139
- config_message_queue(@waiting_puback, @puback_mutex, MAX_PUBACK)
140
- config_message_queue(@waiting_pubrec, @pubrec_mutex, MAX_PUBREC)
141
- config_message_queue(@waiting_pubrel, @pubrel_mutex, MAX_PUBREL)
142
- config_message_queue(@waiting_pubcomp, @pubcomp_mutex, MAX_PUBCOMP)
155
+ config_message_queue(@waiting_puback, @puback_mutex)
156
+ config_message_queue(@waiting_pubrec, @pubrec_mutex)
157
+ config_message_queue(@waiting_pubrel, @pubrel_mutex)
158
+ config_message_queue(@waiting_pubcomp, @pubcomp_mutex)
143
159
  end
144
160
 
145
- def config_message_queue(queue, mutex, max_packet)
146
- mutex.synchronize {
147
- cnt = 0
161
+ def config_message_queue(queue, mutex)
162
+ mutex.synchronize do
148
163
  queue.each do |pck|
149
- pck[:packet].dup ||= true
150
- if cnt <= max_packet
151
- @sender.append_to_writing(pck[:packet])
152
- cnt += 1
153
- end
164
+ pck[:timestamp] = Time.now
154
165
  end
155
- }
166
+ end
156
167
  end
157
168
 
158
169
  def check_waiting_publisher
159
- @sender.check_ack_alive(@waiting_puback, @puback_mutex, MAX_PUBACK)
160
- @sender.check_ack_alive(@waiting_pubrec, @pubrec_mutex, MAX_PUBREC)
161
- @sender.check_ack_alive(@waiting_pubrel, @pubrel_mutex, MAX_PUBREL)
162
- @sender.check_ack_alive(@waiting_pubcomp, @pubcomp_mutex, MAX_PUBCOMP)
170
+ @sender.check_ack_alive(@waiting_puback, @puback_mutex)
171
+ @sender.check_ack_alive(@waiting_pubrec, @pubrec_mutex)
172
+ @sender.check_ack_alive(@waiting_pubrel, @pubrel_mutex)
173
+ @sender.check_ack_alive(@waiting_pubcomp, @pubcomp_mutex)
163
174
  end
164
175
 
165
176
  def flush_publisher
166
- @puback_mutex.synchronize {
177
+ @puback_mutex.synchronize do
167
178
  @waiting_puback = []
168
- }
169
- @pubrec_mutex.synchronize {
179
+ end
180
+ @pubrec_mutex.synchronize do
170
181
  @waiting_pubrec = []
171
- }
172
- @pubrel_mutex.synchronize {
182
+ end
183
+ @pubrel_mutex.synchronize do
173
184
  @waiting_pubrel = []
174
- }
175
- @pubcomp_mutex.synchronize {
185
+ end
186
+ @pubcomp_mutex.synchronize do
176
187
  @waiting_pubcomp = []
177
- }
188
+ end
178
189
  end
179
190
  end
180
191
  end