RxAndroidBLE 的使用

pic
pic

GitHub

RxAndroidBLE

介绍

开发Android的BLE很痛苦,RxAndroidBLE可以极大的减轻您这方面的苦恼(手动滑稽)。
它依赖于RxJava,将 BLE 相关的复杂的Api转变为 可交互性的observables
它为你提供了以下特色:

  1. 漂亮的异步操作支持(读,写,通知)
  2. Android下的线程管理(主线程,后台线程。。。)。
  3. 连接与操作的失败处理。

使用

a. 获得 client

你需要维护一个client的单例:

RxBleClient rxBleClient = RxBleClient.create(context);

b. 发现设备

在一定的区域内扫描设备:

Subscription scanSubscription = rxBleClient.scanBleDevices()
    .subscribe(rxBleScanResult -> {
        // Process scan result here.
    });


// When done, just unsubscribe.(扫描设备 结束后,取消订阅)
scanSubscription.unsubscribe();

c. 连接

连接完成后,才能进行读写操作。所以连接是必须的:

String macAddress = "AA:BB:CC:DD:EE:FF";
RxBleDevice device = rxBleClient.getBleDevice(macAddress);

Subscription subscription = device.establishConnection(context, false) // <-- autoConnect flag(自动连接的标志)
    .subscribe(rxBleConnection -> {
        // All GATT operations are done through the rxBleConnection.
    });

// When done... unsubscribe and forget about connection teardown :)
subscription.unsubscribe();

说一下 自动连接

  1. 官网:
    [https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context](https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context), boolean, android.bluetooth.BluetoothGattCallback):
    autoConnect boolean: Whether to directly connect to the remote device (false) or to automatically connect as soon as the remote device becomes available (true).
    (直接连接:false,自动连接:true---》只要远处设备可见(可用)就自动连接上设备)

  2. 作者说:
    自动连接这个概念,第一眼看上去,让人充满了误解。
    设置 autoconnect flag 为false:若外围蓝牙设备不再广播,RxBleDevice#establishConnection 方法会被调用,一个error将被提交。这个时间大概在10s左右。
    设置 autoconnect flag 为true:允许你等待,直到 ble的设备被发现可用。直到连接成功以后,RxBleConnection的实例才会提交。它也持有了 wake 锁,等到连接被建立了以后,android的设备也将会被唤醒。但这个特色在将来也许会变。
    (原文:From experience it also handles acquiring wake locks, so it's safe to assume that your Android device will be woken up after the connection has been established - but it is not a documented feature and may change in the future system releases.)

  3. 注意:不要过度使用 自动连接,这是有负面影响的:初始连接的速度很慢。原因:因为优化的原因,后台的扫描间隔比较慢,所以它要花费更多的时间去建立连接。
    (原文:Scanning window and interval is lowered as it is optimized for background use and depending on Bluetooth parameters it may (and usually do) take more time to establish the connection.)

d. 读写操作

device.establishConnection(context, false)
    .flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(characteristicUUID))
    .subscribe(characteristicValue -> {
        // Read characteristic value.
    });
device.establishConnection(context, false)
    .flatMap(rxBleConnection -> rxBleConnection.writeCharacteristic(characteristicUUID, bytesToWrite))
    .subscribe(characteristicValue -> {
        // Characteristic value confirmed.
    });
  1. 多个 读
 device.establishConnection(context, false)
    .flatMap(rxBleConnection -> Observable.combineLatest(
        rxBleConnection.readCharacteristic(firstUUID),
        rxBleConnection.readCharacteristic(secondUUID),
        YourModelCombiningTwoValues::new
    ))
    .subscribe(model -> {
        // Process your model.
    });
  1. 读写结合
 device.establishConnection(context, false)
    .flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(characteristicUuid)
        .doOnNext(bytes -> {
            // Process read data.
        })
        .flatMap(bytes -> rxBleConnection.writeCharacteristic(characteristicUuid, bytesToWrite)))
    .subscribe(writeBytes -> {
        // Written data.
    });

e. 改变通知

device.establishConnection(context, 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.
    });

f. 观察连接状态

当你想观察设备的连接状态,做如下订阅:

device.observeConnectionStateChanges()
    .subscribe(connectionState -> {
        // Process your way.
    });

g. 日志

为了连接调试,你可以使用拓展的日志:

RxBleClient.setLogLevel(RxBleLog.DEBUG);

l. 错误处理

当你遇到错误的时候,你会得到 onError 这个callback,每个公共的方法上有JavaDoc 来解释可能存在的错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容