ble 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7cc1b7511a25f6f47653f9b5430a1a15c4361574
4
- data.tar.gz: 776bcbf870dd96a1fb0575a8f9aefe7bcdb1199e
2
+ SHA256:
3
+ metadata.gz: 17aaccf4610ffbc88f45cea4e7551b54bf44618c725dac2d00d6bafe64510fda
4
+ data.tar.gz: fca52cb329e71cf3a3c275748fa2efdb6ec9884382f518a203a3bb7d299b720d
5
5
  SHA512:
6
- metadata.gz: 35ef023571bfd637245b82c814eaed2d08f265a14d207f29b17ad3633a9e62e30b072f4041e9b1ef4a3b6025e5607a0ed958c9cc187c98ab73eecc7534ae6cef
7
- data.tar.gz: 118372609995212452776777eb03682579e5d87d57b19758cfa3e476415a10dccc2921d53e0f3ee64463876ed56edf3823f6304bece3da712f6e36d0d883afb3
6
+ metadata.gz: f50cfc18e960210812508fc2db9520c091509a1cb9cc6c83e39de9e9978ba05a7fa788ac8e9cffebf988df40f6a96361568013d472fe1c8fbe8fae308a3338a0
7
+ data.tar.gz: 9bc27795aa5926ca1693a8c50d8dcc5a5e166680fccb975e65530ed4b21df0acd29c9bacad06f41ce447e578fb622dc3dc95f045bce5b758527faa595e4fe751
@@ -7,19 +7,18 @@ Gem::Specification.new do |s|
7
7
  s.version = BLE::VERSION
8
8
  s.authors = [ "Stephane D'Alu" ]
9
9
  s.email = [ "stephane.dalu@gmail.com" ]
10
- s.homepage = "http://github.com/sdalu/ruby-ble"
10
+ s.homepage = "http://gitlab.com/sdalu/ruby-ble"
11
11
  s.summary = "Bluetooth Low Energy (BLE) API"
12
12
  s.description = "Allow access to Bluetooth Low Energy device from ruby"
13
13
 
14
14
  s.add_dependency "ruby-dbus"
15
+ s.add_dependency "concurrent-ruby"
15
16
 
16
17
  s.add_development_dependency "yard"
17
18
  s.add_development_dependency "rake"
18
19
  s.add_development_dependency "redcarpet"
19
20
  s.add_development_dependency "github-markup"
20
21
 
21
- s.has_rdoc = 'yard'
22
-
23
22
  s.license = 'MIT'
24
23
 
25
24
 
data/lib/ble.rb CHANGED
@@ -108,5 +108,6 @@ require_relative 'ble/db_sig_service'
108
108
  require_relative 'ble/db_sig_characteristic'
109
109
  require_relative 'ble/db_eddystone'
110
110
  require_relative 'ble/db_nordic'
111
+ require_relative 'ble/db_ollie'
111
112
 
112
113
 
@@ -1,4 +1,5 @@
1
1
  require 'forwardable'
2
+ require 'concurrent'
2
3
  module BLE
3
4
  # Build information about {https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicsHome.aspx Bluetooth Characteristics}
4
5
  #
@@ -39,7 +40,16 @@ module BLE
39
40
 
40
41
  def write(val, raw: false)
41
42
  val= _serialize_value(val, raw: raw)
42
- @dbus_obj[I_GATT_CHARACTERISTIC].WriteValue(val)
43
+ @dbus_obj[I_GATT_CHARACTERISTIC].WriteValue(val, [])
44
+ end
45
+
46
+ def async_write(val, raw: false)
47
+ val= _serialize_value(val, raw: raw)
48
+ Concurrent::Promise.execute do
49
+ @dbus_obj[I_GATT_CHARACTERISTIC].WriteValue(val, []) do |result|
50
+ result
51
+ end
52
+ end
43
53
  end
44
54
 
45
55
  def read(raw: false)
@@ -47,6 +57,15 @@ module BLE
47
57
  val= _deserialize_value(val, raw: raw)
48
58
  end
49
59
 
60
+ def async_read(raw: false)
61
+ return Concurrent::Promise.execute do
62
+ @dbus_obj[I_GATT_CHARACTERISTIC].ReadValue() do |result|
63
+ val= result.first
64
+ val= _deserialize_value(val, raw: raw)
65
+ end
66
+ end
67
+ end
68
+
50
69
  # Register to this characteristic for notifications when
51
70
  # its value changes.
52
71
  def notify!
@@ -0,0 +1,31 @@
1
+ module BLE
2
+ module Service
3
+ add '22bb746f-2bb0-7554-2d6f-726568705327',
4
+ name: 'Sphero Ollie (BB-8) BLE Service',
5
+ nick: :ollie_ble_service
6
+ add '22bb746f-2ba0-7554-2d6f-726568705327',
7
+ name: 'Sphero Ollie (BB-8) Robot Control Service',
8
+ nick: :ollie_robot_control_service
9
+ end
10
+ class Characteristic
11
+ add '22bb746f-2bbf-7554-2d6f-726568705327',
12
+ name: 'Ollie Wake',
13
+ nick: :ollie_wake
14
+
15
+ add '22bb746f-2bb2-7554-2d6f-726568705327',
16
+ name: 'Ollie TX Power',
17
+ nick: :ollie_tx_power
18
+
19
+ add '22bb746f-2bbd-7554-2d6f-726568705327',
20
+ name: 'Ollie AntiDOS',
21
+ nick: :ollie_antidos
22
+
23
+ add '22bb746f-2ba1-7554-2d6f-726568705327',
24
+ name: 'Ollie Commands',
25
+ nick: :ollie_commands
26
+
27
+ add '22bb746f-2ba6-7554-2d6f-726568705327',
28
+ name: 'Ollie Response',
29
+ nick: :ollie_response
30
+ end
31
+ end
@@ -12,6 +12,8 @@ module BLE
12
12
  # Notify that you need to have the device in a connected state
13
13
  class NotConnected < Error ; end
14
14
 
15
+ attr_accessor :requires_connection
16
+
15
17
  # @param adapter [String] adapter unix device name
16
18
  # @param dev [String] device MAC address
17
19
  # @param auto_refresh [Boolean] gather information about device
@@ -49,7 +51,8 @@ module BLE
49
51
  # It will remove also the pairing information.
50
52
  # @return [Boolean]
51
53
  def remove
52
- @o_adapter[I_ADAPTER].RemoveDevice(@p_dev)
54
+ block_given? ? @o_adapter[I_ADAPTER].RemoveDevice(@p_dev, &Proc.new) :
55
+ @o_adapter[I_ADAPTER].RemoveDevice(@p_dev)
53
56
  true
54
57
  rescue DBus::Error => e
55
58
  case e.name
@@ -75,18 +78,19 @@ module BLE
75
78
  #
76
79
  # @return [Boolean]
77
80
  def pair
78
- @o_dev[I_DEVICE].Pair
81
+ block_given? ? @o_dev[I_DEVICE].Pair(&Proc.new) :
82
+ @o_dev[I_DEVICE].Pair()
79
83
  true
80
84
  rescue DBus::Error => e
81
85
  case e.name
82
86
  when E_INVALID_ARGUMENTS then false
83
87
  when E_FAILED then false
84
88
  when E_ALREADY_EXISTS then true
85
- when E_AUTH_CANCELED then raise NotAutorized
86
- when E_AUTH_FAILED then raise NotAutorized
87
- when E_AUTH_REJECTED then raise NotAutorized
88
- when E_AUTH_TIMEOUT then raise NotAutorized
89
- when E_AUTH_ATTEMPT_FAILED then raise NotAutorized
89
+ when E_AUTH_CANCELED then raise NotAuthorized
90
+ when E_AUTH_FAILED then raise NotAuthorized
91
+ when E_AUTH_REJECTED then raise NotAuthorized
92
+ when E_AUTH_TIMEOUT then raise NotAuthorized
93
+ when E_AUTH_ATTEMPT_FAILED then raise NotAuthorized
90
94
  else raise ScriptError
91
95
  end
92
96
  end
@@ -95,7 +99,8 @@ module BLE
95
99
  # operation initiated by the Pair method.
96
100
  # @return [Boolean]
97
101
  def cancel_pairing
98
- @o_dev[I_DEVICE].CancelPairing
102
+ block_given? ? @o_dev[I_DEVICE].CancelPairing(&Proc.new) :
103
+ @o_dev[I_DEVICE].CancelPairing()
99
104
  true
100
105
  rescue DBus::Error => e
101
106
  case e.name
@@ -116,9 +121,11 @@ module BLE
116
121
  def connect(profile=:all)
117
122
  case profile
118
123
  when UUID::REGEX
119
- @o_dev[I_DEVICE].ConnectProfile(profile)
124
+ block_given? ? @o_dev[I_DEVICE].ConnectProfile(profile, &Proc.new) :
125
+ @o_dev[I_DEVICE].ConnectProfile(profile)
120
126
  when :all
121
- @o_dev[I_DEVICE].Connect()
127
+ block_given? ? @o_dev[I_DEVICE].Connect(&Proc.new) :
128
+ @o_dev[I_DEVICE].Connect()
122
129
  else raise ArgumentError, "profile uuid or :all expected"
123
130
  end
124
131
  true
@@ -149,9 +156,11 @@ module BLE
149
156
  def disconnect(profile=:all)
150
157
  case profile
151
158
  when UUID::REGEX
152
- @o_dev[I_DEVICE].DisconnectProfile(profile)
159
+ block_given? ? @o_dev[I_DEVICE].DisconnectProfile(profile, &Proc.new) :
160
+ @o_dev[I_DEVICE].DisconnectProfile(profile)
153
161
  when :all
154
- @o_dev[I_DEVICE].Disconnect()
162
+ block_given? ? @o_dev[I_DEVICE].Disconnect(&Proc.new) :
163
+ @o_dev[I_DEVICE].Disconnect()
155
164
  else raise ArgumentError, "profile uuid or :all expected"
156
165
  end
157
166
  true
@@ -185,7 +194,7 @@ module BLE
185
194
 
186
195
  # Indicates if the remote device is currently connected.
187
196
  def is_connected?
188
- @o_dev[I_DEVICE]['Connected']
197
+ !@requires_connection || @o_dev[I_DEVICE]['Connected']
189
198
  rescue DBus::Error => e
190
199
  case e.name
191
200
  when E_UNKNOWN_OBJECT
@@ -343,12 +352,14 @@ module BLE
343
352
  # @return [self]
344
353
  def refresh!
345
354
  _require_connection!
346
- max_wait ||= 1.5 # Use ||= due to the retry
347
- @services = Hash[@o_dev[I_DEVICE]['GattServices'].map {|p_srv|
355
+ max_wait ||= 1.5 # Use ||= due to the retry
356
+ @services = Hash[@o_dev.subnodes.map {|p_srv|
357
+ p_srv = [@o_dev.path, p_srv].join '/'
348
358
  o_srv = BLUEZ.object(p_srv)
349
359
  o_srv.introspect
350
- srv = o_srv[I_PROPERTIES].GetAll(I_GATT_SERVICE).first
351
- char = Hash[srv['Characteristics'].map {|p_char|
360
+ srv = o_srv.GetAll(I_GATT_SERVICE).first
361
+ char = Hash[o_srv.subnodes.map {|char|
362
+ p_char = [o_srv.path, char].join '/'
352
363
  o_char = BLUEZ.object(p_char)
353
364
  o_char.introspect
354
365
  uuid = o_char[I_GATT_CHARACTERISTIC]['UUID' ].downcase
@@ -387,7 +398,7 @@ module BLE
387
398
  # @raise [Service::NotFound, Characteristic::NotFound] if service/characteristic doesn't exist on this device
388
399
  # @raise [AccessUnavailable] if not available for reading
389
400
  # @return [Object]
390
- def [](service, characteristic, raw: false)
401
+ def [](service, characteristic, raw: false, async: false)
391
402
  _require_connection!
392
403
  uuid = _uuid_characteristic(characteristic)
393
404
  chars = _characteristics(service)
@@ -396,7 +407,7 @@ module BLE
396
407
  raise Characteristic::NotFound, characteristic if char.nil?
397
408
 
398
409
  if char.flag?('read')
399
- char.read(raw: raw)
410
+ async ? char.async_read(raw: raw) : char.read(raw: raw)
400
411
  elsif char.flag?('encrypt-read') ||
401
412
  char.flag?('encrypt-authenticated-read')
402
413
  raise NotYetImplemented
@@ -404,6 +415,10 @@ module BLE
404
415
  raise AccessUnavailable
405
416
  end
406
417
  end
418
+ alias read []
419
+ def async_read service, characteristic, raw: false
420
+ read service, characteristic, raw: raw, async: true
421
+ end
407
422
 
408
423
  # Set value for a service/characteristic
409
424
  #
@@ -416,24 +431,43 @@ module BLE
416
431
  # @raise [Service::NotFound, Characteristic::NotFound] if service/characteristic doesn't exist on this device
417
432
  # @raise [AccessUnavailable] if not available for writing
418
433
  # @return [void]
419
- def []=(service, characteristic, val, raw: false)
434
+ def []=(service, characteristic, val, raw: false, async: false)
420
435
  _require_connection!
421
436
  uuid = _uuid_characteristic(characteristic)
422
437
  chars = _characteristics(service)
423
- raise ServiceNotFound, service if chars.nil?
438
+ raise Service::NotFound, service if chars.nil?
424
439
  char = chars[uuid]
425
- raise CharacteristicNotFound, characteristic if char.nil?
440
+ raise Characteristic::NotFound, characteristic if char.nil?
426
441
 
427
442
  if char.flag?('write') ||
428
- char.flag?('write-without-response')
429
- char.write(val, raw: raw)
443
+ char.flag?('write-without-response')
444
+ async ? char.async_write(val, raw: raw) : char.write(val, raw: raw)
430
445
  elsif char.flag?('encrypt-write') ||
431
446
  char.flag?('encrypt-authenticated-write')
432
447
  raise NotYetImplemented
433
448
  else
434
449
  raise AccessUnavailable
435
450
  end
436
- nil
451
+ end
452
+ alias write []=
453
+ def async_write(service, characteristic, val, raw: false)
454
+ write service, characteristic, val, raw: raw, async: true
455
+ end
456
+
457
+ def subscribe(service, characteristic, raw: false, &block)
458
+ _require_connection!
459
+ uuid = _uuid_characteristic(characteristic)
460
+ chars = _characteristics(service)
461
+ raise Service::NotFound, service if chars.nil?
462
+ char = chars[uuid]
463
+ raise Characteristic::NotFound, characteristic if char.nil?
464
+
465
+ if char.flag? 'notify'
466
+ char.notify!
467
+ char.on_change(raw: raw, &block)
468
+ else
469
+ raise OperationNotSupportedError.new("No notifications available for characteristic #{characteristic}")
470
+ end
437
471
  end
438
472
 
439
473
  #---------------------------------
@@ -480,7 +514,7 @@ module BLE
480
514
  characteristic.downcase
481
515
  else
482
516
  if char = Characteristic[characteristic]
483
- char.uuid
517
+ char[:uuid]
484
518
  end
485
519
  end
486
520
  if uuid.nil?
@@ -4,6 +4,9 @@ module BLE
4
4
  # Anything may change at any time.
5
5
  # The public API should not be considered stable.
6
6
 
7
+ # 1.0.0 MAJOR
8
+ # - [FEATURE] Support BLUEZ 5.36 (breaking change in DBus API)
9
+
7
10
  # 0.1.0 MINOR
8
11
  # - [FEATURE] BLE notifications functionality.
9
12
  # - [REFACTOR] Breaks Characteristic API
@@ -11,5 +14,5 @@ module BLE
11
14
  # 0.0.3 PATCH
12
15
  # - [FIX] NotSupported exeption was not declared.
13
16
  #
14
- VERSION = '0.1.0'
17
+ VERSION = '1.0.0'
15
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ble
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephane D'Alu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-17 00:00:00.000000000 Z
11
+ date: 2018-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-dbus
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: concurrent-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: yard
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -98,6 +112,7 @@ files:
98
112
  - lib/ble/characteristic.rb
99
113
  - lib/ble/db_eddystone.rb
100
114
  - lib/ble/db_nordic.rb
115
+ - lib/ble/db_ollie.rb
101
116
  - lib/ble/db_sig_characteristic.rb
102
117
  - lib/ble/db_sig_service.rb
103
118
  - lib/ble/device.rb
@@ -105,7 +120,7 @@ files:
105
120
  - lib/ble/service.rb
106
121
  - lib/ble/uuid.rb
107
122
  - lib/ble/version.rb
108
- homepage: http://github.com/sdalu/ruby-ble
123
+ homepage: http://gitlab.com/sdalu/ruby-ble
109
124
  licenses:
110
125
  - MIT
111
126
  metadata: {}
@@ -125,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
140
  version: '0'
126
141
  requirements: []
127
142
  rubyforge_project:
128
- rubygems_version: 2.2.2
143
+ rubygems_version: 2.7.7
129
144
  signing_key:
130
145
  specification_version: 4
131
146
  summary: Bluetooth Low Energy (BLE) API