sb-ble 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,44 @@
1
+ module BLE
2
+ module Notifications
3
+
4
+ # Registers current device for notifications of the given _characteristic_.
5
+ # Synonym for 'subscribe' or 'activate'.
6
+ # This step is required in order to later receive notifications.
7
+ # @param service [String, Symbol]
8
+ # @param characteristic [String, Symbol]
9
+ #
10
+ def start_notify!(service, characteristic)
11
+ char= _find_characteristic(service, characteristic)
12
+ if char.flag?('notify')
13
+ char.notify!
14
+ else
15
+ raise OperationNotSupportedError.new("No notifications available for characteristic #{characteristic}")
16
+ end
17
+ end
18
+
19
+ #
20
+ # Registers the callback to be invoked when a notification from the given _characteristic_ is received.
21
+ #
22
+ # NOTE: Requires the device to be subscribed to _characteristic_ notifications.
23
+ # @param service [String, Symbol]
24
+ # @param characteristic [String, Symbol]
25
+ # @param raw [Boolean] When raw is true the value (set/get) is a binary string, instead of an object corresponding to the decoded characteristic (float, integer, array, ...)
26
+ # @param callback [Proc] This callback will have the notified value as argument.
27
+ #
28
+ def on_notification(service, characteristic, raw: false, &callback)
29
+ _require_connection!
30
+ char= _find_characteristic(service, characteristic)
31
+ if char.flag?('notify')
32
+ char.on_change(raw: raw) { |val|
33
+ callback.call(val)
34
+ }
35
+ elsif char.flag?('encrypt-read') ||
36
+ char.flag?('encrypt-authenticated-read')
37
+ raise NotYetImplemented
38
+ else
39
+ raise AccessUnavailable
40
+ end
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,121 @@
1
+ module BLE
2
+ # Build information about {https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx Bluetooth Services}
3
+ #
4
+ # To add a new service description:
5
+ # BLE::Service.add '63a83b9c-0fa0-4d04-8ef9-23be4ed36231',
6
+ # name: 'World domination',
7
+ # type: 'net.cortex-minus.service.world_domination'
8
+ #
9
+ # Returned service description will be a hash:
10
+ # {
11
+ # name: "Bluetooth service name",
12
+ # type: "org.bluetooth.service.name",
13
+ # uuid: "128bit-uuid-string"
14
+ # }
15
+ #
16
+ module Service
17
+ # Notify of service not found
18
+ class NotFound < BLE::NotFound
19
+ end
20
+
21
+ private
22
+ DB_UUID = {}
23
+ DB_TYPE = {}
24
+ DB_NICKNAME = {}
25
+
26
+ public
27
+ # Get a service description from it's id.
28
+ # The id could be either a uuid, a type, or a nickname
29
+ #
30
+ # @param id [Symbol,String] uuid, type or nickname
31
+ # @return [Hash] service description
32
+ def self.[](id)
33
+ case id
34
+ when Symbol then DB_NICKNAME[id]
35
+ when UUID::REGEX then DB_UUID[id]
36
+ when String then DB_TYPE[id]
37
+ when Integer then DB_UUID[BLE::UUID(id)]
38
+ else raise ArgumentError, "invalid type for service id"
39
+ end
40
+ end
41
+
42
+ # Get service description from nickname.
43
+ #
44
+ # @param id [Symbol] nickname
45
+ # @return [Hash] service description
46
+ def self.by_nickname(id)
47
+ DB_NICKNAME[id]
48
+ end
49
+
50
+ # Get service description from uuid.
51
+ #
52
+ # @param id [String] uuid
53
+ # @return [Hash] service description
54
+ def self.by_uuid(id)
55
+ DB_UUID[id]
56
+ end
57
+
58
+ # Get service description from type
59
+ #
60
+ # @param id [Strig] type
61
+ # @return [Hash] service description
62
+ def self.by_type(id)
63
+ DB_TYPE[id]
64
+ end
65
+
66
+ # Add a service description.
67
+ # @example Add a service description with a 16-bit uuid
68
+ # module Service
69
+ # add 0x1800,
70
+ # name: 'Generic Access',
71
+ # type: 'org.bluetooth.service.generic_access'
72
+ # end
73
+ #
74
+ # @example Add a service description with a 128-bit uuid
75
+ # module Service
76
+ # add '63a83b9c-0fa0-4d04-8ef9-23be4ed36231',
77
+ # name: 'World domination',
78
+ # type: 'net.cortex-minus.service.world_domination'
79
+ # end
80
+ #
81
+ # @param uuid [Integer, String] 16-bit, 32-bit or 128-bit uuid
82
+ # @param name [String]
83
+ # @option opts :type [String] type
84
+ # @option opts :nick [Symbol] nickname
85
+ # @return [Hash] service description
86
+ def self.add(uuid, name:, **opts)
87
+ uuid = BLE::UUID(uuid)
88
+ type = opts.delete :type
89
+ nick = opts.delete :nick
90
+ if opts.first
91
+ raise ArgumentError, "unknown keyword: #{opts.first[0]}"
92
+ end
93
+
94
+ desc = DB_UUID[uuid] = {
95
+ uuid: uuid,
96
+ name: name,
97
+ }
98
+
99
+ # Add type if specified
100
+ if type
101
+ type = type.downcase
102
+ desc.merge!(type: type)
103
+ DB_TYPE[type] = desc
104
+ end
105
+
106
+ # Add nickname if specified or can be derived from type
107
+ if nick.nil? && type && type =~ /\.(?<key>[^.]+)$/
108
+ nick = $1.to_sym if type.start_with? 'org.bluetooth.service'
109
+ end
110
+ if nick
111
+ if DB_NICKNAME.include?(nick)
112
+ raise ArgumentError,
113
+ "nickname '#{nick}' already registered (uuid: #{uuid})"
114
+ end
115
+ DB_NICKNAME[nick] = desc
116
+ end
117
+
118
+ desc
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,25 @@
1
+ module BLE
2
+ # Cast value to a well-formatted 128bit UUID string
3
+ # @param [String, Integer] val uuid
4
+ # @return [String] well formated 128bit UUID
5
+ def self.UUID(val)
6
+ case val
7
+ when Integer
8
+ if !(0..4294967295).include?(val) # 2**32-1
9
+ raise ArgumentError, "not a 16-bit or 32-bit UUID"
10
+ end
11
+ ([val].pack("L>").unpack('H*').first + GATT_BASE_UUID[8..-1])
12
+ when String
13
+ if val !~ UUID::REGEX
14
+ raise ArgumentError, "not a 128bit uuid string"
15
+ end
16
+ val.downcase
17
+ else raise ArgumentError, "invalid uuid type"
18
+ end
19
+ end
20
+
21
+ class UUID
22
+ # Regular expression for matching UUID 128-bit string
23
+ REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ module BLE
2
+ # = Library version =
3
+ # Major version zero (0.y.z) is for initial development.
4
+ # Anything may change at any time.
5
+ # The public API should not be considered stable.
6
+
7
+ # 0.1.0 MINOR
8
+ # - [FEATURE] BLE notifications functionality.
9
+ # - [REFACTOR] Breaks Characteristic API
10
+
11
+ # 0.0.3 PATCH
12
+ # - [FIX] NotSupported exeption was not declared.
13
+ #
14
+ VERSION = '0.1.0'
15
+ end
@@ -0,0 +1,112 @@
1
+ # Generated by juwelier
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: sb-ble 0.5.0 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "sb-ble".freeze
9
+ s.version = "0.5.0"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib".freeze]
13
+ s.authors = ["Fred Mitchell & Sensorberg".freeze]
14
+ s.date = "2017-05-23"
15
+ s.description = "This supports LE Advertising".freeze
16
+ s.email = "frederick.mitchell@sensorberg.com".freeze
17
+ s.executables = ["rble".freeze]
18
+ s.extra_rdoc_files = [
19
+ "LICENSE",
20
+ "README.org"
21
+ ]
22
+ s.files = [
23
+ ".rspec",
24
+ ".semver",
25
+ "Gemfile",
26
+ "Gemfile.lock",
27
+ "LICENSE",
28
+ "README.org",
29
+ "Rakefile",
30
+ "bin/rble",
31
+ "lib/ble.rb",
32
+ "lib/ble/adapter.rb",
33
+ "lib/ble/agent.rb",
34
+ "lib/ble/char_desc.rb",
35
+ "lib/ble/char_registry.rb",
36
+ "lib/ble/characteristic.rb",
37
+ "lib/ble/db_eddystone.rb",
38
+ "lib/ble/db_nordic.rb",
39
+ "lib/ble/db_sig_characteristic.rb",
40
+ "lib/ble/db_sig_service.rb",
41
+ "lib/ble/device.rb",
42
+ "lib/ble/notifications.rb",
43
+ "lib/ble/service.rb",
44
+ "lib/ble/uuid.rb",
45
+ "lib/ble/version.rb",
46
+ "sb-ble.gemspec",
47
+ "spec/ruby-ble_spec.rb",
48
+ "spec/spec_helper.rb"
49
+ ]
50
+ s.homepage = "http://github.com/flajann2/ruby-ble".freeze
51
+ s.licenses = ["MIT".freeze]
52
+ s.rubygems_version = "2.6.11".freeze
53
+ s.summary = "Bluetooth Low Energy for Ruby -- Sensorberg Version".freeze
54
+
55
+ if s.respond_to? :specification_version then
56
+ s.specification_version = 4
57
+
58
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
59
+ s.add_runtime_dependency(%q<ruby-dbus>.freeze, ["~> 0"])
60
+ s.add_runtime_dependency(%q<semver2>.freeze, ["~> 3"])
61
+ s.add_development_dependency(%q<rspec>.freeze, ["~> 3"])
62
+ s.add_development_dependency(%q<yard>.freeze, ["~> 0"])
63
+ s.add_development_dependency(%q<rdoc>.freeze, ["~> 3"])
64
+ s.add_development_dependency(%q<bundler>.freeze, ["~> 1"])
65
+ s.add_development_dependency(%q<juwelier>.freeze, ["~> 2"])
66
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
67
+ s.add_development_dependency(%q<pry>.freeze, ["~> 0"])
68
+ s.add_development_dependency(%q<pry-byebug>.freeze, ["~> 3"])
69
+ s.add_development_dependency(%q<pry-doc>.freeze, ["~> 0"])
70
+ s.add_development_dependency(%q<pry-remote>.freeze, ["~> 0"])
71
+ s.add_development_dependency(%q<pry-rescue>.freeze, ["~> 1"])
72
+ s.add_development_dependency(%q<pry-stack_explorer>.freeze, ["~> 0"])
73
+ s.add_development_dependency(%q<redcarpet>.freeze, [">= 0"])
74
+ s.add_development_dependency(%q<github-markup>.freeze, [">= 0"])
75
+ else
76
+ s.add_dependency(%q<ruby-dbus>.freeze, ["~> 0"])
77
+ s.add_dependency(%q<semver2>.freeze, ["~> 3"])
78
+ s.add_dependency(%q<rspec>.freeze, ["~> 3"])
79
+ s.add_dependency(%q<yard>.freeze, ["~> 0"])
80
+ s.add_dependency(%q<rdoc>.freeze, ["~> 3"])
81
+ s.add_dependency(%q<bundler>.freeze, ["~> 1"])
82
+ s.add_dependency(%q<juwelier>.freeze, ["~> 2"])
83
+ s.add_dependency(%q<simplecov>.freeze, [">= 0"])
84
+ s.add_dependency(%q<pry>.freeze, ["~> 0"])
85
+ s.add_dependency(%q<pry-byebug>.freeze, ["~> 3"])
86
+ s.add_dependency(%q<pry-doc>.freeze, ["~> 0"])
87
+ s.add_dependency(%q<pry-remote>.freeze, ["~> 0"])
88
+ s.add_dependency(%q<pry-rescue>.freeze, ["~> 1"])
89
+ s.add_dependency(%q<pry-stack_explorer>.freeze, ["~> 0"])
90
+ s.add_dependency(%q<redcarpet>.freeze, [">= 0"])
91
+ s.add_dependency(%q<github-markup>.freeze, [">= 0"])
92
+ end
93
+ else
94
+ s.add_dependency(%q<ruby-dbus>.freeze, ["~> 0"])
95
+ s.add_dependency(%q<semver2>.freeze, ["~> 3"])
96
+ s.add_dependency(%q<rspec>.freeze, ["~> 3"])
97
+ s.add_dependency(%q<yard>.freeze, ["~> 0"])
98
+ s.add_dependency(%q<rdoc>.freeze, ["~> 3"])
99
+ s.add_dependency(%q<bundler>.freeze, ["~> 1"])
100
+ s.add_dependency(%q<juwelier>.freeze, ["~> 2"])
101
+ s.add_dependency(%q<simplecov>.freeze, [">= 0"])
102
+ s.add_dependency(%q<pry>.freeze, ["~> 0"])
103
+ s.add_dependency(%q<pry-byebug>.freeze, ["~> 3"])
104
+ s.add_dependency(%q<pry-doc>.freeze, ["~> 0"])
105
+ s.add_dependency(%q<pry-remote>.freeze, ["~> 0"])
106
+ s.add_dependency(%q<pry-rescue>.freeze, ["~> 1"])
107
+ s.add_dependency(%q<pry-stack_explorer>.freeze, ["~> 0"])
108
+ s.add_dependency(%q<redcarpet>.freeze, [">= 0"])
109
+ s.add_dependency(%q<github-markup>.freeze, [">= 0"])
110
+ end
111
+ end
112
+
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Ruby-ble" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
@@ -0,0 +1,29 @@
1
+ require 'simplecov'
2
+
3
+ module SimpleCov::Configuration
4
+ def clean_filters
5
+ @filters = []
6
+ end
7
+ end
8
+
9
+ SimpleCov.configure do
10
+ clean_filters
11
+ load_adapter 'test_frameworks'
12
+ end
13
+
14
+ ENV["COVERAGE"] && SimpleCov.start do
15
+ add_filter "/.rvm/"
16
+ end
17
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
18
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
19
+
20
+ require 'rspec'
21
+ require 'ruby-ble'
22
+
23
+ # Requires supporting files with custom matchers and macros, etc,
24
+ # in ./support/ and its subdirectories.
25
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
26
+
27
+ RSpec.configure do |config|
28
+
29
+ end
metadata ADDED
@@ -0,0 +1,296 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sb-ble
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Fred Mitchell & Sensorberg
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-05-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ruby-dbus
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: semver2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rdoc
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: juwelier
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: pry-byebug
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry-doc
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: pry-remote
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: pry-rescue
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '1'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '1'
195
+ - !ruby/object:Gem::Dependency
196
+ name: pry-stack_explorer
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: redcarpet
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: github-markup
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ description: This supports LE Advertising
238
+ email: frederick.mitchell@sensorberg.com
239
+ executables:
240
+ - rble
241
+ extensions: []
242
+ extra_rdoc_files:
243
+ - LICENSE
244
+ - README.org
245
+ files:
246
+ - ".rspec"
247
+ - ".semver"
248
+ - Gemfile
249
+ - Gemfile.lock
250
+ - LICENSE
251
+ - README.org
252
+ - Rakefile
253
+ - bin/rble
254
+ - lib/ble.rb
255
+ - lib/ble/adapter.rb
256
+ - lib/ble/agent.rb
257
+ - lib/ble/char_desc.rb
258
+ - lib/ble/char_registry.rb
259
+ - lib/ble/characteristic.rb
260
+ - lib/ble/db_eddystone.rb
261
+ - lib/ble/db_nordic.rb
262
+ - lib/ble/db_sig_characteristic.rb
263
+ - lib/ble/db_sig_service.rb
264
+ - lib/ble/device.rb
265
+ - lib/ble/notifications.rb
266
+ - lib/ble/service.rb
267
+ - lib/ble/uuid.rb
268
+ - lib/ble/version.rb
269
+ - sb-ble.gemspec
270
+ - spec/ruby-ble_spec.rb
271
+ - spec/spec_helper.rb
272
+ homepage: http://github.com/flajann2/ruby-ble
273
+ licenses:
274
+ - MIT
275
+ metadata: {}
276
+ post_install_message:
277
+ rdoc_options: []
278
+ require_paths:
279
+ - lib
280
+ required_ruby_version: !ruby/object:Gem::Requirement
281
+ requirements:
282
+ - - ">="
283
+ - !ruby/object:Gem::Version
284
+ version: '0'
285
+ required_rubygems_version: !ruby/object:Gem::Requirement
286
+ requirements:
287
+ - - ">="
288
+ - !ruby/object:Gem::Version
289
+ version: '0'
290
+ requirements: []
291
+ rubyforge_project:
292
+ rubygems_version: 2.6.11
293
+ signing_key:
294
+ specification_version: 4
295
+ summary: Bluetooth Low Energy for Ruby -- Sensorberg Version
296
+ test_files: []