sb-ble 0.5.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.
@@ -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: []