1
+ import CoreBluetooth
2
+ import RxBluetoothKit
3
+ import RxSwift
1
4
import UIKit
2
5
3
6
class CentralViewController : UIViewController {
@@ -16,4 +19,45 @@ class CentralViewController: UIViewController {
16
19
view = centralView
17
20
}
18
21
22
+ override func viewDidLoad( ) {
23
+ super. viewDidLoad ( )
24
+
25
+ centralView. connectButton. addTarget ( self , action: #selector( handleConnectButton) , for: . touchUpInside)
26
+ }
27
+
28
+ // MARK: - Private
29
+
30
+ private let disposeBag = DisposeBag ( )
31
+ private lazy var manager = CentralManager ( )
32
+
33
+ @objc private func handleConnectButton( ) {
34
+ guard let serviceUuidString = centralView. serviceUuidTextField. text,
35
+ let characteristicUuidString = centralView. characteristicUuidTextField. text else { return }
36
+
37
+ let serviceUuid = CBUUID ( string: serviceUuidString)
38
+ let characteristicUuid = CBUUID ( string: characteristicUuidString)
39
+
40
+ scanAndConnect ( serviceUuid: serviceUuid, characteristicUuid: characteristicUuid)
41
+ }
42
+
43
+ private func scanAndConnect( serviceUuid: CBUUID , characteristicUuid: CBUUID ) {
44
+ let managerIsOn = manager. observeStateWithInitialValue ( )
45
+ . filter { $0 == . poweredOn }
46
+ . map { _ in }
47
+
48
+ Observable . combineLatest ( managerIsOn, Observable . just ( manager) ) { $1 }
49
+ . flatMap { $0. scanForPeripherals ( withServices: [ serviceUuid] ) }
50
+ . take ( 1 )
51
+ . flatMap { $0. peripheral. establishConnection ( ) }
52
+ . flatMap { $0. discoverServices ( [ serviceUuid] ) }
53
+ . take ( 1 )
54
+ . compactMap { $0. first }
55
+ . flatMap { $0. discoverCharacteristics ( [ characteristicUuid] ) }
56
+ . take ( 1 )
57
+ . compactMap { $0. first }
58
+ . flatMap { $0. readValue ( ) }
59
+ . subscribe ( onNext: { print ( $0) } )
60
+ . disposed ( by: disposeBag)
61
+ }
62
+
19
63
}
0 commit comments