paho-mqtt 1.0.11 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 36bc2ea31aa16b29dd3630d0d5db7b1e21b9723ce208d5234c0cde283cdf26e4
4
- data.tar.gz: 2baf2f376e7be26234ea7a6e94c662648a75442022c080dc76df7fd6bfa9c5e8
3
+ metadata.gz: 3b12b2ca9e37d486f259e998a800d9bb792aaf32bade2d542bfb1f65cddb7eed
4
+ data.tar.gz: d2526058c6647dcc29b694240074c17f1ba23153a4834002620da00fe0ca8618
5
5
  SHA512:
6
- metadata.gz: 5293b974ec90097bf707b6d14870d6347c704a4a7da0622c63fe0cfba6591536b19673804d68726b2b0b2e77496a654caaddd8aa47cb5f6cfe58e2ce501979f7
7
- data.tar.gz: f6f1f6c5c6f2659399cd70566b6af1d80606cdff9ee1c8fde8645799943a0b8a0d7c9608f8842d56cef8a9d885d42c0deb8fc5fcee875498b3da962fe4284c67
6
+ metadata.gz: 6e406280a8134c6ba1f6dfe4a308300bccfd5f724d6b9b1f6dcdee0dc39b038855ba49d9d8c810c552d3563f2af6f2e141e246579307819dcaaec39128fa8f79
7
+ data.tar.gz: 3d2733b63c3665ebf1c81636f7e056a72034b8dc3016413df9c3f4175f5a57b102b10edc680ab83283cc88d0fa2e361c9d1698bf754d608781730632642d5658
@@ -32,12 +32,8 @@ module PahoMqtt
32
32
  # MAX size of queue
33
33
  MAX_SUBACK = 10
34
34
  MAX_UNSUBACK = 10
35
- MAX_PUBACK = 100
36
- MAX_PUBREC = 100
37
- MAX_PUBREL = 100
38
35
  MAX_PUBLISH = 1000
39
- MAX_PUBCOMP = 100
40
- MAX_QUEUE = MAX_PUBACK + MAX_PUBREC + MAX_PUBREL + MAX_PUBCOMP
36
+ MAX_QUEUE = 1000
41
37
 
42
38
  # Connection states values
43
39
  MQTT_CS_NEW = 0
@@ -112,9 +112,10 @@ module PahoMqtt
112
112
  end
113
113
  @mqtt_thread.kill unless @mqtt_thread.nil?
114
114
 
115
- init_connection
115
+ init_connection unless reconnect?
116
116
  @connection_helper.send_connect(session_params)
117
117
  begin
118
+ init_pubsub
118
119
  @connection_state = @connection_helper.do_connect(reconnect?)
119
120
  if connected?
120
121
  build_pubsub
@@ -168,6 +169,8 @@ module PahoMqtt
168
169
  result = @handler.receive_packet
169
170
  break if result.nil?
170
171
  end
172
+ rescue FullQueueException
173
+ PahoMqtt.logger.warn("Early exit in reading loop. The maximum packets have been reach for #{packet.type_name}") if PahoMqtt.logger?
171
174
  rescue ReadingException
172
175
  if check_persistence
173
176
  reconnect
@@ -213,11 +216,14 @@ module PahoMqtt
213
216
  end
214
217
 
215
218
  def disconnect(explicit=true)
216
- @last_packet_id = 0 if explicit
217
219
  @connection_helper.do_disconnect(@publisher, explicit, @mqtt_thread)
218
220
  @connection_state_mutex.synchronize do
219
221
  @connection_state = MQTT_CS_DISCONNECT
220
222
  end
223
+ if explicit && @clean_session
224
+ @last_packet_id = 0
225
+ @subscriber.clear_queue
226
+ end
221
227
  MQTT_ERR_SUCCESS
222
228
  end
223
229
 
@@ -368,30 +374,22 @@ module PahoMqtt
368
374
  end
369
375
  end
370
376
 
371
- def build_pubsub
372
- if @subscriber.nil?
373
- @subscriber = Subscriber.new(@sender)
374
- else
375
- @subscriber.sender = @sender
376
- @subscriber.config_subscription(next_packet_id)
377
- end
378
- if @publisher.nil?
379
- @publisher = Publisher.new(@sender)
380
- else
381
- @publisher.sender = @sender
382
- @sender.flush_waiting_packet
383
- @publisher.config_all_message_queue
384
- end
377
+ def init_pubsub
378
+ @subscriber.nil? ? @subscriber = Subscriber.new(@sender) : @subscriber.sender = @sender
379
+ @publisher.nil? ? @publisher = Publisher.new(@sender) : @publisher.sender = @sender
385
380
  @handler.config_pubsub(@publisher, @subscriber)
386
381
  end
387
382
 
383
+ def build_pubsub
384
+ @subscriber.config_subscription(next_packet_id)
385
+ @sender.flush_waiting_packet
386
+ @publisher.config_all_message_queue
387
+ end
388
+
388
389
  def init_connection
389
- unless reconnect?
390
- @connection_helper = ConnectionHelper.new(@host, @port, @ssl, @ssl_context, @ack_timeout)
391
- @connection_helper.handler = @handler
392
- @sender = @connection_helper.sender
393
- end
394
- @connection_helper.setup_connection
390
+ @connection_helper = ConnectionHelper.new(@host, @port, @ssl, @ssl_context, @ack_timeout)
391
+ @connection_helper.handler = @handler
392
+ @sender = @connection_helper.sender
395
393
  end
396
394
 
397
395
  def session_params
@@ -63,7 +63,7 @@ module PahoMqtt
63
63
  end
64
64
 
65
65
  def explicit_disconnect(publisher, mqtt_thread)
66
- @sender.flush_waiting_packet
66
+ @sender.flush_waiting_packet(false)
67
67
  send_disconnect
68
68
  mqtt_thread.kill if mqtt_thread && mqtt_thread.alive?
69
69
  publisher.flush_publisher unless publisher.nil?
@@ -81,14 +81,14 @@ module PahoMqtt
81
81
  PahoMqtt.logger.debug("Attempt to connect to host: #{@host}...") if PahoMqtt.logger?
82
82
  begin
83
83
  tcp_socket = TCPSocket.new(@host, @port)
84
+ if @ssl
85
+ encrypted_socket(tcp_socket, @ssl_context)
86
+ else
87
+ @socket = tcp_socket
88
+ end
84
89
  rescue StandardError
85
90
  PahoMqtt.logger.warn("Could not open a socket with #{@host} on port #{@port}.") if PahoMqtt.logger?
86
91
  end
87
- if @ssl
88
- encrypted_socket(tcp_socket, @ssl_context)
89
- else
90
- @socket = tcp_socket
91
- end
92
92
  end
93
93
 
94
94
  def encrypted_socket(tcp_socket, ssl_context)
@@ -46,4 +46,7 @@ module PahoMqtt
46
46
 
47
47
  class FullQueueException < Exception
48
48
  end
49
+
50
+ class NotSupportedEncryptionException < Exception
51
+ end
49
52
  end
@@ -39,28 +39,28 @@ module PahoMqtt
39
39
  :retain => retain,
40
40
  :qos => qos
41
41
  )
42
- case qos
43
- when 1
44
- push_queue(@waiting_puback, @puback_mutex, MAX_PUBACK, packet, new_id)
45
- when 2
46
- push_queue(@waiting_pubrec, @pubrec_mutex, MAX_PUBREC, packet, new_id)
42
+ begin
43
+ case qos
44
+ when 1
45
+ push_queue(@waiting_puback, @puback_mutex, MAX_QUEUE, packet, new_id)
46
+ when 2
47
+ push_queue(@waiting_pubrec, @pubrec_mutex, MAX_QUEUE, packet, new_id)
48
+ end
49
+ rescue FullQueueException
50
+ PahoMqtt.logger.warn("PUBLISH queue is full, waiting for publishing #{packet.inspect}") if PahoMqtt.logger?
51
+ sleep SELECT_TIMEOUT
52
+ retry
47
53
  end
48
54
  @sender.append_to_writing(packet)
49
55
  MQTT_ERR_SUCCESS
50
56
  end
51
57
 
52
58
  def push_queue(waiting_queue, queue_mutex, max_packet, packet, new_id)
53
- begin
54
- if waiting_queue.length >= max_packet
55
- raise FullQueueException
56
- end
57
- queue_mutex.synchronize do
58
- waiting_queue.push(:id => new_id, :packet => packet, :timestamp => Time.now)
59
- end
60
- rescue FullQueueException
61
- PahoMqtt.logger.error("#{packet.type_name} queue is full") if PahoMqtt.logger?
62
- sleep SELECT_TIMEOUT
63
- retry
59
+ if waiting_queue.length >= max_packet
60
+ raise FullQueueException
61
+ end
62
+ queue_mutex.synchronize do
63
+ waiting_queue.push(:id => new_id, :packet => packet, :timestamp => Time.now)
64
64
  end
65
65
  MQTT_ERR_SUCCESS
66
66
  end
@@ -98,7 +98,7 @@ module PahoMqtt
98
98
  packet = PahoMqtt::Packet::Pubrec.new(
99
99
  :id => packet_id
100
100
  )
101
- push_queue(@waiting_pubrel, @pubrel_mutex, MAX_PUBREL, packet, packet_id)
101
+ push_queue(@waiting_pubrel, @pubrel_mutex, MAX_QUEUE, packet, packet_id)
102
102
  @sender.append_to_writing(packet)
103
103
  MQTT_ERR_SUCCESS
104
104
  end
@@ -114,7 +114,7 @@ module PahoMqtt
114
114
  packet = PahoMqtt::Packet::Pubrel.new(
115
115
  :id => packet_id
116
116
  )
117
- push_queue(@waiting_pubcomp, @pubcomp_mutex, MAX_PUBCOMP, packet, packet_id)
117
+ push_queue(@waiting_pubcomp, @pubcomp_mutex, MAX_QUEUE, packet, packet_id)
118
118
  @sender.append_to_writing(packet)
119
119
  MQTT_ERR_SUCCESS
120
120
  end
@@ -61,8 +61,7 @@ module PahoMqtt
61
61
 
62
62
  def append_to_writing(packet)
63
63
  begin
64
- case packet
65
- when packet.is_a?(PahoMqtt::Packet::Publish)
64
+ if packet.is_a?(PahoMqtt::Packet::Publish)
66
65
  prepare_sending(@publish_queue, @publish_mutex, MAX_PUBLISH, packet)
67
66
  else
68
67
  prepare_sending(@writing_queue, @writing_mutex, MAX_QUEUE, packet)
@@ -95,13 +94,18 @@ module PahoMqtt
95
94
  def flush_waiting_packet(sending=true)
96
95
  if sending
97
96
  @writing_mutex.synchronize do
98
- @writing_queue.each do |m|
99
- send_packet(m)
97
+ @writing_queue.each do |packet|
98
+ send_packet(packet)
99
+ end
100
+ end
101
+ @publish_mutex.synchronize do
102
+ @publish_queue.each do |packet|
103
+ send_packet(packet)
100
104
  end
101
105
  end
102
- else
103
- @writing_queue = []
104
106
  end
107
+ @writing_queue = []
108
+ @publish_queue = []
105
109
  end
106
110
 
107
111
  def check_ack_alive(queue, mutex)
@@ -110,7 +114,8 @@ module PahoMqtt
110
114
  queue.each do |pck|
111
115
  if now >= pck[:timestamp] + @ack_timeout
112
116
  pck[:packet].dup ||= true unless pck[:packet].class == PahoMqtt::Packet::Subscribe || pck[:packet].class == PahoMqtt::Packet::Unsubscribe
113
- append_to_writing(pck[:packet])
117
+ PahoMqtt.logger.info("Acknowledgement timeout is over, resending #{pck[:packet].inspect}") if PahoMqtt.logger?
118
+ send_packet(pck[:packet])
114
119
  pck[:timestamp] = now
115
120
  end
116
121
  end
@@ -18,21 +18,40 @@ module PahoMqtt
18
18
  module SSLHelper
19
19
  extend self
20
20
 
21
- def config_ssl_context(cert_path, key_path, ca_path=nil)
21
+ def config_ssl_context(cert_path=nil, key_path=nil, ca_path=nil)
22
22
  ssl_context = OpenSSL::SSL::SSLContext.new
23
23
  set_cert(cert_path, ssl_context)
24
24
  set_key(key_path, ssl_context)
25
25
  set_root_ca(ca_path, ssl_context)
26
- #ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER unless ca_path.nil?
26
+ # ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER unless ca_path.nil?
27
27
  ssl_context
28
28
  end
29
29
 
30
- def set_cert(cert_path, ssl_context)
31
- ssl_context.cert = OpenSSL::X509::Certificate.new(File.read(cert_path))
30
+ def set_cert(cert_path=nil, ssl_context)
31
+ unless cert_path.nil?
32
+ ssl_context.cert = OpenSSL::X509::Certificate.new(File.read(cert_path))
33
+ end
32
34
  end
33
35
 
34
- def set_key(key_path, ssl_context)
35
- ssl_context.key = OpenSSL::PKey::RSA.new(File.read(key_path))
36
+ def set_key(key_path=nil, ssl_context)
37
+ unless key_path.nil?
38
+ return MQTT_ERR_SUCCESS if try_rsa_key(key_path, ssl_context) == MQTT_ERR_SUCCESS
39
+ begin
40
+ ssl_context.key = OpenSSL::PKey::EC.new(File.read(key_path))
41
+ return MQTT_ERR_SUCCESS
42
+ rescue OpenSSL::PKey::ECError
43
+ raise NotSupportedEncryptionException.new("Could not support the type of the provided key (supported: RSA and EC)")
44
+ end
45
+ end
46
+ end
47
+
48
+ def try_rsa_key(key_path, ssl_context)
49
+ begin
50
+ ssl_context.key = OpenSSL::PKey::RSA.new(File.read(key_path))
51
+ return MQTT_ERR_SUCCESS
52
+ rescue OpenSSL::PKey::RSAError
53
+ return MQTT_ERR_FAIL
54
+ end
36
55
  end
37
56
 
38
57
  def set_root_ca(ca_path, ssl_context)
@@ -47,7 +47,7 @@ module PahoMqtt
47
47
  end
48
48
  @waiting_suback.push(:id => new_id, :packet => packet, :timestamp => Time.now)
49
49
  end
50
- @sender.send_packet(packet)
50
+ @sender.append_to_writing(packet)
51
51
  end
52
52
  MQTT_ERR_SUCCESS
53
53
  end
@@ -143,6 +143,10 @@ module PahoMqtt
143
143
  @sender.check_ack_alive(@waiting_unsuback, @unsuback_mutex)
144
144
  end
145
145
 
146
+ def clear_queue
147
+ @waiting_suback = []
148
+ end
149
+
146
150
  def valid_topics?(topics)
147
151
  unless topics.length == 0
148
152
  topics.map do |topic|
@@ -1,3 +1,3 @@
1
1
  module PahoMqtt
2
- VERSION = "1.0.11"
2
+ VERSION = "1.0.12"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paho-mqtt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.11
4
+ version: 1.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre Goudet
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-22 00:00:00.000000000 Z
11
+ date: 2018-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler