RxAndroidBle
介绍
RxAndroidBle Android是一个针对的蓝牙低功耗问题的一剂良药。由RxJava支持,通过观察者模式来实现复杂的api。支持库为你提供:
- 各种情况的异步操作支持(读,写,通知)
- 线程管理,以满足Android规约
- 连接和操作错误处理
前往StackOverflow #rxandroidble获取支持。
这这里Polidea Blog阅读官方公告
RxAndroidBLE @ Mobile Central Europe 2016
Paste_Image.png
用法
获取客户端
您的工作是维护客户端的单一实例。您可以使用单例,Dagger组件或任何您想要的。
RxBleClient rxBleClient = RxBleClient.create(context);
设备发现
该地区的扫描设备很简单:
Subscription scanSubscription = rxBleClient.scanBleDevices()
.subscribe(
rxBleScanResult -> {
// Process scan result here.
},
throwable -> {
// Handle an error here.
}
);
// When done, just unsubscribe.
scanSubscription.unsubscribe();
连接
对于进一步的BLE交互,需要连接。
String macAddress = "AA:BB:CC:DD:EE:FF";
RxBleDevice device = rxBleClient.getBleDevice(macAddress);
Subscription subscription = device.establishConnection(false) // <-- autoConnect flag
.subscribe(
rxBleConnection -> {
// All GATT operations are done through the rxBleConnection.
},
throwable -> {
// Handle an error here.
}
);
// When done... unsubscribe and forget about connection teardown :)
subscription.unsubscribe();
自动连接
在这些之后:
https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context , boolean, android.bluetooth.BluetoothGattCallback): autoConnect boolean: 是否直接连接到远程设备(false)或一旦远程设备可用即可自动连接(true)。
自动连接概念可能会误导初学者。当自动连接标志设置为假时,如果在调用RxBleDevice#establishConnection
建立连接方法时BLE设备未发布广告,则连接将最终出现错误。
将自动连接标志设置为true允许您等到BLE设备变为可发现。连接完全设置之前,RxBleConnection实例不会被发出。从经验来看,它也可以处理获取唤醒锁,所以可以放心的假设您的Android设备将在连接建立后被唤醒 - 但它不是一个记录的功能,并且可能会在将来的系统版本中发生变化。
小心不要过度使用autoConnect标志。另一方面,它对连接初始化速度有负面影响。扫描窗口和间隔被降低,因为它被优化用于背景使用,并且根据蓝牙参数,它可能(通常做)需要更多的时间来建立连接。
读/写操作
读
device.establishConnection(false)
.flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(characteristicUUID))
.subscribe(
characteristicValue -> {
// Read characteristic value.
},
throwable -> {
// Handle an error here.
}
);
写
device.establishConnection(false)
.flatMap(rxBleConnection -> rxBleConnection.writeCharacteristic(characteristicUUID, bytesToWrite))
.subscribe(
characteristicValue -> {
// Characteristic value confirmed.
},
throwable -> {
// Handle an error here.
}
);
多读
device.establishConnection(false)
.flatMap(rxBleConnection -> Observable.combineLatest(
rxBleConnection.readCharacteristic(firstUUID),
rxBleConnection.readCharacteristic(secondUUID),
YourModelCombiningTwoValues::new
))
.subscribe(
model -> {
// Process your model.
},
throwable -> {
// Handle an error here.
}
);
Long write
device.establishConnection(false)
.flatMap(rxBleConnection -> rxBleConnection.createNewLongWriteBuilder()
.setCharacteristicUuid(uuid) // required or the .setCharacteristic()
// .setCharacteristic() alternative if you have a specific BluetoothGattCharacteristic
.setBytes(byteArray)
// .setMaxBatchSize(maxBatchSize) // optional -> default 20 or current MTU
// .setWriteOperationAckStrategy(ackStrategy) // optional to postpone writing next batch
.build()
)
.subscribe(
byteArray -> {
// Written data.
},
throwable -> {
// Handle an error here.
}
);
读写结合
device.establishConnection(false)
.flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(characteristicUuid)
.doOnNext(bytes -> {
// Process read data.
})
.flatMap(bytes -> rxBleConnection.writeCharacteristic(characteristicUuid, bytesToWrite))
)
.subscribe(
writeBytes -> {
// Written data.
},
throwable -> {
// Handle an error here.
}
);
更改通知
device.establishConnection(false)
.flatMap(rxBleConnection -> rxBleConnection.setupNotification(characteristicUuid))
.doOnNext(notificationObservable -> {
// Notification has been set up
})
.flatMap(notificationObservable -> notificationObservable) // <-- Notification has been set up, now observe value changes.
.subscribe(
bytes -> {
// Given characteristic has been changes, here is the value.
},
throwable -> {
// Handle an error here.
}
);
观察连接状态
如果您想观察设备连接状态的更改,请直接订阅如下。订阅后,您将立即获得最新状态。
device.observeConnectionStateChanges()
.subscribe(
connectionState -> {
// Process your way.
},
throwable -> {
// Handle an error here.
}
);
记录;
对于连接调试,您可以使用扩展日志记录
RxBleClient.setLogLevel(RxBleLog.DEBUG);
错误处理
您可能遇到的每个错误都是通过onError回调来提供的。每个公共方法都有JavaDoc解释可能的错误。
观察到的行为
从不同的界面,您可以获得不同的Observable,表现出不同的行为。您可能会遇到三种类型的Observable。
- 单值,完成 --- 即RxBleConnection.readCharacteristic(),RxBleConnection.writeCharacteristic()等
- 多个值,没完成 --- 即RxBleClient.scan(),RxBleDevice.observeConnectionStateChanges()和由RxBleConnection.setupNotification()/ RxBleConnection.setupIndication()发出的Observable
- 单值,不完成 --- 这些通常意味着在取消订阅时自动清除,即setupNotification()/ setupIndication() - 当您取消订阅时,通知/指示将被禁用
xBleDevice.establishConnection()是一个Observable,它将发出一个单独的RxBleConnection,但不能完成,因为连接可能晚于错误(即外部断开连接)。每当您不再需要保持连接打开时,您应该取消订阅,这将导致断开连接和资源清理。
下表包含使用的可观察图案的概述
QQ20170525-101659@2x.png此可观察当取消订阅关闭/清除内部资源(即完成扫描,关闭连接,禁用通知)
助手
我们建议您检查包含适用于某些典型用例的易用反应性包装的软件包com.polidea.rxandroidble.helpers。
更多例子
完整的使用示例位于/sample GitHub repo.
下载
Gradle
compile "com.polidea.rxandroidble:rxandroidble:1.2.2"
Maven
<dependency>
<groupId>com.polidea.rxandroidble</groupId>
<artifactId>rxandroidble</artifactId>
<version>1.2.2</version>
<type>aar</type>
</dependency>
Snapshot
如果您对前沿构建感兴趣,您可以获得该库的SNAPSHOT版本。注意:它是从主分支的顶部构建的,并且会导致更频繁的更改,从而可能会破坏API和/或更改行为。
为了能够下载它,您需要将Sonatype Snapshot存储库站点添加到您的build.gradle文件中:
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
单元测试
使用RxAndroidBle可以轻松地对应用进行单元测试。例如如何使用mocking到MockRxAndroidBle