はじめに
以前から気になっていた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、その他細かい実装もやってみたいと思います。