mqtt-sub_handler 0.1.6.2 → 0.1.6.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bfe901d34d1a891840006f77467ef0929bfb9ff1363ccc3ece47cf35454178b0
4
- data.tar.gz: 1e601e44349b5e360068d3e07a4a59caa0254cfc2aaee1e1f870fe1069041e96
3
+ metadata.gz: d3eef659ff2c5da99d386d05fc145c328d7eea5b2057d30fa7f1ec43bda7748c
4
+ data.tar.gz: 69559fc70301f60f25ea322731b936738eb7d55609a8c817fcedf161e3640590
5
5
  SHA512:
6
- metadata.gz: 589b2c0307aa5ec6aa0e253805d8b095ce73997bd9461bc7abc060d306ac6f1b5c8ff18ddee861a1c2d43d6b7e3685bacb9b4994360b106c1ad19791c91bd511
7
- data.tar.gz: 4d5d90483bfa7ce80c4c6359d5fb38faad29a08f447d987cebf1779597190c4e7d692950a0bafa1d63b98d5d76d5fcdedd696b6385ab170a5c917da0c4ef0ac0
6
+ metadata.gz: 1693df3d20154bb9a283cd75f0f3f82411173c7716daa89f84c89a0497ef36fa92965827927baa32ec1ead5c6697e87f3270c10099b7fd3815695be06af730f0
7
+ data.tar.gz: cc4fab89804258ffdbec5d89a11a94426c264b2866f10780cfff4aab3422cb78ca031b784e0e0200b20815f3ffc27934740b9250c8a0ef1283779bcbc05a0206
@@ -0,0 +1,350 @@
1
+
2
+ require 'timeout'
3
+ require 'mqtt'
4
+ require 'colorize'
5
+
6
+ require 'xasin_logger'
7
+
8
+ module MQTT
9
+ class BaseHandler
10
+ include XasLogger::Mix
11
+
12
+ # Split a Topic into a Topic-Array
13
+ # @param topicName [String] The string topic which to split
14
+ # @return [Array<String>] A list of individual topic-branches
15
+ # @note This function is mainly used for background processing.
16
+ def self.get_topic_split(topicName)
17
+ return topicName.scan(/[^\/]+/);
18
+ end
19
+
20
+ # Match a topic string to a topic pattern
21
+ # @param receivedTopicString [String] The string (as
22
+ # returned by MQTT.get) to compare
23
+ # @param topicPattern [Array<String>] The Topic-Array (as
24
+ # returned by .get_topic_split) to compare against
25
+ # @return [nil, Array<String>] Nil if no match was found.
26
+ # An Array of matched wildcard topic branches (can be empty) when
27
+ # successfully matched
28
+ # @note (see .get_topic_split)
29
+ def self.getTopicMatch(receivedTopicString, topicPattern)
30
+ receivedTopicList = get_topic_split receivedTopicString;
31
+
32
+ outputTopicList = Array.new();
33
+
34
+ return nil unless receivedTopicList.length >= topicPattern.length;
35
+
36
+ topicPattern.each_index do |i|
37
+ if(topicPattern[i] == "+")
38
+ outputTopicList << receivedTopicList[i];
39
+
40
+ elsif(topicPattern[i] == "#")
41
+ outputTopicList.concat receivedTopicList[i..-1];
42
+ return outputTopicList;
43
+
44
+ elsif topicPattern[i] != receivedTopicList[i];
45
+ return nil;
46
+
47
+ end
48
+ end
49
+
50
+ return outputTopicList if topicPattern.length == receivedTopicList.length;
51
+ return nil;
52
+ end
53
+
54
+ # Call all existing callbacks whose topic-list matches `topic`
55
+ def call_interested(topic, data)
56
+ topicHasReceivers = false;
57
+ @callbackList.each do |h|
58
+ tMatch = BaseHandler.getTopicMatch(topic, h.topic_split);
59
+ if tMatch
60
+ begin
61
+ Timeout.timeout(10) {
62
+ h.offer(tMatch, data)
63
+ }
64
+ rescue Timeout::Error
65
+ x_logf("Timeout on callback #{h}");
66
+ rescue => e
67
+ x_logf("Uncaught error on #{h}");
68
+ x_logf(e);
69
+ end
70
+ topicHasReceivers = true;
71
+ end
72
+ end
73
+
74
+ @mqtt.unsubscribe(topic) unless topicHasReceivers;
75
+ end
76
+ private :call_interested
77
+
78
+ def queue_packet(data)
79
+ return if @destroying
80
+
81
+ x_logd("Queueing packet #{data.to_json}");
82
+ @packetQueueMutex.synchronize {
83
+ @packetQueue << data;
84
+ if(@packetQueue.size == 999)
85
+ x_loge("Packet queue congested, dropping packets!");
86
+ end
87
+ if(@packetQueue.size > 1000)
88
+ @packetQueue.shift
89
+ end
90
+
91
+ @publisherThread.run() if @publisherThreadWaiting;
92
+ }
93
+ end
94
+ private :queue_packet
95
+
96
+ # @!group Custom subscription handling
97
+
98
+ # Unregister a subscription. Removes it from the callback list and
99
+ # unsubscribes from the topic if no other subscriptions for it are present.
100
+ # @param subObject [MQTT::Subscriptions::Subscription]
101
+ # The subscription-object to remove
102
+ # @return void
103
+ def unregister_subscription(subObject)
104
+ raise ArgumentError, "Object is not a subscription!" unless subObject.is_a? MQTT::Subscriptions::Subscription
105
+ return unless @callbackList.include? subObject;
106
+
107
+ queue_packet({type: :unsub, topic: subObject.topic});
108
+ @callbackList.delete(subObject);
109
+ end
110
+ # Register a custom subscription, and send a subscription message to the server.
111
+ # @param subObject [MQTT::Subscriptions::Subscription]
112
+ # An instance of a MQTT Subscription object
113
+ # @return void
114
+ def register_subscription(subObject)
115
+ raise ArgumentError, "Object is not a subscription!" unless subObject.is_a? MQTT::Subscriptions::Subscription
116
+ return if @callbackList.include? subObject;
117
+
118
+ @callbackList << subObject;
119
+ queue_packet({type: :sub, topic: subObject.topic, qos: subObject.qos});
120
+ end
121
+
122
+ # @!endgroup
123
+
124
+ def ensure_clean_start()
125
+ @mqttWasStartedClean = @mqtt.clean_session
126
+ if @mqttWasStartedClean
127
+ begin
128
+ @mqtt.connect();
129
+ @mqtt.disconnect();
130
+ rescue MQTT::Exception
131
+ sleep 1;
132
+ retry
133
+ rescue SocketError, SystemCallError
134
+ sleep 5
135
+ retry
136
+ end
137
+ @mqtt.clean_session=false;
138
+ end
139
+ end
140
+ private :ensure_clean_start
141
+
142
+ def ensure_clean_exit()
143
+ if(@mqttWasStartedClean)
144
+ x_logi("Logging out.")
145
+ begin
146
+ Timeout.timeout(3) {
147
+ begin
148
+ @mqtt.clean_session = true;
149
+ @mqtt.disconnect();
150
+ @mqtt.connect();
151
+ rescue MQTT::Exception, SocketError, SystemCallError
152
+ sleep 0.3
153
+ retry;
154
+ end
155
+ }
156
+ rescue Timeout::Error
157
+ x_loge("Timed out, aborting!");
158
+ else
159
+ x_logi("Done");
160
+ end
161
+ end
162
+ end
163
+ private :ensure_clean_exit
164
+
165
+ def mqtt_push_thread
166
+ loop do
167
+ @packetQueueMutex.synchronize {
168
+ @publisherThreadWaiting = true;
169
+ }
170
+ x_logd("Push thread stopping")
171
+ sleep 1
172
+ x_logd("Push thread active")
173
+ @packetQueueMutex.synchronize {
174
+ @publisherThreadWaiting = false;
175
+ }
176
+ break if @destroying
177
+
178
+ next unless @connected
179
+
180
+ begin
181
+ until @packetQueue.empty? do
182
+ h = nil;
183
+ @packetQueueMutex.synchronize {
184
+ h = @packetQueue[0];
185
+ }
186
+ Timeout.timeout(3) {
187
+ if(h[:type] == :sub)
188
+ @mqtt.subscribe(h[:topic] => h[:qos]);
189
+ elsif(h[:type] == :pub)
190
+ @mqtt.publish(h[:topic], h[:data], h[:retain], h[:qos]);
191
+ end
192
+ }
193
+ @packetQueueMutex.synchronize {
194
+ @packetQueue.shift();
195
+ }
196
+ end
197
+ rescue MQTT::Exception, SocketError, SystemCallError, Timeout::Error => e
198
+ x_loge("Push error!");
199
+ x_loge(e.inspet);
200
+
201
+ sleep 0.5
202
+ end
203
+ end
204
+
205
+ x_logd("Push thread exited!");
206
+ end
207
+ private :mqtt_push_thread
208
+
209
+ def mqtt_resub_thread
210
+ loop do
211
+ begin
212
+ return if @destroying
213
+
214
+ x_logw("Trying to reconnect...");
215
+ Timeout.timeout(4) {
216
+ @mqtt.connect()
217
+ }
218
+ x_logi("Connected!");
219
+ @conChangeMutex.synchronize {
220
+ @connected = true;
221
+ }
222
+
223
+ @packetQueueMutex.synchronize {
224
+ @publisherThread.run() if (@publisherThread && @publisherThreadWaiting)
225
+ }
226
+
227
+ x_logd("Sub thread reading...");
228
+ @mqtt.get do |topic, message|
229
+ call_interested(topic, message);
230
+ end
231
+ rescue MQTT::Exception, Timeout::Error, SocketError, SystemCallError
232
+ x_loge("Disconnected!") if @connected
233
+ @connected = false;
234
+
235
+ @conChangeMutex.unlock if @conChangeMutex.owned?
236
+ @mqtt.clean_session = false;
237
+ sleep 2
238
+ end
239
+ end
240
+
241
+ x_logd("Sub thread exited");
242
+ end
243
+ private :mqtt_resub_thread
244
+
245
+ # Pause the main thread and wait for messages.
246
+ # This is mainly useful when the code has set everything up, but doesn't just want to end.
247
+ # "INT" is trapped, ensuring a smooth exit on Ctrl-C
248
+ def lockAndListen()
249
+ Signal.trap("INT") {
250
+ exit 0
251
+ }
252
+
253
+ puts "Main thread paused."
254
+ Thread.stop();
255
+ end
256
+
257
+ def destroy!()
258
+ return if @destroying
259
+ @destroying = true;
260
+
261
+ unless @packetQueue.empty?
262
+ x_logd "Finishing sending of MQTT messages ... "
263
+ @publisherThread.run() if @publisherThreadWaiting
264
+ begin
265
+ Timeout.timeout(4) {
266
+ until @packetQueue.empty? do
267
+ sleep 0.05;
268
+ end
269
+ }
270
+ rescue Timeout::Error
271
+ x_logw "Publishes did not complete";
272
+ else
273
+ x_logd "Publish clean finished"
274
+ end
275
+ end
276
+
277
+ @publisherThread.run();
278
+ @publisherThread.join();
279
+ @listenerThread.kill();
280
+
281
+ @mqtt.disconnect() if @connected
282
+
283
+ ensure_clean_exit();
284
+
285
+ x_logi("Fully disconnected!");
286
+ end
287
+
288
+ # Initialize a new MQTT::SubHandler
289
+ # The handler immediately connects to the server, and begins receciving and sending.
290
+ # @param mqttClient [String, MQTT::Client] Either a URI to connect to, or a MQTT::Client
291
+ # The URI can be of the form "mqtts://Password@User:URL:port".
292
+ # The MQTT client instance can be fully configured, as specified by the MQTT Gem. It must *not* already be connected!
293
+ # @param jsonify [Boolean] Should Hashes and Arrays input into publish_to be converted to JSON?
294
+ # This can be useful to have one less .to_json call. Default is true.
295
+ # @example Starting the handler
296
+ # mqtt = MQTT::SubHandler.new('mqtt.eclipse.org');
297
+ # mqtt = MQTT::SubHandler.new(MQTT::Client.new("Your.Client.Opts"))
298
+ def initialize(mqttClient, logger: nil)
299
+ @callbackList = Array.new();
300
+ if mqttClient.is_a? String
301
+ @mqtt = MQTT::Client.new(mqttClient);
302
+ @mqtt.clean_session = false;
303
+ else
304
+ @mqtt = mqttClient;
305
+ end
306
+
307
+ init_x_log("MQTT #{@mqtt.host}", logger);
308
+ self.log_level = Logger::INFO;
309
+
310
+ @conChangeMutex = Mutex.new();
311
+ @connected = false;
312
+
313
+ @mqtt.client_id ||= MQTT::Client.generate_client_id("MQTT_Sub_", 8);
314
+
315
+ @packetQueue = Array.new();
316
+ @packetQueueMutex = Mutex.new();
317
+
318
+ @publisherThreadWaiting = false;
319
+
320
+ @subscribedTopics = Hash.new();
321
+
322
+ @trackerHash = Hash.new();
323
+
324
+ @listenerThread = Thread.new do
325
+ ensure_clean_start();
326
+ mqtt_resub_thread();
327
+ end
328
+ @listenerThread.abort_on_exception = true;
329
+
330
+ begin
331
+ Timeout.timeout(5) {
332
+ until(@connected)
333
+ sleep 0.1;
334
+ end
335
+ }
336
+ rescue Timeout::Error
337
+ x_loge("Broker did not connect!");
338
+ end
339
+
340
+ @publisherThread = Thread.new do
341
+ mqtt_push_thread();
342
+ end
343
+ @publisherThread.abort_on_exception = true;
344
+
345
+ at_exit {
346
+ destroy!()
347
+ }
348
+ end
349
+ end
350
+ end
@@ -1,129 +1,24 @@
1
1
 
2
- require 'timeout'
3
- require 'mqtt'
4
- require 'json'
5
2
 
6
- require 'colorize'
3
+ require 'json'
7
4
 
8
5
  require_relative 'subscription_classes.rb'
6
+ require_relative 'base_handler.rb'
9
7
 
10
8
  # @author Xasin
11
9
  module MQTT
12
10
  # A shortcut-function to quickly connect to the public Eclipse MQTT Broker.
13
- # @return [MQTT::SubHandler] Sub-Handler connected to `iot.eclipse.org`
11
+ # @return [MQTT::SubHandler] Sub-Handler connected to `mqtt.eclipse.org`
14
12
  def self.Eclipse()
15
- @EclipseMQTT ||= SubHandler.new('iot.eclipse.org');
13
+ @EclipseMQTT ||= SubHandler.new('mqtt.eclipse.org');
16
14
  return @EclipseMQTT;
17
15
  end
18
16
 
19
17
 
20
- class SubHandler
18
+ class SubHandler < BaseHandler
21
19
  # Whether or not hashes and arrays should be converted to JSON when sending
22
20
  attr_accessor :jsonifyHashes
23
21
 
24
- # Split a Topic into a Topic-Array
25
- # @param topicName [String] The string topic which to split
26
- # @return [Array<String>] A list of individual topic-branches
27
- # @note This function is mainly used for background processing.
28
- def self.get_topic_split(topicName)
29
- return topicName.scan(/[^\/]+/);
30
- end
31
-
32
- # Match a topic string to a topic pattern
33
- # @param receivedTopicString [String] The string (as
34
- # returned by MQTT.get) to compare
35
- # @param topicPattern [Array<String>] The Topic-Array (as
36
- # returned by .get_topic_split) to compare against
37
- # @return [nil, Array<String>] Nil if no match was found.
38
- # An Array of matched wildcard topic branches (can be empty) when
39
- # successfully matched
40
- # @note (see .get_topic_split)
41
- def self.getTopicMatch(receivedTopicString, topicPattern)
42
- receivedTopicList = get_topic_split receivedTopicString;
43
-
44
- outputTopicList = Array.new();
45
-
46
- return nil unless receivedTopicList.length >= topicPattern.length;
47
-
48
- topicPattern.each_index do |i|
49
- if(topicPattern[i] == "+")
50
- outputTopicList << receivedTopicList[i];
51
-
52
- elsif(topicPattern[i] == "#")
53
- outputTopicList.concat receivedTopicList[i..-1];
54
- return outputTopicList;
55
-
56
- elsif topicPattern[i] != receivedTopicList[i];
57
- return nil;
58
-
59
- end
60
- end
61
-
62
- return outputTopicList if topicPattern.length == receivedTopicList.length;
63
- return nil;
64
- end
65
-
66
- # Call all existing callbacks whose topic-list matches `topic`
67
- def call_interested(topic, data)
68
- topicHasReceivers = false;
69
- @callbackList.each do |h|
70
- tMatch = SubHandler.getTopicMatch(topic, h.topic_split);
71
- if tMatch
72
- begin
73
- Timeout.timeout(5) {
74
- h.offer(tMatch, data)
75
- }
76
- rescue Timeout::Error
77
- STDERR.puts "MQTT: Callback Timeout #{h}".red
78
- end
79
- topicHasReceivers = true;
80
- end
81
- end
82
-
83
- @mqtt.unsubscribe(topic) unless topicHasReceivers;
84
- end
85
- private :call_interested
86
-
87
- def queue_packet(data)
88
- @packetQueueMutex.synchronize {
89
- @packetQueue << data;
90
- @packetQueue.shift if @packetQueue.size > 100
91
-
92
- @publisherThread.run() if @publisherThreadWaiting;
93
- }
94
- end
95
-
96
- # Handle sending a subscription-message to the server
97
- def raw_subscribe_to(topic, qos: 1)
98
- queue_packet({topic: topic, qos: qos, type: :sub});
99
- end
100
- private :raw_subscribe_to
101
-
102
- # @!group Custom subscription handling
103
-
104
- # Unregister a subscription. Removes it from the callback list and
105
- # unsubscribes from the topic if no other subscriptions for it are present.
106
- # @param subObject [MQTT::Subscriptions::Subscription]
107
- # The subscription-object to remove
108
- # @return void
109
- def unregister_subscription(subObject)
110
- raise ArgumentError, "Object is not a subscription!" unless subObject.is_a? MQTT::Subscriptions::Subscription
111
- return unless @callbackList.include? subObject;
112
-
113
- @callbackList.delete(subObject);
114
- end
115
- # Register a custom subscription, and send a subscription message to the server.
116
- # @param subObject [MQTT::Subscriptions::Subscription]
117
- # An instance of a MQTT Subscription object
118
- # @return void
119
- def register_subscription(subObject)
120
- raise ArgumentError, "Object is not a subscription!" unless subObject.is_a? MQTT::Subscriptions::Subscription
121
- return if @callbackList.include? subObject;
122
-
123
- @callbackList << subObject;
124
- raw_subscribe_to(subObject.topic, qos: subObject.qos);
125
- end
126
-
127
22
  # @!group Subscribing
128
23
 
129
24
  # Synchronously wait for data.
@@ -221,8 +116,7 @@ class SubHandler
221
116
 
222
117
  if(qos > 1)
223
118
  qos = 1
224
- STDERR.puts("MQTT push with QOS > 1 was attempted, this is not supported yet!".yellow) unless $MQTTPubQOSWarned
225
-
119
+ x_logw("push with QOS > 1 was attempted, this is not supported yet!") unless $MQTTPubQOSWarned
226
120
  $MQTTPubQOSWarned = true;
227
121
  end
228
122
 
@@ -230,206 +124,10 @@ class SubHandler
230
124
  end
231
125
  alias publishTo publish_to
232
126
 
233
- def ensure_clean_start()
234
- @mqttWasStartedClean = @mqtt.clean_session
235
- if @mqttWasStartedClean
236
- begin
237
- @mqtt.connect();
238
- @mqtt.disconnect();
239
- rescue MQTT::Exception
240
- sleep 1;
241
- retry
242
- rescue SocketError, SystemCallError
243
- sleep 5
244
- retry
245
- end
246
- @mqtt.clean_session=false;
247
- end
248
- end
249
- private :ensure_clean_start
250
-
251
- def ensure_clean_exit()
252
- if(@mqttWasStartedClean)
253
- print "Logging out of mqtt server... "
254
- begin
255
- Timeout.timeout(3) {
256
- begin
257
- @mqtt.clean_session = true;
258
- @mqtt.disconnect();
259
- @mqtt.connect();
260
- rescue MQTT::Exception, SocketError, SystemCallError
261
- sleep 0.3
262
- retry;
263
- end
264
- }
265
- rescue Timeout::Error
266
- puts "Timed out, aborting!";
267
- else
268
- puts "Done."
269
- end
270
- end
271
- end
272
- private :ensure_clean_exit
273
-
274
- def mqtt_push_thread
275
- loop do
276
- @packetQueueMutex.synchronize {
277
- @publisherThreadWaiting = true;
278
- }
279
- Thread.stop();
280
- @packetQueueMutex.synchronize {
281
- @publisherThreadWaiting = false;
282
- }
283
-
284
- next unless @connected
285
-
286
- begin
287
- until @packetQueue.empty? do
288
- h = nil;
289
- @packetQueueMutex.synchronize {
290
- h = @packetQueue[0];
291
- }
292
- Timeout.timeout(3) {
293
- if(h[:type] == :sub)
294
- @mqtt.subscribe(h[:topic] => h[:qos]);
295
- elsif(h[:type] == :pub)
296
- @mqtt.publish(h[:topic], h[:data], h[:retain], h[:qos]);
297
- end
298
- }
299
- @packetQueueMutex.synchronize {
300
- @packetQueue.shift();
301
- }
302
- end
303
- rescue MQTT::Exception, SocketError, SystemCallError, Timeout::Error => e
304
- STDERR.puts("MQTT: #{@mqtt.host} push error, disconnecting!".red) if @connected
305
- STDERR.puts(e.inspect);
306
-
307
- sleep 1
308
- end
309
- end
310
- end
311
- private :mqtt_push_thread
312
-
313
- def mqtt_resub_thread
314
- loop do
315
- begin
316
- STDERR.puts("MQTT: #{@mqtt.host} trying reconnect...".yellow)
317
- Timeout.timeout(4) {
318
- @mqtt.connect()
319
- }
320
- STDERR.puts("MQTT: #{@mqtt.host} connected!".green)
321
- @conChangeMutex.synchronize {
322
- @connected = true;
323
- }
324
-
325
- @packetQueueMutex.synchronize {
326
- @publisherThread.run() if (@publisherThread && @publisherThreadWaiting)
327
- }
328
-
329
- @mqtt.get do |topic, message|
330
- call_interested(topic, message);
331
- end
332
- rescue MQTT::Exception, Timeout::Error, SocketError, SystemCallError
333
- STDERR.puts("MQTT: #{@mqtt.host} disconnected!".red) if @connected
334
- @connected = false;
335
-
336
- @conChangeMutex.unlock if @conChangeMutex.owned?
337
- @mqtt.clean_session = false;
338
- sleep 2
339
- end
340
- end
341
- end
342
- private :mqtt_resub_thread
343
-
344
- # Pause the main thread and wait for messages.
345
- # This is mainly useful when the code has set everything up, but doesn't just want to end.
346
- # "INT" is trapped, ensuring a smooth exit on Ctrl-C
347
- def lockAndListen()
348
- Signal.trap("INT") {
349
- exit 0
350
- }
351
-
352
- puts "Main thread paused."
353
- Thread.stop();
354
- end
355
- def flush_pubqueue()
356
- unless @packetQueue.empty?
357
- print "Finishing sending of MQTT messages ... "
358
- begin
359
- Timeout.timeout(4) {
360
- until @packetQueue.empty? do
361
- sleep 0.05;
362
- end
363
- }
364
- rescue Timeout::Error
365
- puts "Timed out, aborting."
366
- else
367
- puts "Done."
368
- end
369
- end
370
- end
371
- private :flush_pubqueue
372
-
373
- # Initialize a new MQTT::SubHandler
374
- # The handler immediately connects to the server, and begins receciving and sending.
375
- # @param mqttClient [String, MQTT::Client] Either a URI to connect to, or a MQTT::Client
376
- # The URI can be of the form "mqtts://Password@User:URL:port".
377
- # The MQTT client instance can be fully configured, as specified by the MQTT Gem. It must *not* already be connected!
378
- # @param jsonify [Boolean] Should Hashes and Arrays input into publish_to be converted to JSON?
379
- # This can be useful to have one less .to_json call. Default is true.
380
- # @example Starting the handler
381
- # mqtt = MQTT::SubHandler.new('iot.eclipse.org');
382
- # mqtt = MQTT::SubHandler.new(MQTT::Client.new("Your.Client.Opts"))
383
127
  def initialize(mqttClient, jsonify: true)
384
- @callbackList = Array.new();
385
- if mqttClient.is_a? String
386
- @mqtt = MQTT::Client.new(mqttClient);
387
- else
388
- @mqtt = mqttClient;
389
- end
128
+ super(mqttClient);
390
129
 
391
130
  @jsonifyHashes = jsonify;
392
-
393
- @conChangeMutex = Mutex.new();
394
- @connected = false;
395
-
396
- @mqtt.client_id ||= MQTT::Client.generate_client_id("MQTT_Sub_", 8);
397
-
398
- @packetQueue = Array.new();
399
- @packetQueueMutex = Mutex.new();
400
- @publisherThreadWaiting = false;
401
-
402
- @subscribedTopics = Hash.new();
403
-
404
- @trackerHash = Hash.new();
405
-
406
- @listenerThread = Thread.new do
407
- ensure_clean_start();
408
- mqtt_resub_thread();
409
- end
410
- @listenerThread.abort_on_exception = true;
411
-
412
- begin
413
- Timeout.timeout(5) {
414
- until(@connected)
415
- sleep 0.1;
416
- end
417
- }
418
- rescue Timeout::Error
419
- STDERR.puts "MQTT: #{@mqtt.host} did not connect!".red
420
- end
421
-
422
- @publisherThread = Thread.new do
423
- mqtt_push_thread();
424
- end
425
- @publisherThread.abort_on_exception = true;
426
-
427
- at_exit {
428
- flush_pubqueue();
429
- @connected = false;
430
- @listenerThread.kill();
431
- ensure_clean_exit();
432
- }
433
131
  end
434
132
  end
435
133
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mqtt-sub_handler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6.2
4
+ version: 0.1.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xasin
@@ -39,19 +39,19 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: colorize
42
+ name: xasin-logger
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '0.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '0.1'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -103,6 +103,7 @@ extra_rdoc_files: []
103
103
  files:
104
104
  - README.md
105
105
  - lib/mqtt/Waitpoint.rb
106
+ - lib/mqtt/base_handler.rb
106
107
  - lib/mqtt/mqtt_hash.rb
107
108
  - lib/mqtt/persistence.rb
108
109
  - lib/mqtt/persistence_extensions.rb