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 +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +32 -2
- data/lib/config/config.rb +3 -1
- data/lib/config/private.yml +2 -2
- data/lib/core/configuration.rb +3 -1
- data/lib/lora-rb/base.rb +23 -0
- data/lib/lora-rb/http/call.rb +10 -0
- data/lib/lora-rb/mqtt/call.rb +129 -27
- data/lib/lora-rb/rabbitmq/call.rb +10 -0
- data/lib/lora-rb/tls/call.rb +10 -0
- data/lib/lora-rb/utility.rb +4 -0
- data/lib/version.rb +2 -2
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 235226d726a9323c2c3ccd296f08ca7193001179
|
4
|
+
data.tar.gz: 3602887c6d1d351785ce3c9249e88cf56ea25e90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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}'},
|
data/lib/config/private.yml
CHANGED
@@ -8,12 +8,12 @@ defaults: &defaults
|
|
8
8
|
#connector_id: "69643d32"
|
9
9
|
# A2a
|
10
10
|
#appid: "a1b2c3d4e5f60001"
|
11
|
-
appid: "
|
11
|
+
appid: "9956" # SSG dev
|
12
12
|
token: "2B7E151628AED2A6ABF7158809CF4F3C"
|
13
13
|
username: "fractalgarden"
|
14
14
|
password: "fr4ctalg4rden"
|
15
15
|
|
16
|
-
test_eui: "
|
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
|
|
data/lib/core/configuration.rb
CHANGED
@@ -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
|
data/lib/lora-rb/http/call.rb
CHANGED
@@ -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
|
data/lib/lora-rb/mqtt/call.rb
CHANGED
@@ -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 =
|
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 "
|
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 "
|
90
|
-
|
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 "
|
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 "
|
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
|
-
|
132
|
-
message['
|
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 "
|
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 "
|
152
|
+
puts " original json: #{topic}: #{message}" if options[:debug] == :full
|
148
153
|
message = JSON.parse(message)
|
149
154
|
if message.respond_to? '[]'
|
150
|
-
|
151
|
-
message['
|
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 "
|
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
|
-
|
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
|
data/lib/lora-rb/tls/call.rb
CHANGED
@@ -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
|
data/lib/lora-rb/utility.rb
CHANGED
data/lib/version.rb
CHANGED
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.
|
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-
|
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
|