# FastBle
Android Bluetooth Low Energy 蓝牙快速开发框架。
使用简单的方式进行搜索、连接、读写、通知的订阅与取消等一系列蓝牙操作,并实时地得到操作反馈。
Gradle:
Implementation 'com.clj.fastble:FastBleLib:1.2.1'
FastBle requires at minimum Java 7 or Android 4.0.
# 蓝牙操作经验及FastBle的兼容性说明
1.BLE是蓝牙4.0里面的低功耗规范,Android 4.3以上的系统开始搭载BLE模块,所以FastBle也只支持4.3以上。
2.不排除某些特殊设备的定制系统去除了BLE模块的情况,使用之前可以先判断当前设备是否支持BLE,再进行后续操作。
3.蓝牙设备相关程序必须使用真机才能运行。
4. FastBle当前版本仅支持对BLE蓝牙进行操作,不支持经典蓝牙。
5. 使用蓝牙功能,必须先声明蓝牙相关的权限。Android 6.0以上的系统,需要额外申请位置相关的权限,并且是危险权限建议在运行时动态获取。为使使用更灵活,FastBle库中并不包含权限相关的操作,使用者根据程序的实际情况在外层自行嵌套。示例代码中有相关代码演示,供参考。
5.蓝牙操作与硬件关联很大,开发过程中要保持和硬件协议的沟通,某些问题的解决需要硬件方面做一些适配。
6. BLE的MTU(最大传输单元)是20字节,即一次最多能发送20个字节,若超过20个字节,建议采用分包传输的方式。
7.蓝牙连接之后,列出当前外设模块的所有service,每个service可能有一个或多个的characteristic,每一个characteristic有其对应的property(即可操作的属性类别),假如一个characteristic的property对应的是write,那么对这个characteristic做notify处理显然是行不通的。
8.两次操作之间最好间隔一小段时间,如100ms(具体时间可以根据自己实际蓝牙外设自行尝试延长或缩短)。举例,连接成功之后,延迟100ms进行notify,成功之后延迟100ms进行write,write成功之后,notify的数据回调接口将返回外设传输过来的数据。
9. FastBle中开放的蓝牙操作的相关方法均要求在主线程中执行。
10.一个简单的使用场景:打开蓝牙,在主线程扫描设备,连接,连接成功并发现服务之后,在`onServicesDiscovered`的异步回调方法中,延时100ms,再切换到主线程,再去调用notify、write等方法。这就是一个基本的操作。
11. 连接及连接后的过程中,时刻关注BleGattCallback,蓝牙的连接情况会实时反映在其各个回调方法中,尤其是`onDisConnected`方法。
12.连接过程中,假如外设突然中断(或关闭)了蓝牙,Android设备维持的BLE连接并不会马上回调`onDisConnected`方法,而是会延迟一段时间才会通知连接断开,开发时需注意,假如对实时性要求较高的程序,可能需要借助其他辅助方法来判断设备是否中断,比如心跳包等。
13. 蓝牙应用开发中,存在两种角色,分别是central和peripheral ,中文就是中心和外设。比如手机去连接智能设备,那手机就是central,智能设备就是peripheral。
14.FastBle当前版本仅支持中心模式 (central model),即"以App作为中心,连接其他BLE外设"。把手机作为外设目前版本是行不通的。
15.连接之后的操作有:write,read,notify,indicate,response or not等。indicate和notify的区别就在于,indicate是一定会收到数据,notify有可能会丢失数据(不会有central收到数据的回应),write也分为response和no response,如果是response,那么write成功回收到peripheral的确认消息,但是会降低写入的速率,换一个角度说就是 write no response写的速率更快。
16. 连接断开之后的重连很简单,在`void onDisConnected(BluetoothGatt gatt, int status, BleException exception)`调用`boolean gatt.connect()`方法即可,当外设再次处于可连接状态时,就会自动连上。
17.连接断开之后可以根据实际情况进行重连,但如果是连接失败的情况,建议不要立即重连,而是调用`void closeBluetoothGatt()`清空一下状态,并延迟一段时间等待复位,否则会把gatt阻塞,导致手机不重启蓝牙就再也无法连接任何设备的严重情况。
18. 调用`bleManager.closeBluetoothGatt()`之后,最好不要紧接着调用`bleManager = null`,因为Android原生蓝牙API中的`gatt.close()`方法需要一段时间保证完成,我们建议延迟一段时间。延时操作在Android蓝牙开发中是一个重要的技巧。
19.很多Android设备是可以强制打开用户手机蓝牙的,打开蓝牙需要一段时间(部分手机上需要向用户请求)。虽然时间比较短,但也不能调用完打开蓝牙方法后直接去调用扫描方法,此时蓝牙多半是还未开启完毕状态。建议的做法是维持一个蓝牙状态的广播,调用打开蓝牙方法后,在一段时间内阻塞线程,如果在这段时间内收到蓝牙打开广播后,再进行后续操作。而后续操作过程中,如果收到蓝牙正在关闭或关闭的广播,也可以及时对当前的情况做一个妥善处理。
网友评论