mqtt-sub_handler 0.1.6 → 0.1.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mqtt/sub_handler.rb +63 -36
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 22d57768280da99134fc12c1ab6d07b441df823f59992d88411a1bc8b88cfe16
4
- data.tar.gz: 34ead01f1186b52591969071404c2812badd339e17a404178b44295d6d6ed8e8
3
+ metadata.gz: bfe901d34d1a891840006f77467ef0929bfb9ff1363ccc3ece47cf35454178b0
4
+ data.tar.gz: 1e601e44349b5e360068d3e07a4a59caa0254cfc2aaee1e1f870fe1069041e96
5
5
  SHA512:
6
- metadata.gz: 11569eef332d8d8c186b6c246bfd32bea0643270152e27c06b1e92e560c93a091809a2994c3424fd36ed9e0d2898defcc8f45e7e57da3879a276e837d6e2b663
7
- data.tar.gz: a1d962a3af87a942f45af28540b5902903cf0e37a569d7b174793dd471183c8337fc95f1bd4f0a06a9b9997cb04da78e60ed663be399968bddced5e641ad0aad
6
+ metadata.gz: 589b2c0307aa5ec6aa0e253805d8b095ce73997bd9461bc7abc060d306ac6f1b5c8ff18ddee861a1c2d43d6b7e3685bacb9b4994360b106c1ad19791c91bd511
7
+ data.tar.gz: 4d5d90483bfa7ce80c4c6359d5fb38faad29a08f447d987cebf1779597190c4e7d692950a0bafa1d63b98d5d76d5fcdedd696b6385ab170a5c917da0c4ef0ac0
@@ -74,7 +74,7 @@ class SubHandler
74
74
  h.offer(tMatch, data)
75
75
  }
76
76
  rescue Timeout::Error
77
- STDERR.puts "MQTT Callback Timeout #{h}"
77
+ STDERR.puts "MQTT: Callback Timeout #{h}".red
78
78
  end
79
79
  topicHasReceivers = true;
80
80
  end
@@ -84,10 +84,18 @@ class SubHandler
84
84
  end
85
85
  private :call_interested
86
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
+
87
96
  # Handle sending a subscription-message to the server
88
97
  def raw_subscribe_to(topic, qos: 1)
89
- @subscribeQueue << [topic, qos];
90
- @publisherThread.run();
98
+ queue_packet({topic: topic, qos: qos, type: :sub});
91
99
  end
92
100
  private :raw_subscribe_to
93
101
 
@@ -211,8 +219,14 @@ class SubHandler
211
219
  data = data.to_json
212
220
  end
213
221
 
214
- @publishQueue << {topic: topic, data: data, qos: qos, retain: retain}
215
- @publisherThread.run();
222
+ if(qos > 1)
223
+ qos = 1
224
+ STDERR.puts("MQTT push with QOS > 1 was attempted, this is not supported yet!".yellow) unless $MQTTPubQOSWarned
225
+
226
+ $MQTTPubQOSWarned = true;
227
+ end
228
+
229
+ queue_packet({type: :pub, topic: topic, data: data, qos: qos, retain: retain});
216
230
  end
217
231
  alias publishTo publish_to
218
232
 
@@ -259,40 +273,47 @@ class SubHandler
259
273
 
260
274
  def mqtt_push_thread
261
275
  loop do
276
+ @packetQueueMutex.synchronize {
277
+ @publisherThreadWaiting = true;
278
+ }
262
279
  Thread.stop();
280
+ @packetQueueMutex.synchronize {
281
+ @publisherThreadWaiting = false;
282
+ }
263
283
 
264
284
  next unless @connected
265
285
 
266
286
  begin
267
- until @subscribeQueue.empty? do
268
- h = @subscribeQueue[-1];
269
- Timeout.timeout(3) {
270
- @mqtt.subscribe(h[0] => h[1]);
287
+ until @packetQueue.empty? do
288
+ h = nil;
289
+ @packetQueueMutex.synchronize {
290
+ h = @packetQueue[0];
271
291
  }
272
- @subscribeQueue.pop;
273
- sleep 0.01
274
- end
275
- until @publishQueue.empty? do
276
- h = @publishQueue[-1];
277
292
  Timeout.timeout(3) {
278
- @mqtt.publish(h[:topic], h[:data], h[:retain], h[:qos]);
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
279
298
  }
280
- @publishQueue.pop;
281
- sleep 0.01
282
- end
283
- rescue MQTT::Exception, SocketError, SystemCallError, Timeout::Error
284
- @conChangeMutex.synchronize {
285
- @connected = false;
299
+ @packetQueueMutex.synchronize {
300
+ @packetQueue.shift();
286
301
  }
287
- @mqtt.disconnect();
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
288
308
  end
289
309
  end
290
310
  end
291
311
  private :mqtt_push_thread
292
312
 
293
313
  def mqtt_resub_thread
294
- while(true)
314
+ loop do
295
315
  begin
316
+ STDERR.puts("MQTT: #{@mqtt.host} trying reconnect...".yellow)
296
317
  Timeout.timeout(4) {
297
318
  @mqtt.connect()
298
319
  }
@@ -300,12 +321,16 @@ class SubHandler
300
321
  @conChangeMutex.synchronize {
301
322
  @connected = true;
302
323
  }
303
- @publisherThread.run();
324
+
325
+ @packetQueueMutex.synchronize {
326
+ @publisherThread.run() if (@publisherThread && @publisherThreadWaiting)
327
+ }
328
+
304
329
  @mqtt.get do |topic, message|
305
330
  call_interested(topic, message);
306
331
  end
307
332
  rescue MQTT::Exception, Timeout::Error, SocketError, SystemCallError
308
- STDERR.puts("MQTT #{@mqtt.host} disconnected!".red);
333
+ STDERR.puts("MQTT: #{@mqtt.host} disconnected!".red) if @connected
309
334
  @connected = false;
310
335
 
311
336
  @conChangeMutex.unlock if @conChangeMutex.owned?
@@ -328,11 +353,11 @@ class SubHandler
328
353
  Thread.stop();
329
354
  end
330
355
  def flush_pubqueue()
331
- unless @publishQueue.empty?
356
+ unless @packetQueue.empty?
332
357
  print "Finishing sending of MQTT messages ... "
333
358
  begin
334
359
  Timeout.timeout(4) {
335
- until @publishQueue.empty? do
360
+ until @packetQueue.empty? do
336
361
  sleep 0.05;
337
362
  end
338
363
  }
@@ -370,8 +395,10 @@ class SubHandler
370
395
 
371
396
  @mqtt.client_id ||= MQTT::Client.generate_client_id("MQTT_Sub_", 8);
372
397
 
373
- @publishQueue = Array.new();
374
- @subscribeQueue = Array.new();
398
+ @packetQueue = Array.new();
399
+ @packetQueueMutex = Mutex.new();
400
+ @publisherThreadWaiting = false;
401
+
375
402
  @subscribedTopics = Hash.new();
376
403
 
377
404
  @trackerHash = Hash.new();
@@ -382,13 +409,8 @@ class SubHandler
382
409
  end
383
410
  @listenerThread.abort_on_exception = true;
384
411
 
385
- @publisherThread = Thread.new do
386
- mqtt_push_thread();
387
- end
388
- @publisherThread.abort_on_exception = true;
389
-
390
412
  begin
391
- Timeout.timeout(3) {
413
+ Timeout.timeout(5) {
392
414
  until(@connected)
393
415
  sleep 0.1;
394
416
  end
@@ -397,10 +419,15 @@ class SubHandler
397
419
  STDERR.puts "MQTT: #{@mqtt.host} did not connect!".red
398
420
  end
399
421
 
422
+ @publisherThread = Thread.new do
423
+ mqtt_push_thread();
424
+ end
425
+ @publisherThread.abort_on_exception = true;
426
+
400
427
  at_exit {
401
428
  flush_pubqueue();
429
+ @connected = false;
402
430
  @listenerThread.kill();
403
- @publisherThread.kill();
404
431
  ensure_clean_exit();
405
432
  }
406
433
  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
4
+ version: 0.1.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xasin