はじめに

以前から気になっていたRxを使用したBLEライブラリを試してみました。

RxBluetoothKitでreadしてみる

RxBluetoothKitを使用しました。
導入や使い方はREADMEでなんとなくわかると思います。

環境

XCode: 9.2
Swift: 4.0

Serviceの定義


enum SampleService: String, ServiceIdentifier {
    case Sensor = "SensorServiceUUIDを書く"
    case Device = "DeviceServiceUUIDを書く"
    case Battery = "BatteryServiceUUIDを書く"

    var uuid: CBUUID {
        return CBUUID(string: self.rawValue)
    }
}

Characteristicの定義


enum SampleSensorCharacteristic: String, CharacteristicIdentifier {
    case HeartRate = "HeartRateCharacteristicUUIDを書く"
    case Temperature = "TemperatureCharacteristicUUIDを書く"

    var uuid: CBUUID {
        return CBUUID(string: self.rawValue)
    }

    var service: ServiceIdentifier {
        return SampleService.Sensor
    }
}

Readしてみる

        let manager = BluetoothManager(queue: queue)
        manager
            .rx_state
            .filter { $0 == .poweredOn }
            .take(1)
            .flatMap { _ in manager.scanForPeripherals(withServices: nil).take(1) }
            .flatMap { $0.peripheral.connect() }
            .flatMap { $0.readValue(for: SampleSensorCharacteristic.Temperature) }
            .subscribe(onNext: { print("value:\([UInt8]($0.value!))")})
            .disposed(by: disposeBag)

RxAndroidBleでreadしてみる

RxAndroidBleを使用しました。
導入や使い方はREADMEでなんとなくわかると思います。

環境

AndroidStudio: 3.0
kotlin: 1.1.51

Readしてみる

        val TEMPERATURE_UUID = UUID.fromString("TemperatureCharacteristicUUIDを書く")
        val rxBleClient = RxBleClient.create(context)
        val setting = ScanSettings.Builder().build()
        rxBleClient.observeStateChanges()
                .startWith(rxBleClient.state)
                .filter { it == RxBleClient.State.READY }
                .flatMap { rxBleClient.scanBleDevices(setting).take(1) }
                .flatMap { it.bleDevice.establishConnection(false) }
                .flatMap { it.readCharacteristic(TEMPERATURE_UUID) }
                .subscribe({ value ->
                    Log.i("BLE sample", Arrays.toString(value))
                }, { error ->
                    Log.e("BLE sample", error.toString())
                })

終わりに

  • Ble実装はcallbackやdelegate地獄になりやすいですが、簡潔にかけるのではないでしょうか。
  • Rxで統一することでiOS、Androidの処理の流れに統一感が出るのではないでしょうか。
  • 今回は時間がなくてreadを試しただけですが、writeやnotify、その他細かい実装もやってみたいと思います。
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.