lora-rb 0.8.0 → 0.9.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 +8 -0
- data/README.md +94 -4
- data/lib/config/config.rb +10 -3
- data/lib/config/private.yml +13 -5
- data/lib/config/private_EXAMPLE.yml +2 -0
- data/lib/core/base.rb +0 -2
- data/lib/core/configuration.rb +4 -1
- data/lib/core/protocol.rb +1 -1
- data/lib/generators/install_generator.rb +1 -1
- data/lib/lora-rb/base.rb +12 -6
- data/lib/lora-rb/http/call.rb +1 -0
- data/lib/lora-rb/mqtt/call.rb +91 -22
- data/lib/lora-rb/rabbitmq/call.rb +57 -0
- data/lib/lora-rb/utility.rb +18 -0
- data/lib/version.rb +1 -1
- metadata +4 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 213844df0c3f518068ec280585bcd4c3a8d6b5df
|
4
|
+
data.tar.gz: 6ab538fa6d2dfdccc730908be73c580793900894
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f726dc55bed3ee0c18a15e62132216161aa55506a2eddaec0a0025c15c899016724d1fc8d000573f1090ac8f91ff5b28700f32f04d796287a0e3f561b104280c
|
7
|
+
data.tar.gz: b87fca2f73d4e4d5a5092bf197f4fcbaa83c2ee8f12c65537a9d472a97cb3ff8c91de8b8e000d270e840929ffa7373efde4290bec4718f1a44904b6f8bab6dad
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
v0.9.0 [☰](https://bitbucket.org/fractalgarden/loriot-rb/branches/compare/v0.8.0..v0.9.0) August 7th, 2017
|
2
|
+
------------------------------
|
3
|
+
* Mqtt protocol renamed to Rabbitmq and new generic mqtt protocol added
|
4
|
+
* Mqtt protocol now support tls
|
5
|
+
* Now support the italian lora network A2a Smart City
|
6
|
+
* Configuration params updated to meet the mqtt requirements
|
7
|
+
* Updated readme
|
8
|
+
|
1
9
|
v0.8.0 [☰](https://bitbucket.org/fractalgarden/loriot-rb/branches/compare/v0.7.0..v0.8.0) July 11th, 2017
|
2
10
|
------------------------------
|
3
11
|
* Send_cmd now accept param confirmed true/false
|
data/README.md
CHANGED
@@ -23,7 +23,94 @@ To use it in a bundle, add to gem file `gem 'lora-rb'` and run `bundle install`
|
|
23
23
|
|
24
24
|
Establish a secure connection to your `Lora Application` on the cloud.
|
25
25
|
|
26
|
-
This version
|
26
|
+
This version supports:
|
27
|
+
1. TLS protocol with [Loriot](http://loriot.io)
|
28
|
+
1. Http push with [Resiot](http://resiot.io)
|
29
|
+
1. MQTT with [A2aSmartCity](http://www.a2asmartcity.io/)
|
30
|
+
|
31
|
+
## Configuration
|
32
|
+
|
33
|
+
Insert private information in the yaml:
|
34
|
+
|
35
|
+
lib/config/private.yml
|
36
|
+
|
37
|
+
and the configuration's parameter in the config file.
|
38
|
+
|
39
|
+
lib/config/config.rb
|
40
|
+
|
41
|
+
If you are using rails you can use the generator:
|
42
|
+
|
43
|
+
bundle exec rails generate lora_rb:install
|
44
|
+
|
45
|
+
Every provider assign you a token and an appkey or an appid. Insert your secret data in the yaml:
|
46
|
+
|
47
|
+
```yaml
|
48
|
+
defaults:
|
49
|
+
appid:
|
50
|
+
token:
|
51
|
+
# Some provider may use it
|
52
|
+
username:
|
53
|
+
password:
|
54
|
+
connector_id:
|
55
|
+
```
|
56
|
+
|
57
|
+
If you are using Rails 5.1 you can do something like this:
|
58
|
+
|
59
|
+
```yaml
|
60
|
+
defaults: &defaults
|
61
|
+
appid: <%= Rails.application.secrets.lora_appid %>
|
62
|
+
token: <%= Rails.application.secrets.lora_token %>
|
63
|
+
# etc ...
|
64
|
+
```
|
65
|
+
|
66
|
+
### TLS (with Loriot)
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
LoraRb.configure do |config|
|
70
|
+
# These informations are shared for all environments
|
71
|
+
config.protocol = :tls
|
72
|
+
config.host = 'eu1.loriot.io'
|
73
|
+
config.port = 737
|
74
|
+
end
|
75
|
+
```
|
76
|
+
|
77
|
+
### HTTP (with Resiot)
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
LoraRb.configure do |config|
|
81
|
+
# These informations are shared for all environments
|
82
|
+
config.protocol = :http
|
83
|
+
config.host = 'eu72.resiot.io'
|
84
|
+
config.port = 80
|
85
|
+
end
|
86
|
+
```
|
87
|
+
|
88
|
+
### RABBITMQ
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
LoraRb.configure do |config|
|
92
|
+
# These informations are shared for all environments
|
93
|
+
config.protocol = :rabbitmq
|
94
|
+
config.host = 'localhost'
|
95
|
+
end
|
96
|
+
```
|
97
|
+
|
98
|
+
### MQTT (with A2a)
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
LoraRb.configure do |config|
|
102
|
+
# These informations are shared for all environments
|
103
|
+
config.protocol = :mqtt
|
104
|
+
config.host = 'ptnetsuite.a2asmartcity.io'
|
105
|
+
config.port = 8883
|
106
|
+
config.uplink_url = '/sub/v1/users/{username}/apps/{appid}/devices/+/uplink/+'
|
107
|
+
config.downlink_url = '/api/v1/users/{username}/apps/{appid}/devices/{deveui}/downlink/post/reply/{clientid}/id/{requestid}'
|
108
|
+
config.ssl = true
|
109
|
+
config.ssl_file = 'ssl_certificates/mqtt_ca.crt'
|
110
|
+
end
|
111
|
+
```
|
112
|
+
|
113
|
+
## Usage
|
27
114
|
|
28
115
|
From irb require the library:
|
29
116
|
|
@@ -37,10 +124,10 @@ then create an instance
|
|
37
124
|
lora = LoraClient.new
|
38
125
|
```
|
39
126
|
|
40
|
-
|
127
|
+
you should receive the instance with variables depending on protocol:
|
41
128
|
|
42
|
-
```
|
43
|
-
|
129
|
+
```
|
130
|
+
#<LoraClient:0x0056318ad8e048 ...
|
44
131
|
```
|
45
132
|
|
46
133
|
### Send data to a device
|
@@ -102,6 +189,9 @@ To use it in a bundle, add to gem file `gem 'lora-rb'` and run `bundle install`
|
|
102
189
|
- [x] Organization in modules to support new protocols `v0.2.0`
|
103
190
|
- [x] Add a configuration `v0.3.0`
|
104
191
|
- [x] Add a rails generator `v0.3.0`
|
192
|
+
- [x] Add http push support `v0.5.0`
|
193
|
+
- [x] Add RabbitMq support `v0.6.0`
|
194
|
+
- [x] Add Mqtt support `v0.9.0`
|
105
195
|
- [ ] Test with many devices
|
106
196
|
|
107
197
|
## Contributing
|
data/lib/config/config.rb
CHANGED
@@ -3,8 +3,15 @@ LoraRb.configure do |config|
|
|
3
3
|
# config.protocol = :tls
|
4
4
|
# config.host = 'eu1.loriot.io'
|
5
5
|
# config.port = 737
|
6
|
-
# config.protocol = :
|
6
|
+
# config.protocol = :rabbitmq
|
7
7
|
# config.host = 'localhost'
|
8
|
-
config.protocol = :http
|
9
|
-
config.host = 'eu72.resiot.io'
|
8
|
+
# config.protocol = :http
|
9
|
+
# config.host = 'eu72.resiot.io'
|
10
|
+
config.protocol = :mqtt
|
11
|
+
config.host = 'ptnetsuite.a2asmartcity.io'
|
12
|
+
config.port = 8883
|
13
|
+
config.uplink_url = '/sub/v1/users/{username}/apps/{appid}/devices/+/uplink/+'
|
14
|
+
config.downlink_url = '/api/v1/users/{username}/apps/{appid}/devices/{deveui}/downlink/post/reply/{clientid}/id/{requestid}'
|
15
|
+
config.ssl = true
|
16
|
+
config.ssl_file = 'ssl_certificates/mqtt_ca.crt'
|
10
17
|
end
|
data/lib/config/private.yml
CHANGED
@@ -1,11 +1,19 @@
|
|
1
1
|
defaults: &defaults
|
2
|
+
# Loriot
|
2
3
|
#appid: "BE7A02C1"
|
3
|
-
appid: "a1b2c3d4e5f60001"
|
4
4
|
#token: "zHcD-1ouz3ytyOLE6SMhwA"
|
5
|
-
|
6
|
-
#
|
7
|
-
|
8
|
-
|
5
|
+
# Resiot
|
6
|
+
#appid: "a1b2c3d4e5f60001"
|
7
|
+
#token: "17e3ce759c444b3977f4adbf9dd0e010"
|
8
|
+
#connector_id: "69643d32"
|
9
|
+
# A2a
|
10
|
+
#appid: "a1b2c3d4e5f60001"
|
11
|
+
appid: "9955"
|
12
|
+
token: "2B7E151628AED2A6ABF7158809CF4F3C"
|
13
|
+
username: "fractalgarden"
|
14
|
+
password: "fr4ctalg4rden"
|
15
|
+
|
16
|
+
test_eui: "be7a00000000123c"
|
9
17
|
#foo: add every variable you need and use it with => LoraRb::Settings.foo
|
10
18
|
# bar: sub variable are accessible with hash => LoraRb::Settings.foo[:bar]
|
11
19
|
|
data/lib/core/base.rb
CHANGED
data/lib/core/configuration.rb
CHANGED
@@ -2,12 +2,15 @@ module LoraRb
|
|
2
2
|
class Configuration
|
3
3
|
# attr_writer :allow_sign_up
|
4
4
|
|
5
|
-
attr_accessor :protocol, :host, :port, :env
|
5
|
+
attr_accessor :protocol, :host, :port, :uplink_url, :downlink_url, :ssl, :ssl_file, :env
|
6
6
|
|
7
7
|
def initialize
|
8
8
|
@protocol = nil
|
9
9
|
@host = nil
|
10
10
|
@port = nil
|
11
|
+
@url = nil
|
12
|
+
@ssl = nil # True if uses tls
|
13
|
+
@ssl_file = nil # The certificate's path
|
11
14
|
@env = 'development'
|
12
15
|
end
|
13
16
|
|
data/lib/core/protocol.rb
CHANGED
@@ -16,7 +16,7 @@ module LoraRb
|
|
16
16
|
<<-FILE.gsub(/^ /, '')
|
17
17
|
connection_protocol = LoraRb.configuration.protocol
|
18
18
|
raise 'Define your protocol in the configuration file!' unless connection_protocol
|
19
|
-
raise "Connection protocol #{connection_protocol} not recognized!" unless
|
19
|
+
raise "Connection protocol #{connection_protocol} not recognized!" unless LoraRb::Protocol.supported_protocols.include?(connection_protocol.to_s)
|
20
20
|
require "lora-rb/#{connection_protocol}/call"
|
21
21
|
LoraClient.include LoraRb::Call
|
22
22
|
|
data/lib/lora-rb/base.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'help'
|
2
|
+
require_relative 'utility'
|
2
3
|
|
3
4
|
###################################
|
4
5
|
# An interface to Lora Service from Ruby
|
@@ -8,11 +9,16 @@ class LoraClient
|
|
8
9
|
|
9
10
|
# Establish a secure connection to your account on the cloud
|
10
11
|
def initialize(options = {})
|
11
|
-
options = {
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
options = {debug: false,
|
13
|
+
token: LoraRb::Settings.token,
|
14
|
+
appid: LoraRb::Settings.appid,
|
15
|
+
host: LoraRb.configuration.host,
|
16
|
+
port: LoraRb.configuration.port,
|
17
|
+
uplink_url: LoraRb.configuration.uplink_url,
|
18
|
+
downlink_url: LoraRb.configuration.downlink_url,
|
19
|
+
ssl: LoraRb.configuration.ssl,
|
20
|
+
ssl_file: LoraRb.configuration.ssl_file
|
21
|
+
}.merge(options)
|
16
22
|
@debug = options[:debug]
|
17
23
|
@token = options[:token]
|
18
24
|
@appid = options[:appid]
|
@@ -54,7 +60,7 @@ class LoraClient
|
|
54
60
|
def listen(options = {}, &block)
|
55
61
|
options = { debug: @debug }.merge(options)
|
56
62
|
|
57
|
-
puts "#{Time.now} Starting Listen #{@appid}. To exit press CTRL+C" if options[:debug]
|
63
|
+
puts "#{Time.now} Starting Listen app #{@appid}. To exit press CTRL+C" if options[:debug]
|
58
64
|
sub_listen(options)
|
59
65
|
end
|
60
66
|
|
data/lib/lora-rb/http/call.rb
CHANGED
data/lib/lora-rb/mqtt/call.rb
CHANGED
@@ -8,48 +8,117 @@ module LoraRb
|
|
8
8
|
private
|
9
9
|
|
10
10
|
def sub_initialize(options={})
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
require 'mqtt'
|
12
|
+
|
13
|
+
raise 'Specify aaa to continue!' unless options[:uplink_url]
|
14
|
+
raise 'Specify aaa to continue!' unless options[:downlink_url]
|
15
|
+
raise 'Specify aaa to continue!' unless options[:host]
|
16
|
+
raise 'Specify aaa to continue!' unless options[:port]
|
17
|
+
raise 'Specify ssl_file to continue!' if options[:ssl] && !options[:ssl_file]
|
18
|
+
|
19
|
+
@username = LoraRb::Settings.username
|
20
|
+
password = LoraRb::Settings.password
|
21
|
+
@client_id = "#{@username}::ssg#{generate_request_id}"
|
22
|
+
|
23
|
+
@client = MQTT::Client.connect(
|
24
|
+
host: options[:host],
|
25
|
+
port: options[:port],
|
26
|
+
ssl: options[:ssl],
|
27
|
+
cert_file: options[:ssl_file],
|
28
|
+
username: @username,
|
29
|
+
password: password,
|
30
|
+
client_id: @client_id
|
31
|
+
)
|
32
|
+
|
33
|
+
@topic = merge_tags_to_url(options[:uplink_url],
|
34
|
+
{ username: @username,
|
35
|
+
appid: @appid },
|
36
|
+
{ debug: options[:debug] })
|
37
|
+
|
38
|
+
@downlink_url = merge_tags_to_url(options[:downlink_url])
|
15
39
|
{'hello' => 'Lora-Rb: Ready to start!'}
|
16
40
|
end
|
17
41
|
|
18
42
|
# Send the request to device
|
19
43
|
def sub_send_cmd(options={})
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
44
|
+
h_request = {
|
45
|
+
"port": options[:port], # Port where the message should be sent
|
46
|
+
"payload": options[:data], # Message payload
|
47
|
+
"confirmed": options[:confirmed], # (Optional) Tells whether a confirmed downlink is requested. Default: false
|
48
|
+
"window": options[:window] || "BOTH", # (Optional) Specifies which rx window should be used: RX1, RX2 or any(BOTH). Default: BOTH
|
49
|
+
"priority": options[:priority] || 0, # (Optional) Message priority, used to sort messages in the queue. Default: 0
|
50
|
+
"qos": options[:qos] || 1 # (Optional) Quality Of Service:
|
51
|
+
# 0 - Best effort. The message will be transmitted to the devices
|
52
|
+
# of the group that satisfy the multicast profile requirements
|
53
|
+
# (they should have been activated and have sent at least one
|
54
|
+
# uplink, they should be class C devices, etc..).
|
55
|
+
# 1 - Transmission guaranteed. No message will be transmitted if
|
56
|
+
# some devices do not satisfy the multicast profile requirements.
|
57
|
+
# Default: 1 */
|
58
|
+
}
|
59
|
+
request_id = generate_request_id
|
60
|
+
publish_url = merge_tags_to_url(@downlink_url,
|
61
|
+
username: @username,
|
62
|
+
appid: @appid,
|
63
|
+
deveui: options[:eui],
|
64
|
+
clientid: @client_id,
|
65
|
+
requestid: request_id)
|
66
|
+
|
67
|
+
puts "#{Time.now} publish #{h_request.to_json} to #{publish_url}" if options[:debug]
|
68
|
+
|
69
|
+
response = @client.publish(publish_url, h_request.to_json, false)
|
70
|
+
puts " [x] publish response: #{response}" if options[:debug]
|
71
|
+
|
72
|
+
if options[:confirmed]
|
73
|
+
response_topic = "reply/#{@client_id}/id/#{request_id}"
|
74
|
+
puts " [x] Waiting response on #{response_topic} ..." if options[:debug]
|
75
|
+
response_topic, response = sub_read_data(topic: response_topic)
|
76
|
+
puts " [x] Topic response: #{response}" if options[:debug]
|
77
|
+
end
|
24
78
|
response
|
25
79
|
end
|
26
80
|
|
27
81
|
# Receive the payload from the network
|
28
82
|
def sub_read_data(options={})
|
29
|
-
|
30
|
-
puts " [x]
|
83
|
+
topic = options[:topic] || @topic
|
84
|
+
puts " [x] Reading topic #{topic}..." if options[:debug]
|
85
|
+
topic, message = @client.get(topic)
|
86
|
+
message = JSON.parse(message)
|
87
|
+
message['EUI'] ||= get_eui_from_topic(topic) if message.respond_to? '[]'
|
88
|
+
puts " [x] #{topic}: #{message}" if options[:debug]
|
89
|
+
return topic, message
|
31
90
|
end
|
32
91
|
|
33
92
|
# Waiting for message in the queue
|
34
93
|
def sub_listen(options={}, &block)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
#
|
40
|
-
|
94
|
+
topic = options[:topic] || @topic
|
95
|
+
puts " [*] Waiting for messages in #{topic}. To exit press CTRL+C" if options[:debug]
|
96
|
+
|
97
|
+
@client.get(topic) do |topic, message|
|
98
|
+
# Block is executed for every message received
|
99
|
+
puts " [x] #{topic}: #{message}" if options[:debug]
|
100
|
+
message = JSON.parse(message)
|
101
|
+
message['EUI'] ||= get_eui_from_topic(topic) if message.respond_to? '[]'
|
102
|
+
puts " [x] after rework: #{message}" if options[:debug]
|
103
|
+
block.call(topic, message) if block
|
104
|
+
break if options[:test]
|
41
105
|
end
|
42
106
|
end
|
43
107
|
|
44
108
|
# Close the connection
|
45
109
|
def sub_quit
|
46
|
-
@
|
110
|
+
@client.disconnect
|
47
111
|
end
|
48
112
|
|
49
|
-
|
50
|
-
|
113
|
+
private
|
114
|
+
|
115
|
+
def get_eui_from_topic(topic)
|
116
|
+
topic&.match(/(?!devices\/)\w{16}/)&.to_s
|
117
|
+
end
|
118
|
+
|
119
|
+
def generate_request_id
|
120
|
+
Time.now.strftime('%y%m%d%H%M%S')
|
121
|
+
end
|
51
122
|
|
52
|
-
|
53
|
-
class NilClass
|
54
|
-
def empty?; true end
|
123
|
+
end
|
55
124
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# LoraRb calling methods
|
2
|
+
module LoraRb
|
3
|
+
# It contains all the methods for selecting the items
|
4
|
+
module Call
|
5
|
+
|
6
|
+
attr_reader :client
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def sub_initialize(options={})
|
11
|
+
require 'bunny'
|
12
|
+
@connection = Bunny.new(hostname: options[:host])
|
13
|
+
@connection.start
|
14
|
+
@channel = @connection.create_channel
|
15
|
+
@queue = @channel.queue(options[:queue])
|
16
|
+
{'hello' => 'Lora-Rb: Ready to start!'}
|
17
|
+
end
|
18
|
+
|
19
|
+
# Send the request to device
|
20
|
+
def sub_send_cmd(options={})
|
21
|
+
str_request = "{\"cmd\":\"#{options[:cmd]}\",\"EUI\":\"#{options[:eui]}\",\"port\":#{options[:port]},\"confirmed\":#{options[:confirmed]},\"data\":\"#{options[:data]}\"} "
|
22
|
+
puts "#{Time.now} Cmq request: #{str_request}" if options[:debug]
|
23
|
+
response = @channel.default_exchange.publish(str_request, routing_key: @queue.name)
|
24
|
+
puts " [x] Sent '#{str_request}'" if options[:debug]
|
25
|
+
response
|
26
|
+
end
|
27
|
+
|
28
|
+
# Receive the payload from the network
|
29
|
+
def sub_read_data(options={})
|
30
|
+
delivery_info, metadata, payload = @queue.pop
|
31
|
+
puts " [x] Received #{delivery_info} #{metadata} #{payload}" if options[:debug]
|
32
|
+
return delivery_info, metadata, payload
|
33
|
+
end
|
34
|
+
|
35
|
+
# Waiting for message in the queue
|
36
|
+
def sub_listen(options={}, &block)
|
37
|
+
puts " [*] Waiting for messages in #{@queue.name}. To exit press CTRL+C" if options[:debug]
|
38
|
+
@queue.subscribe(block: true) do |delivery_info, properties, body|
|
39
|
+
puts " [x] Received #{body}" if options[:debug]
|
40
|
+
block.call(delivery_info, properties, body) if block
|
41
|
+
# cancel the consumer to exit
|
42
|
+
delivery_info.consumer.cancel
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Close the connection
|
47
|
+
def sub_quit
|
48
|
+
@connection.close
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Monkey patch since Bunny use the rails method .empty?
|
55
|
+
class NilClass
|
56
|
+
def empty?; true end
|
57
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# LoraRb methods
|
2
|
+
module LoraRb
|
3
|
+
# It contains generic methods
|
4
|
+
module Base
|
5
|
+
private
|
6
|
+
|
7
|
+
# Show tips on usage
|
8
|
+
def merge_tags_to_url(url, tags={}, options={})
|
9
|
+
puts "merge_tags_to_url: #{url}" if options[:debug]
|
10
|
+
tags.each do |tag, value|
|
11
|
+
puts " replace {#{tag}} with #{value}" if options[:debug]
|
12
|
+
url.gsub!("{#{tag}}", value.to_s)
|
13
|
+
end
|
14
|
+
puts "merge_tags_to_url: completed #{url}" if options[:debug]
|
15
|
+
url
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
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.9.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-
|
13
|
+
date: 2017-08-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: json
|
@@ -26,48 +26,6 @@ dependencies:
|
|
26
26
|
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: '2.1'
|
29
|
-
- !ruby/object:Gem::Dependency
|
30
|
-
name: openssl
|
31
|
-
requirement: !ruby/object:Gem::Requirement
|
32
|
-
requirements:
|
33
|
-
- - "~>"
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version: '2.0'
|
36
|
-
type: :runtime
|
37
|
-
prerelease: false
|
38
|
-
version_requirements: !ruby/object:Gem::Requirement
|
39
|
-
requirements:
|
40
|
-
- - "~>"
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: '2.0'
|
43
|
-
- !ruby/object:Gem::Dependency
|
44
|
-
name: http
|
45
|
-
requirement: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
47
|
-
- - "~>"
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '2.2'
|
50
|
-
type: :runtime
|
51
|
-
prerelease: false
|
52
|
-
version_requirements: !ruby/object:Gem::Requirement
|
53
|
-
requirements:
|
54
|
-
- - "~>"
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: '2.2'
|
57
|
-
- !ruby/object:Gem::Dependency
|
58
|
-
name: bunny
|
59
|
-
requirement: !ruby/object:Gem::Requirement
|
60
|
-
requirements:
|
61
|
-
- - "~>"
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version: '2.7'
|
64
|
-
type: :runtime
|
65
|
-
prerelease: false
|
66
|
-
version_requirements: !ruby/object:Gem::Requirement
|
67
|
-
requirements:
|
68
|
-
- - "~>"
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version: '2.7'
|
71
29
|
- !ruby/object:Gem::Dependency
|
72
30
|
name: test-unit
|
73
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,7 +66,9 @@ files:
|
|
108
66
|
- lib/lora-rb/help.rb
|
109
67
|
- lib/lora-rb/http/call.rb
|
110
68
|
- lib/lora-rb/mqtt/call.rb
|
69
|
+
- lib/lora-rb/rabbitmq/call.rb
|
111
70
|
- lib/lora-rb/tls/call.rb
|
71
|
+
- lib/lora-rb/utility.rb
|
112
72
|
- lib/vendor/deep_symbolize.rb
|
113
73
|
- lib/version.rb
|
114
74
|
homepage: https://github.com/marcomd/lora-rb
|