lora-rb 0.9.3 → 0.10.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 +6 -0
- data/README.md +94 -21
- data/lib/lora-rb/mqtt/call.rb +15 -4
- data/lib/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93e06d7a345ef9d3fbd6d15f3b83def826bb7b1d
|
4
|
+
data.tar.gz: 342d7271ad93a511afb6d961b24a98c7622ca82e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57bdf6e6a7a1f395ac9000a0c579999e6932c542e77f42b9abadd2e14753f20a499f7c26a5e0751d00819a3e8062bf1cc203fb0e4efc759b2daa74a9d0d1ae7d
|
7
|
+
data.tar.gz: b73ce87d688ea98f6760ef2e92275ac384496e3d2443b8681db4f1544b0d633609a7bf0455e3e8a61554f4277c41065c691674fea28ec1ebd39227d3f4e48e40
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
v0.10.0 [☰](https://bitbucket.org/fractalgarden/loriot-rb/branches/compare/v0.9.0..v0.10.0) August 8th, 2017
|
2
|
+
------------------------------
|
3
|
+
* Mqtt:
|
4
|
+
* added multi threading support
|
5
|
+
* send_cmd now set wait_response: true by default. With this param, the response is waited using a separate thread
|
6
|
+
|
1
7
|
v0.9.3 August 8th, 2017
|
2
8
|
------------------------------
|
3
9
|
* Fixed a bug with mqtt protocol: now when LoraClient is instantiated uses the new client id just generated
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# IOT at you service with
|
2
|
-
### Manage your devices
|
1
|
+
# IOT at you service with Lora and Ruby
|
2
|
+
### Manage your devices under the Lora Network
|
3
3
|
|
4
4
|
[![Version ](https://badge.fury.io/rb/lora-rb.svg) ](https://rubygems.org/gems/lora-rb)
|
5
5
|
[![Travis CI ](http://img.shields.io/travis/marcomd/lora-rb/master.svg) ](https://travis-ci.org/marcomd/lora-rb)
|
@@ -21,7 +21,8 @@ To use it in a bundle, add to gem file `gem 'lora-rb'` and run `bundle install`
|
|
21
21
|
|
22
22
|
## Connection to lora server
|
23
23
|
|
24
|
-
|
24
|
+
To use this gem you have to choose your provider. Each of them has its own features and offers a bouquet of protocols
|
25
|
+
among which you can choose to connect to the lora network.
|
25
26
|
|
26
27
|
This version supports:
|
27
28
|
1. TLS protocol with [Loriot](http://loriot.io)
|
@@ -30,11 +31,11 @@ This version supports:
|
|
30
31
|
|
31
32
|
## Configuration
|
32
33
|
|
33
|
-
Insert private
|
34
|
+
Insert private informations in the yaml:
|
34
35
|
|
35
36
|
lib/config/private.yml
|
36
37
|
|
37
|
-
and the configuration's
|
38
|
+
and the configuration's parameters in the config file.
|
38
39
|
|
39
40
|
lib/config/config.rb
|
40
41
|
|
@@ -42,7 +43,9 @@ If you are using rails you can use the generator:
|
|
42
43
|
|
43
44
|
bundle exec rails generate lora_rb:install
|
44
45
|
|
45
|
-
Every provider assign you a token and an
|
46
|
+
Every provider assign you a token and an app id.
|
47
|
+
Someone can provide some additional parameters such as username and password.
|
48
|
+
Insert your secret data in the yaml:
|
46
49
|
|
47
50
|
```yaml
|
48
51
|
defaults:
|
@@ -54,7 +57,8 @@ defaults:
|
|
54
57
|
connector_id:
|
55
58
|
```
|
56
59
|
|
57
|
-
If you are using Rails 5.1 you can
|
60
|
+
If you are using Rails 5.1 you can encrypt these private data and insert into the yaml with erb.
|
61
|
+
Something like this:
|
58
62
|
|
59
63
|
```yaml
|
60
64
|
defaults: &defaults
|
@@ -63,11 +67,15 @@ defaults: &defaults
|
|
63
67
|
# etc ...
|
64
68
|
```
|
65
69
|
|
70
|
+
## Connection's protocols
|
71
|
+
|
72
|
+
While the information in the yaml file is subdivided by environment, the connection configuration file contains
|
73
|
+
shared parameters for all environments.
|
74
|
+
|
66
75
|
### TLS (with Loriot)
|
67
76
|
|
68
77
|
```ruby
|
69
78
|
LoraRb.configure do |config|
|
70
|
-
# These informations are shared for all environments
|
71
79
|
config.protocol = :tls
|
72
80
|
config.host = 'eu1.loriot.io'
|
73
81
|
config.port = 737
|
@@ -78,7 +86,6 @@ end
|
|
78
86
|
|
79
87
|
```ruby
|
80
88
|
LoraRb.configure do |config|
|
81
|
-
# These informations are shared for all environments
|
82
89
|
config.protocol = :http
|
83
90
|
config.host = 'eu72.resiot.io'
|
84
91
|
config.port = 80
|
@@ -89,7 +96,6 @@ end
|
|
89
96
|
|
90
97
|
```ruby
|
91
98
|
LoraRb.configure do |config|
|
92
|
-
# These informations are shared for all environments
|
93
99
|
config.protocol = :rabbitmq
|
94
100
|
config.host = 'localhost'
|
95
101
|
end
|
@@ -99,7 +105,6 @@ end
|
|
99
105
|
|
100
106
|
```ruby
|
101
107
|
LoraRb.configure do |config|
|
102
|
-
# These informations are shared for all environments
|
103
108
|
config.protocol = :mqtt
|
104
109
|
config.host = 'ptnetsuite.a2asmartcity.io'
|
105
110
|
config.port = 8883
|
@@ -130,34 +135,69 @@ you should receive the instance with variables depending on protocol:
|
|
130
135
|
#<LoraClient:0x0056318ad8e048 ...
|
131
136
|
```
|
132
137
|
|
133
|
-
###
|
138
|
+
### Downlink: send data to the device
|
134
139
|
|
135
140
|
|
136
141
|
```ruby
|
137
|
-
lora.send_cmd(
|
142
|
+
lora.send_cmd(eui: 'Insert here your device eui', confirmed: true, data: '0101')
|
138
143
|
```
|
139
144
|
|
140
|
-
|
145
|
+
The response depend on the provider.
|
146
|
+
This is an example using tls protocol and the provider Loriot.io:
|
141
147
|
|
142
148
|
```json
|
143
|
-
{ "cmd":"tx", "EUI":"
|
149
|
+
{ "cmd":"tx", "EUI":"a000000000001234", "port":40, "confirmed":false, "data":"0101" }
|
144
150
|
```
|
145
151
|
|
146
|
-
|
152
|
+
or
|
147
153
|
|
148
154
|
```json
|
149
|
-
{ "cmd":"txd", "EUI":"
|
155
|
+
{ "cmd":"txd", "EUI":"a000000000001234", "seqdn":114, "seqq":113, "ts":1489133179385 }
|
150
156
|
```
|
151
157
|
|
152
|
-
|
158
|
+
or
|
159
|
+
|
160
|
+
```json
|
161
|
+
{ "cmd":"tx", "EUI":"a000000000001234", "seqdn": 4, "data": "0301", "success": "Data enqueued" }
|
162
|
+
```
|
163
|
+
|
164
|
+
This is an example using http protocol and the provider Resiot.io
|
165
|
+
|
166
|
+
```json
|
167
|
+
{
|
168
|
+
"CommType"=>"comm_rx",
|
169
|
+
"Connector"=>"69643d32",
|
170
|
+
"AppEui"=>"a1b2c3d4e5f60001",
|
171
|
+
"DevEui"=>"be7a00000000123c",
|
172
|
+
"Port"=>"10",
|
173
|
+
"GatewayEUIs"=>["00000111180e2222"],
|
174
|
+
"Payload"=>"0063",
|
175
|
+
"Extra"=>{"JSONRXINFO"=>"[\"{\\\"altitude\\\":0,\\\"latitude\\\":0,\\\"loRaSNR\\\":8.8,\\\"longitude\\\":0,\\\"mac\\\":\\\"00000111180e2222\\\",\\\"name\\\":\\\"00000111180e2222\\\",\\\"rssi\\\":-67}\"]",
|
176
|
+
"adr"=>"true", "bandwidth"=>"125", "fCnt"=>"132", "frequency"=>"868100000", "spreadFactor"=>"7"},
|
177
|
+
"DT"=>"2017-07-03T15:28:01.098886848+02:00",
|
178
|
+
"auth_token"=>"abcd1234",
|
179
|
+
"lora"=>{"CommType"=>"comm_rx", "Connector"=>"abcd", "AppEui"=>"abcd", "DevEui"=>"a000000000001234", "Port"=>"10", "GatewayEUIs"=>["abcd"], "Payload"=>"0063",
|
180
|
+
"Extra"=>{"JSONRXINFO"=>"[\"{\\\"altitude\\\":0,\\\"latitude\\\":0,\\\"loRaSNR\\\":8.8,\\\"longitude\\\":0,\\\"mac\\\":\\\"00000111180e2222\\\",\\\"name\\\":\\\"00000111180e2222\\\",\\\"rssi\\\":-67}\"]", "adr"=>"true", "bandwidth"=>"125", "fCnt"=>"132", "frequency"=>"868100000", "spreadFactor"=>"7"}, "DT"=>"2017-07-03T15:28:01.098886848+02:00"}
|
181
|
+
}
|
182
|
+
```
|
153
183
|
|
154
|
-
|
184
|
+
This is an example provided using mqtt protocol and the provider A2a:
|
155
185
|
|
156
186
|
```json
|
157
|
-
{
|
187
|
+
{"reply"=>{"confirmed"=>false, "id"=>150, "payload"=>"0100", "port"=>40, "priority"=>0}, "status"=>200, "eui"=>nil, "port"=>nil}
|
158
188
|
```
|
159
189
|
|
160
|
-
|
190
|
+
Using MQTT, by default the param wait_response is true. This means after publishing a message it waits the response
|
191
|
+
on dedicated topic.
|
192
|
+
If you dont want to wait the response you just set that param to false.
|
193
|
+
|
194
|
+
```ruby
|
195
|
+
lora.send_cmd(eui: 'Insert here your device eui',
|
196
|
+
data: 'f0a1b3ff',
|
197
|
+
wait_response: false)
|
198
|
+
```
|
199
|
+
|
200
|
+
### Uplink: receive data from devices
|
161
201
|
|
162
202
|
To listen your devices:
|
163
203
|
|
@@ -165,6 +205,39 @@ To listen your devices:
|
|
165
205
|
lora.listen
|
166
206
|
```
|
167
207
|
|
208
|
+
You can also pass a block.
|
209
|
+
|
210
|
+
```ruby
|
211
|
+
lora.listen do |response|
|
212
|
+
# Do something ...
|
213
|
+
end
|
214
|
+
```
|
215
|
+
|
216
|
+
or with RabbitMq:
|
217
|
+
|
218
|
+
```ruby
|
219
|
+
lora.listen do |delivery_info, properties, body|
|
220
|
+
# Do something ...
|
221
|
+
end
|
222
|
+
```
|
223
|
+
|
224
|
+
or with mqtt protocol:
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
lora.listen do |topic, response|
|
228
|
+
# Do something ...
|
229
|
+
end
|
230
|
+
```
|
231
|
+
|
232
|
+
Using http protocol, instead, #listen is not available because uplink messages are received by api.
|
233
|
+
|
234
|
+
To receive only one message:
|
235
|
+
|
236
|
+
```ruby
|
237
|
+
lora.read_data
|
238
|
+
```
|
239
|
+
It returns the same data of listen method.
|
240
|
+
|
168
241
|
### Close the connection
|
169
242
|
|
170
243
|
```ruby
|
data/lib/lora-rb/mqtt/call.rb
CHANGED
@@ -36,11 +36,13 @@ module LoraRb
|
|
36
36
|
{ debug: options[:debug] })
|
37
37
|
|
38
38
|
@downlink_url = merge_tags_to_url(options[:downlink_url])
|
39
|
+
@wait_response = options.has_key?(:wait_response) ? options[:wait_response] : true
|
39
40
|
{'hello' => 'Lora-Rb: Ready to start!'}
|
40
41
|
end
|
41
42
|
|
42
43
|
# Send the request to device
|
43
44
|
def sub_send_cmd(options={})
|
45
|
+
options = { wait_response: @wait_response }.merge(options)
|
44
46
|
h_request = {
|
45
47
|
"port": options[:port], # Port where the message should be sent
|
46
48
|
"payload": options[:data], # Message payload
|
@@ -66,14 +68,23 @@ module LoraRb
|
|
66
68
|
|
67
69
|
puts "#{Time.now} publish #{h_request.to_json} to #{publish_url}" if options[:debug]
|
68
70
|
|
69
|
-
response = @client.publish(publish_url, h_request.to_json, false)
|
70
|
-
puts " [x] publish response: #{response}" if options[:debug]
|
71
71
|
|
72
|
+
response = nil
|
72
73
|
if options[:wait_response]
|
73
74
|
response_topic = "reply/#{@client_id}/id/#{request_id}"
|
74
|
-
puts " [x]
|
75
|
-
response_topic, response = sub_read_data(topic: response_topic)
|
75
|
+
puts " [x] Starting thread to wait response on topic #{response_topic} ..." if options[:debug]
|
76
|
+
thr_response = Thread.new { response_topic, response = sub_read_data(topic: response_topic) }
|
77
|
+
#sleep 0.1
|
78
|
+
end
|
79
|
+
|
80
|
+
response = @client.publish(publish_url, h_request.to_json, false)
|
81
|
+
|
82
|
+
if options[:wait_response]
|
83
|
+
# Waiting for the response
|
84
|
+
thr_response.join
|
76
85
|
puts " [x] Topic response: #{response}" if options[:debug]
|
86
|
+
else
|
87
|
+
puts " [x] Publish response: #{response}" if options[:debug]
|
77
88
|
end
|
78
89
|
response
|
79
90
|
end
|
data/lib/version.rb
CHANGED