# RxohosBle **Repository Path**: andych008/rxohosble ## Basic Information - **Project Name**: RxohosBle - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-12-27 - **Last Updated**: 2021-12-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rxohosble **本项目是基于开源项目RxAndroidBle进行ohos化的移植和开发的,可以通过项目标签以及github地址(https://github.com/Polidea/RxAndroidBle )追踪到原项目版本** ## 项目介绍 - 项目名称:rxohosble - 所属系列:ohos的第三方组件适配移植 - 功能: + 异步操作支持(读,写,通知) + 线程管理 + 连接和操作错误处理 - 项目移植状态:完成 - 调用差异:无 - 项目作者和维护人: hihope - 联系方式:hihope@hoperun.com - 原项目Doc地址:https://github.com/Polidea/RxAndroidBle - 原项目基线版本:v1.11.1 > sha1: 367ba396ce8442517d25dd7e028dcc9216d0e99d - 编程语言:Java ##效果展示 ![](./rxohosble.gif) ## 安装教程 #### 方法一: 1. 编译ohos-ble的har包library.har。 2. 启动 DevEco Studio,将编译的har包,导入工程目录“entry->libs”下。 3. 在moudle级别下的build.gradle文件中添加依赖,在dependences标签中增加对libs目录下har包的引用。 ``` dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) …… } ``` 4. 在导入的har包上点击右键,选择“Add as Library”对包进行引用,选择需要引用的模块,并点击“OK”即引用成功。 ## 使用说明 #### 动态权限权限申请 ```json "reqPermissions": [ { "name": "ohos.permission.LOCATION", "reason": "blu_location", "usedScene": { "ability": [ "com.inuker.bluetooth.MainAbility" ], "when": "always" } }, { "name": "ohos.permission.USE_BLUETOOTH" }, { "name": "ohos.permission.DISCOVER_BLUETOOTH" } ] ``` ```java private void initPermission() { if (verifySelfPermission("ohos.permission.LOCATION") != IBundleManager.PERMISSION_GRANTED) { // 应用未被授予权限 if (canRequestPermission("ohos.permission.LOCATION")) { // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示) requestPermissionsFromUser( new String[]{"ohos.permission.LOCATION"}, MY_PERMISSIONS_REQUEST_LOCATION); } else { // 显示应用需要权限的理由,提示用户进入设置授权 } } else { // 权限已被授予 } } @Override public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_LOCATION: { // 匹配requestPermissions的requestCode if (grantResults.length > 0 && grantResults[0] == IBundleManager.PERMISSION_GRANTED) { // 权限被授予 // 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的接口进行异常捕获处理 sendMessage(); } else { // 权限被拒绝 } return; } } } ``` #### 获取客户端 ```java RxBleClient rxBleClient = RxBleClient.create(context); ``` #### 扫描设备 ```java Disposable scanSubscription = rxBleClient.scanBleDevices( new ScanSettings.Builder() // .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // change if needed // .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) // change if needed .build() // add filters if needed ) .subscribe( scanResult -> { // Process scan result here. }, throwable -> { // Handle an error here. } ); // When done, just dispose. scanSubscription.dispose(); ``` #### 观察客户端状态 ```java Disposable flowDisposable = rxBleClient.observeStateChanges() .switchMap(state -> { // switchMap makes sure that if the state will change the rxBleClient.scanBleDevices() will dispose and thus end the scan switch (state) { case READY: // everything should work return rxBleClient.scanBleDevices(); case BLUETOOTH_NOT_AVAILABLE: // basically no functionality will work here case LOCATION_PERMISSION_NOT_GRANTED: // scanning and connecting will not work case BLUETOOTH_NOT_ENABLED: // scanning and connecting will not work case LOCATION_SERVICES_NOT_ENABLED: // scanning will not work default: return Observable.empty(); } }) .subscribe( rxBleScanResult -> { // Process scan result here. }, throwable -> { // Handle an error here. } ); // When done, just dispose. flowDisposable.dispose(); ``` Tips: - 在对设备进行扫描之前,可以配置扫描规则,将匹配程序的设备过滤掉。 - “未配置”为默认参数 #### 连接设备 ````java `void scan(BleScanCallback callback)` BleManager.getInstance().scan(new BleScanCallback() { @Override public void onScanStarted(boolean success) { } @Override public void onScanning(BleDevice bleDevice) { } @Override public void onScanFinished(List scanResultList) { } }); ``` #### 读写操作 ##### Read ```java device.establishConnection(false) .flatMapSingle(rxBleConnection -> rxBleConnection.readCharacteristic(characteristicUUID)) .subscribe( characteristicValue -> { // Read characteristic value. }, throwable -> { // Handle an error here. } ); ``` ##### Write ```java device.establishConnection(false) .flatMapSingle(rxBleConnection -> rxBleConnection.writeCharacteristic(characteristicUUID, bytesToWrite)) .subscribe( characteristicValue -> { // Characteristic value confirmed. }, throwable -> { // Handle an error here. } ); ``` ##### Multiple reads ```java device.establishConnection(false) .flatMap(rxBleConnection -> Single.zip( rxBleConnection.readCharacteristic(firstUUID), rxBleConnection.readCharacteristic(secondUUID), YourModelCombiningTwoValues::new )) .subscribe( model -> { // Process your model. }, throwable -> { // Handle an error here. } ); ``` ##### Long write ```java device.establishConnection(false) .flatMap(rxBleConnection -> rxBleConnection.createNewLongWriteBuilder() .setCharacteristicUuid(uuid) // required or the .setCharacteristic() // .setCharacteristic() alternative if you have a specific GattCharacteristic .setBytes(byteArray) // .setWriteOperationRetryStrategy(retryStrategy) // if you'd like to retry batch write operations on failure, provide your own retry strategy // .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. } ); ``` ##### Read and write combined ```java device.establishConnection(false) .flatMapSingle(rxBleConnection -> rxBleConnection.readCharacteristic(characteristicUuid) .doOnSuccess(bytes -> { // Process read data. }) .flatMap(bytes -> rxBleConnection.writeCharacteristic(characteristicUuid, bytesToWrite)) ) .subscribe( writeBytes -> { // Written data. }, throwable -> { // Handle an error here. } ); ``` #### 通知 ```java 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. } ); ``` #### 观察连接状态 ```java device.observeConnectionStateChanges() .subscribe( connectionState -> { // Process your way. }, throwable -> { // Handle an error here. } ); ``` #### 日志 对于连接调试,您可以使用扩展日志记录 ```java RxBleClient.setLogLevel(RxBleLog.DEBUG); ``` 默认情况下,RxBleLog使用logcat打印消息。您可以提供自己的记录器实现,以将其转发到其他记录库,例如Timber。 ```java RxBleLog.setLogger((level, tag, msg) -> Timber.tag(tag).log(level, msg)); ``` ## 版本迭代 - v1.0.1 ## 版权和许可信息 - Apache Licence