lora-rb 0.13.0 → 0.14.0

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
  SHA1:
3
- metadata.gz: c69af1bb8d861091a38f5520a8e5363283da9c7c
4
- data.tar.gz: be29e3ee50a7c565592c1edbd3f3f4f33c17ee56
3
+ metadata.gz: 235226d726a9323c2c3ccd296f08ca7193001179
4
+ data.tar.gz: 3602887c6d1d351785ce3c9249e88cf56ea25e90
5
5
  SHA512:
6
- metadata.gz: b8f950c4d83d6b92c2cc16077f644d6de03ef0e61fea00530bfe94a985c761c95045cf1e12aba1f0c73c9b8b54355f12a323f888cd1cfa586ab2ceee4b799750
7
- data.tar.gz: d7c5730946bee3ad5eadb5ebcc412329a5a3347403e2b262fcf469e4bb0cf14e7d222070c8be2a40c411aebc38793da00413d8fd8cd9f021d20f162ba9b34b9e
6
+ metadata.gz: 1b52de77fbcace7cc959ed9cf7534bd7348510b6464f39e3bf2006827e144c22e7a02f38365134b615baabefcdbcaf7b2043cc0e432246faaaf53152ad424dfe
7
+ data.tar.gz: 191e3fbdd9abd4157cc98e6c057a19f55f56399af25c7b0177cac2b0f06a56887b68f11ad47df651c29d1620451d73540908bd67a4af151dfb7352a0739f4f89
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ v0.14.0 [☰](https://bitbucket.org/fractalgarden/loriot-rb/branches/compare/v0.13.0..v0.14.0) September 28th, 2017
2
+ ------------------------------
3
+ * Mqtt: read data and listen does not add eui and port anymore if they are nil
4
+
1
5
  v0.13.0 [☰](https://bitbucket.org/fractalgarden/loriot-rb/branches/compare/v0.12.0..v0.13.0) September 12th, 2017
2
6
  ------------------------------
3
7
  * Mqtt: in the send_cmd, qos parameter is not set by default anymore
data/README.md CHANGED
@@ -26,8 +26,8 @@ among which you can choose to connect to the lora network.
26
26
 
27
27
  This version supports:
28
28
 
29
- 1. TLS protocol with [Loriot](http://loriot.io)
30
- 2. Http push with [Resiot](http://resiot.io)
29
+ 1. TLS protocol with [Loriot](http://loriot.io) (No longer supported)
30
+ 2. Http push with [Resiot](http://resiot.io) (No longer supported)
31
31
  3. MQTT with [A2aSmartCity](http://www.a2asmartcity.io/)
32
32
 
33
33
  ## Configuration
@@ -151,6 +151,7 @@ you should receive the instance with variables depending on protocol:
151
151
  lora.send_cmd(eui: 'Insert here your device eui', confirmed: true, data: '0101')
152
152
  ```
153
153
 
154
+ Add **debug: true** to get a trace of the operations. Use the value __:full__ to get more information.
154
155
  The response depend on the provider.
155
156
  This is an example using tls protocol and the provider Loriot.io:
156
157
 
@@ -196,6 +197,8 @@ This is an example provided using mqtt protocol and the provider A2a:
196
197
  {"reply"=>{"confirmed"=>false, "id"=>150, "payload"=>"0100", "port"=>40, "priority"=>0}, "status"=>200, "eui"=>nil, "port"=>nil}
197
198
  ```
198
199
 
200
+ #### Implemented only on Mqtt
201
+
199
202
  Using MQTT, by default the param wait_response is true. This means after publishing a message it waits the response
200
203
  on dedicated topic.
201
204
 
@@ -219,6 +222,33 @@ lora.send_cmd(eui: 'Insert here your device eui',
219
222
  wait_response: false)
220
223
  ```
221
224
 
225
+ The param delete_previous_enqueued_commands is true by default as well. It means previous enqueued messages to the node
226
+ are deleted (the queue is emptied) before sending a new one.
227
+
228
+ If you need to keep the queue:
229
+
230
+ ```ruby
231
+ lora.send_cmd(eui: 'Insert here your device eui', confirmed: true, data: '0100', delete_previous_enqueued_commands: false)
232
+ ```
233
+
234
+ To get enqueued messages:
235
+
236
+ ```ruby
237
+ lora.get_enqueued_messages(eui: 'Insert here your device eui')
238
+ ```
239
+
240
+ To explicitly delete enqueued messages:
241
+
242
+ ```ruby
243
+ lora.delete_enqueued_messages(eui: 'Insert here your device eui')
244
+ ```
245
+
246
+ or passing the id to delete ony that message:
247
+
248
+ ```ruby
249
+ lora.delete_enqueued_messages(eui: 'Insert here your device eui', id: 1234)
250
+ ```
251
+
222
252
  ### Uplink: receive data from devices
223
253
 
224
254
  To listen your devices:
data/lib/config/config.rb CHANGED
@@ -12,7 +12,9 @@ LoraRb.configure do |config|
12
12
  config.port = 8883
13
13
  config.uplink_url = '/sub/v1/users/{username}/apps/{appid}/devices/+/uplink/+'
14
14
  config.downlink_url = '/api/v1/users/{username}/apps/{appid}/devices/{deveui}/downlink/post/reply/{clientid}/id/{requestid}'
15
- config.timeout = 10.0
15
+ config.delete_enqueued_downlink_url = '/api/v1/users/{username}/apps/{appid}/devices/{deveui}/downlink/{id}/delete/reply/{clientid}/id/{requestid}'
16
+ config.enqueued_downlinks_url = '/api/v1/users/{username}/apps/{appid}/devices/{deveui}/downlink/get/reply/{clientid}/id/{requestid}'
17
+ config.timeout = 60.0
16
18
  # If you expect more than one response in a topic, add an item with url=nil to not subscribe it newly
17
19
  config.downlink_response_urls = [
18
20
  { name: :queued, url: 'reply/{clientid}/id/{requestid}'},
@@ -8,12 +8,12 @@ defaults: &defaults
8
8
  #connector_id: "69643d32"
9
9
  # A2a
10
10
  #appid: "a1b2c3d4e5f60001"
11
- appid: "9955"
11
+ appid: "9956" # SSG dev
12
12
  token: "2B7E151628AED2A6ABF7158809CF4F3C"
13
13
  username: "fractalgarden"
14
14
  password: "fr4ctalg4rden"
15
15
 
16
- test_eui: "be7a00000000123c"
16
+ test_eui: "be7a0000000010cf"
17
17
  #foo: add every variable you need and use it with => LoraRb::Settings.foo
18
18
  # bar: sub variable are accessible with hash => LoraRb::Settings.foo[:bar]
19
19
 
@@ -3,7 +3,7 @@ module LoraRb
3
3
  # attr_writer :allow_sign_up
4
4
 
5
5
  attr_accessor :protocol, :host, :port, :uplink_url, :downlink_url, :downlink_response_urls, :ssl, :ssl_file, :env,
6
- :timeout
6
+ :timeout, :enqueued_downlinks_url, :delete_enqueued_downlink_url
7
7
 
8
8
  def initialize
9
9
  @protocol = nil
@@ -11,7 +11,9 @@ module LoraRb
11
11
  @port = nil
12
12
  @uplink_url = nil
13
13
  @downlink_url = nil
14
+ @enqueued_downlinks_url = nil
14
15
  @downlink_response_urls = nil
16
+ @delete_enqueued_downlink_url = nil
15
17
  @ssl = nil # True if uses tls
16
18
  @ssl_file = nil # The certificate's path
17
19
  @env = 'development'
data/lib/lora-rb/base.rb CHANGED
@@ -16,7 +16,9 @@ class LoraClient
16
16
  port: LoraRb.configuration.port,
17
17
  uplink_url: LoraRb.configuration.uplink_url,
18
18
  downlink_url: LoraRb.configuration.downlink_url,
19
+ enqueued_downlinks_url: LoraRb.configuration.enqueued_downlinks_url,
19
20
  downlink_response_urls: LoraRb.configuration.downlink_response_urls,
21
+ delete_enqueued_downlink_url: LoraRb.configuration.delete_enqueued_downlink_url,
20
22
  username: LoraRb::Settings.username,
21
23
  password: LoraRb::Settings.password,
22
24
  ssl: LoraRb.configuration.ssl,
@@ -26,6 +28,8 @@ class LoraClient
26
28
  @token = options[:token]
27
29
  @appid = options[:appid]
28
30
 
31
+ require 'philter'
32
+ require 'securerandom'
29
33
  welcome_response = sub_initialize(options)
30
34
 
31
35
  raise("Lora-rb: Cannot connect to host #{options[:host]}:#{options[:port]}") unless welcome_response.key?('hello')
@@ -67,6 +71,25 @@ class LoraClient
67
71
  sub_listen(options, &block)
68
72
  end
69
73
 
74
+ # It returns enqueued message ready to delivery to node
75
+ # ['topic', {'reply' => [ { ... } ], 'status' => 200}]
76
+ def get_enqueued_messages(eui:, request_id: nil, debug: false)
77
+ res = sub_get_enqueued_messages(eui: eui,
78
+ request_id: request_id,
79
+ debug: debug)
80
+ puts "get_enqueued_message #{res}" if @debug
81
+ res
82
+ end
83
+
84
+ # It returns enqueued message ready to delivery to node
85
+ # ['topic', [ {'reply' => { ... }, 'status' => 200 ] ]
86
+ def delete_enqueued_messages(eui:, id: nil, debug: false)
87
+ res = sub_delete_enqueued_messages(eui: eui,
88
+ id: id,
89
+ debug: debug)
90
+ puts "delete_enqueued_message #{res}" if @debug
91
+ res
92
+ end
70
93
  # Close the secure connection with the cloud
71
94
  def quit
72
95
  sub_quit
@@ -48,6 +48,16 @@ module LoraRb
48
48
  raise('In http protocol, it expects data with an http server. Lora Network server must exec an http push ')
49
49
  end
50
50
 
51
+ # Pending ...
52
+ def sub_get_enqueued_messages(eui:, request_id: nil, debug: false)
53
+ raise "Pending..."
54
+ end
55
+
56
+ # Pending ...
57
+ def sub_delete_enqueued_messages(eui:, request_id: nil, debug: false)
58
+ raise "Pending..."
59
+ end
60
+
51
61
  # Blank method. No need to close a connection with the http protocol
52
62
  def sub_quit
53
63
  end
@@ -21,7 +21,6 @@ module LoraRb
21
21
 
22
22
  @username = options[:username]
23
23
  @client_id = "#{@username}::ssg#{generate_request_id}"
24
- @downlink_response_urls = options[:downlink_response_urls]
25
24
 
26
25
  @client = MQTT::Client.connect(
27
26
  host: options[:host],
@@ -38,7 +37,10 @@ module LoraRb
38
37
  appid: @appid },
39
38
  { debug: options[:debug] })
40
39
 
41
- @downlink_url = merge_tags_to_url(options[:downlink_url])
40
+ @downlink_url = options[:downlink_url]
41
+ @downlink_response_urls = options[:downlink_response_urls]
42
+ @enqueued_downlinks_url = options[:enqueued_downlinks_url]
43
+ @delete_enqueued_downlink_url = options[:delete_enqueued_downlink_url]
42
44
  @timeout = options[:timeout]
43
45
  @wait_response = options.has_key?(:wait_response) ? options[:wait_response] : true
44
46
  {'hello' => 'Lora-Rb: Ready to start!'}
@@ -46,21 +48,16 @@ module LoraRb
46
48
 
47
49
  # Send the request to device
48
50
  def sub_send_cmd(options={})
49
- options = { wait_response: @wait_response }.merge(options)
51
+ options = { wait_response: @wait_response, delete_previous_enqueued_commands: true }.merge(options)
52
+
53
+ sub_delete_enqueued_messages(eui: options[:eui], debug: options[:debug]) if options[:delete_previous_enqueued_commands]
54
+
50
55
  h_request = {
51
56
  "port": options[:port], # Port where the message should be sent
52
57
  "payload": options[:data], # Message payload
53
58
  "confirmed": options[:confirmed], # (Optional) Tells whether a confirmed downlink is requested. Default: false
54
59
  "window": options[:window] || "BOTH", # (Optional) Specifies which rx window should be used: RX1, RX2 or any(BOTH). Default: BOTH
55
60
  "priority": options[:priority] || 0, # (Optional) Message priority, used to sort messages in the queue. Default: 0
56
- #"qos": options[:qos] || 1 # (Optional) Quality Of Service:
57
- # 0 - Best effort. The message will be transmitted to the devices
58
- # of the group that satisfy the multicast profile requirements
59
- # (they should have been activated and have sent at least one
60
- # uplink, they should be class C devices, etc..).
61
- # 1 - Transmission guaranteed. No message will be transmitted if
62
- # some devices do not satisfy the multicast profile requirements.
63
- # Default: 1 */
64
61
  }
65
62
  request_id = generate_request_id
66
63
  publish_url = merge_tags_to_url(@downlink_url,
@@ -70,9 +67,9 @@ module LoraRb
70
67
  clientid: @client_id,
71
68
  requestid: request_id)
72
69
 
73
- puts "#{Time.now} publish #{h_request.to_json} to #{publish_url}" if options[:debug]
74
-
70
+ puts " publish #{h_request.to_json} to #{publish_url}" if options[:debug]
75
71
  responses = []
72
+ response_topics = []
76
73
  # thr_response = nil
77
74
  if options[:wait_response]
78
75
  @downlink_response_urls.each do |dru_hash|
@@ -86,9 +83,12 @@ module LoraRb
86
83
  deveui: options[:eui],
87
84
  clientid: @client_id,
88
85
  requestid: request_id)
89
- puts " [x] Subscribing response #{response_topic}" if options[:debug] == :full
90
- @client.subscribe(response_topic)
86
+ puts " Subscribing response #{response_topic}" if options[:debug] == :full
87
+ response_topics << response_topic
91
88
  end
89
+
90
+ raise "cannot subscribe without topic, response_topics is empty!" if response_topics.empty?
91
+ @client.subscribe(*response_topics)
92
92
  end
93
93
 
94
94
  @client.publish(publish_url, h_request.to_json, false)
@@ -98,11 +98,13 @@ module LoraRb
98
98
  # thr_responses.each { |thr_response| thr_response.join }
99
99
  # thr_response.join
100
100
  @downlink_response_urls.each do |dru_hash|
101
- response_topic, response_message = sub_read_data(topic: nil)
101
+ response_topic, response_message = sub_read_data(topic: nil, debug: options[:debug])
102
102
  response = { topic: response_topic, json: response_message }
103
- puts " [x] Found response #{response} " if options[:debug] == :full
103
+ puts " Found response #{response} " if options[:debug] == :full
104
104
  responses << response
105
105
  end
106
+
107
+ @client.unsubscribe(*response_topics)
106
108
  end
107
109
  responses
108
110
  end
@@ -110,11 +112,12 @@ module LoraRb
110
112
  # Receive the payload from the network
111
113
  # There is a timeout. Use this method only to retrieve data from the queue. If you have to waiting data
112
114
  # please use listen.
115
+ # If topic is nil it uses subscribed topics
113
116
  def sub_read_data(options={})
114
117
  topic = options.has_key?(:topic) ? options[:topic] : @topic
115
118
  if topic
116
119
  topic = topic.dup
117
- puts " [x] Reading topic #{topic}..." if options[:debug]
120
+ puts " Reading topic #{topic}..." if options[:debug]
118
121
  end
119
122
 
120
123
  message = nil
@@ -128,8 +131,10 @@ module LoraRb
128
131
 
129
132
  message = JSON.parse(message)
130
133
  if message.respond_to? '[]'
131
- message['eui'] ||= get_eui_from_topic(topic)
132
- message['port'] ||= get_port_from_topic(topic)
134
+ eui = get_eui_from_topic(topic)
135
+ message['eui'] ||= eui if eui
136
+ port = get_port_from_topic(topic)
137
+ message['port'] ||= port if port
133
138
  end
134
139
  return topic, message
135
140
  end
@@ -139,18 +144,20 @@ module LoraRb
139
144
  topic = options.has_key?(:topic) ? options[:topic] : @topic
140
145
  if topic
141
146
  topic = topic.dup
142
- puts " [*] Waiting for messages in #{topic}. To exit press CTRL+C" if options[:debug]
147
+ puts " Waiting for messages in #{topic}. To exit press CTRL+C" if options[:debug]
143
148
  end
144
149
 
145
150
  @client.get(topic) do |topic, message|
146
151
  # Block is executed for every message received
147
- puts " [x] #{topic}: #{message}" if options[:debug]
152
+ puts " original json: #{topic}: #{message}" if options[:debug] == :full
148
153
  message = JSON.parse(message)
149
154
  if message.respond_to? '[]'
150
- message['eui'] ||= get_eui_from_topic(topic)
151
- message['port'] ||= get_port_from_topic(topic)
155
+ eui = get_eui_from_topic(topic)
156
+ message['eui'] ||= eui if eui
157
+ port = get_port_from_topic(topic)
158
+ message['port'] ||= port if port
152
159
  end
153
- puts " [x] after rework: #{message}" if options[:debug]
160
+ puts " #{message}" if options[:debug] #After reworking
154
161
  block.call(topic, message) if block_given?
155
162
  break if options[:test]
156
163
  end
@@ -161,7 +168,80 @@ module LoraRb
161
168
  @client.disconnect
162
169
  end
163
170
 
164
- private
171
+ # Get enqueued messages from the network queue
172
+ def sub_get_enqueued_messages(eui:, request_id: nil, debug: false)
173
+ request_id ||= generate_request_id
174
+ raise "eui cannot be empty!" unless eui
175
+
176
+ queued_response_url = @downlink_response_urls.philter({name: :queued}, get: :url).first
177
+ raise "queued_topic not found in the config yml!" unless queued_response_url
178
+ queued_response_url = merge_tags_to_url(queued_response_url,
179
+ username: @username,
180
+ appid: @appid,
181
+ deveui: eui,
182
+ clientid: @client_id,
183
+ requestid: request_id)
184
+ puts " queued_response_url #{queued_response_url}" if debug
185
+ @client.subscribe(queued_response_url)
186
+
187
+ # Check if there are previous messages to clear
188
+ enqueued_downlinks_url = merge_tags_to_url(@enqueued_downlinks_url,
189
+ username: @username,
190
+ appid: @appid,
191
+ deveui: eui,
192
+ clientid: @client_id,
193
+ requestid: request_id)
194
+ puts " enqueued_downlinks_url #{enqueued_downlinks_url}" if debug
195
+ # Request enqueued items
196
+ @client.publish(enqueued_downlinks_url, ''.to_json, false)
197
+
198
+ response_topic, response_message = sub_read_data(topic: nil, debug: debug)
199
+ puts " Topic #{response_topic} response #{response_message} " if debug == :full
200
+
201
+ @client.unsubscribe(queued_response_url)
202
+
203
+ return response_topic, response_message
204
+ end
205
+
206
+ # Delete one or all enqueued messages from the network queue
207
+ def sub_delete_enqueued_messages(eui:, id: nil, debug: false)
208
+ request_id = generate_request_id
209
+ ids_to_delete = id ? [id] : all_enqueued_downlink_id(eui: eui, request_id: request_id, debug: debug)
210
+ queued_response_url = @downlink_response_urls.philter({name: :queued}, get: :url).first
211
+ raise "queued_topic not found in the config yml!" unless queued_response_url
212
+ queued_response_url = merge_tags_to_url(queued_response_url,
213
+ username: @username,
214
+ appid: @appid,
215
+ deveui: eui,
216
+ clientid: @client_id,
217
+ requestid: request_id)
218
+
219
+ puts " response_topic #{queued_response_url}" if debug
220
+ @client.subscribe(queued_response_url)
221
+
222
+ responses = []
223
+ ids_to_delete.each do |id_to_delete|
224
+ # Check if there are previous messages to clear
225
+ delete_enqueued_downlink_url = merge_tags_to_url(@delete_enqueued_downlink_url,
226
+ username: @username,
227
+ appid: @appid,
228
+ deveui: eui,
229
+ id: id_to_delete,
230
+ clientid: @client_id,
231
+ requestid: request_id)
232
+ puts " delete_enqueued_downlink_url #{delete_enqueued_downlink_url}" if debug
233
+ # Request enqueued items
234
+ @client.publish(delete_enqueued_downlink_url, ''.to_json, false)
235
+
236
+ queued_response_url, response_message = sub_read_data(topic: nil, debug: debug)
237
+ puts " Found response #{response_message} " if debug == :full
238
+ responses << response_message
239
+ end
240
+
241
+ @client.unsubscribe(queued_response_url)
242
+
243
+ return queued_response_url, responses
244
+ end
165
245
 
166
246
  def get_eui_from_topic(topic)
167
247
  res = topic&.match(/devices\/(\w{16})/)
@@ -174,7 +254,29 @@ module LoraRb
174
254
  end
175
255
 
176
256
  def generate_request_id
177
- Time.now.strftime('%y%m%d%H%M%S')
257
+ "#{Time.now.strftime('%y%m%d%H%M%S')}#{SecureRandom.hex(1)}"
258
+ end
259
+
260
+ # It returns and array of ids from enqueued downlink response
261
+ # Response example:
262
+ # {"reply"=>[
263
+ # {"confirmed"=>true, "id"=>5034, "payload"=>"0200", "port"=>40, "priority"=>0},
264
+ # {"confirmed"=>true, "id"=>5035, "payload"=>"0200", "port"=>40, "priority"=>0},
265
+ # {"confirmed"=>true, "id"=>5036, "payload"=>"0200", "port"=>40, "priority"=>0},
266
+ # {"confirmed"=>true, "id"=>5037, "payload"=>"0200", "port"=>40, "priority"=>0}],
267
+ # "status"=>200}]
268
+ # Returns:
269
+ # [5034, 5035, 5036, 5037]
270
+ def all_enqueued_downlink_id(enqueued_messages:nil, eui:nil, request_id:nil, debug:false)
271
+ enqueued_messages ||= sub_get_enqueued_messages(eui: eui, request_id: request_id, debug: debug).last
272
+ raise "Cannot process enqueued messages since status=#{enqueued_messages['status']}" unless enqueued_messages['status'] == 200
273
+ return [] if enqueued_messages['reply'].nil?
274
+ raise "An array was expected not: #{enqueued_messages['reply']}" unless enqueued_messages['reply'].is_a?(Array)
275
+ res = enqueued_messages['reply'].map do |message|
276
+ message['id']
277
+ end
278
+ puts "#{res}" if debug == :full
279
+ res
178
280
  end
179
281
 
180
282
  end
@@ -43,6 +43,16 @@ module LoraRb
43
43
  end
44
44
  end
45
45
 
46
+ # Pending ...
47
+ def sub_get_enqueued_messages(eui:, request_id: nil, debug: false)
48
+ raise "Pending..."
49
+ end
50
+
51
+ # Pending ...
52
+ def sub_delete_enqueued_messages(eui:, request_id: nil, debug: false)
53
+ raise "Pending..."
54
+ end
55
+
46
56
  # Close the connection
47
57
  def sub_quit
48
58
  @connection.close
@@ -75,6 +75,16 @@ module LoraRb
75
75
  end while response && !options[:test]
76
76
  end
77
77
 
78
+ # Pending ...
79
+ def sub_get_enqueued_messages(eui:, request_id: nil, debug: false)
80
+ raise "Pending..."
81
+ end
82
+
83
+ # Pending ...
84
+ def sub_delete_enqueued_messages(eui:, request_id: nil, debug: false)
85
+ raise "Pending..."
86
+ end
87
+
78
88
  # Close the connection
79
89
  def sub_quit
80
90
  @ssl_socket.close
@@ -16,4 +16,8 @@ module LoraRb
16
16
  url
17
17
  end
18
18
  end
19
+
20
+ def puts(message)
21
+ Kernel.puts "[#{self.class.name}##{__method__}] #{Time.now} #{message}"
22
+ end
19
23
  end
data/lib/version.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module LoraRb
2
2
  def self.version
3
- "0.13.0"
3
+ "0.14.0"
4
4
  end
5
5
  def self.updated_at
6
- "2017-09-12"
6
+ "2017-09-29"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lora-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marco Mastrodonato
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-09-12 00:00:00.000000000 Z
13
+ date: 2017-09-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json
@@ -26,6 +26,34 @@ dependencies:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
28
  version: '2.1'
29
+ - !ruby/object:Gem::Dependency
30
+ name: mqtt
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: 0.5.0
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: 0.5.0
43
+ - !ruby/object:Gem::Dependency
44
+ name: philter
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 1.2.0
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: 1.2.0
29
57
  - !ruby/object:Gem::Dependency
30
58
  name: test-unit
31
59
  requirement: !ruby/object:Gem::Requirement