lora-rb 0.13.0 → 0.14.0
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 +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
|