# FastBle
**Repository Path**: hihopeorg/FastBle
## Basic Information
- **Project Name**: FastBle
- **Description**: No description available
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2021-02-27
- **Last Updated**: 2024-02-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# FastBle
**本项目是基于开源项目FastBle进行ohos化的移植和开发的,可以通过项目标签以及github地址(https://github.com/Jasonchenlijian/FastBle
)追踪到原项目版本**
## 项目介绍
- 项目名称:开源弹幕解析绘制引擎项目
- 所属系列:ohos的第三方组件适配移植
- 功能:
1. 过滤,扫描,链接,读取,写入,通知订阅和取消的简单方式
2. 支持获取信号强度和设置最大传输单元
3. 支持自定义扫描规则
4. 支持多设备连接
5. 支持重新连接
6. 连接或操作时支持配置超时
- 项目移植状态:完成
- 调用差异:无
- 项目作者和维护人: hihope
- 联系方式:hihope@hoperun.com
- 原项目Doc地址:https://github.com/Jasonchenlijian/FastBle
- 原项目基线版本:v2.3.2,sha1:95a859b5fb7b7de6dcf7dab2ed9fd7a43435f1dd
- 编程语言:Java
## 效果展示:
## 安装教程
方法1.
1. implementation 'com.clj.fastble:FastBleLib:1.0.0'
2. 将library引入工程后,在主工程build.gradle 中加入compile project(path: ': fastblelib)
方法2.
1. 在工程的build.gradle的allprojects中,添加HAR所在的Maven仓地址
```
repositories {
maven {
url 'http://106.15.92.248:8081/repository/Releases/'
}
}
```
2. 在应用模块的build.gradle的dependencies闭包中,添加如下代码:
```
dependencies {
implementation 'com.clj.fastble.ohos:FastBleLib:1.0.0'
}
```
## 使用说明
```
动态权限权限申请
"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"
}
]
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;
}
}
}
```
- ### 初始化
BleManager.getInstance().init(getApplication());
- ### 打开或关闭蓝牙
```
void enableBluetooth()
void disableBluetooth()
```
- ### 初始化配置
BleManager.getInstance()
.enableLog(true)
.setReConnectCount(1, 5000)
.setSplitWriteNum(20)
.setConnectOverTime(10000)
.setOperateTimeout(5000);
- ### 配置扫描规则
`void initScanRule(BleScanRuleConfig scanRuleConfig)`
BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder()
.setServiceUuids(serviceUuids)
.setDeviceName(true, names)
.setDeviceMac(mac)
.setAutoConnect(isAutoConnect)
.setScanTimeOut(10000)
.build();
BleManager.getInstance().initScanRule(scanRuleConfig);
Tips:
—在对设备进行扫描之前,可以配置扫描规则,将匹配程序的设备过滤掉。
—“未配置”为默认参数
- ### 扫描设备
`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) {
}
});
Tips:
—扫描和过滤过程在工作线程中进行,所以不会影响主线程的UI操作。最终,每个回调结果都会返回到主线程。
- ### 连接设备
`BluetoothGatt connect(BleDevice bleDevice, BleGattCallback bleGattCallback)`
BleManager.getInstance().connect(bleDevice, new BleGattCallback() {
@Override
public void onStartConnect() {
}
@Override
public void onConnectFail(BleDevice bleDevice, BleException exception) {
}
@Override
public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
}
@Override
public void onDisConnected(boolean isActiveDisConnected, BleDevice bleDevice, BluetoothGatt gatt, int status) {
}
});
Tips:
—在某些类型的手机上,connectGatt必须在主线程上有效。非常推荐将连接进程放在主线程中。
—连接失败后,重新连接:框架包含了连接失败后的重新连接机制,可以配置重新连接的时间和间隔。当然,你也可以自动调用' onConnectFail '回调中的' connect '方法。
—连接断开并重新连接:你可以在' onDisConnected '回调方法中再次调用' connect '方法。
—为了保证重新连接的成功率,建议间隔一段时间重新连接。
—部分型号出现故障时,短时间内无法扫描设备。它们可以直接通过设备对象或设备MAC连接,而不需要扫描。
- ### 连接MAC
`BluetoothGatt connect(String mac, BleGattCallback bleGattCallback)`
```
BleManager.getInstance().connect(mac, new BleGattCallback() {
@Override
public void onStartConnect() {
}
@Override
public void onConnectFail(BleDevice bleDevice, BleException exception) {
}
@Override
public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
}
@Override
public void onDisConnected(boolean isActiveDisConnected, BleDevice bleDevice, BluetoothGatt gatt, int status) {
}
});
```
Tips:
—这种方法可以尝试直接连接到Mac周围的BLE设备,而不需要扫描。
—在很多使用场景下,建议APP保存用户习惯设备的Mac,然后用这种方法连接,这样会大大提高连接效率。
- ### 扫描并连接
对第一台符合扫描规则的设备进行扫描后,停止扫描并连接设备。
`void scanAndConnect(BleScanAndConnectCallback callback)`
BleManager.getInstance().scanAndConnect(new BleScanAndConnectCallback() {
@Override
public void onScanStarted(boolean success) {
}
@Override
public void onScanFinished(BleDevice scanResult) {
}
@Override
public void onStartConnect() {
}
@Override
public void onConnectFail(BleDevice bleDevice,BleException exception) {
}
@Override
public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
}
@Override
public void onDisConnected(boolean isActiveDisConnected, BleDevice device, BluetoothGatt gatt, int status) {
}
});
####
- ### 取消扫描
`void cancelScan()`
BleManager.getInstance().cancelScan();
Tips:
—如果这个方法被调用,如果它仍然处于扫描状态,它将立即结束,并回调' onScanFinished '方法。
- ### 通知
`void notify(BleDevice bleDevice,
String uuid_service,
String uuid_notify,
BleNotifyCallback callback)`
`void notify(BleDevice bleDevice,
String uuid_service,
String uuid_notify,
boolean useCharacteristicDescriptor,
BleNotifyCallback callback)`
BleManager.getInstance().notify(
bleDevice,
uuid_service,
uuid_characteristic_notify,
new BleNotifyCallback() {
@Override
public void onNotifySuccess() {
}
@Override
public void onNotifyFailure(BleException exception) {
}
@Override
public void onCharacteristicChanged(byte[] data) {
}
});
- ### 取消通知
`boolean stopNotify(BleDevice bleDevice,
String uuid_service,
String uuid_notify)`
`boolean stopNotify(BleDevice bleDevice,
String uuid_service,
String uuid_notify,
boolean useCharacteristicDescriptor)`
BleManager.getInstance().stopNotify(uuid_service, uuid_characteristic_notify);
- ### 表明
`void indicate(BleDevice bleDevice,
String uuid_service,
String uuid_indicate,
BleIndicateCallback callback)`
`void indicate(BleDevice bleDevice,
String uuid_service,
String uuid_indicate,
boolean useCharacteristicDescriptor,
BleIndicateCallback callback)`
BleManager.getInstance().indicate(
bleDevice,
uuid_service,
uuid_characteristic_indicate,
new BleIndicateCallback() {
@Override
public void onIndicateSuccess() {
}
@Override
public void onIndicateFailure(BleException exception) {
}
@Override
public void onCharacteristicChanged(byte[] data) {
}
});
- ### 停止显示
`boolean stopIndicate(BleDevice bleDevice,
String uuid_service,
String uuid_indicate)`
`boolean stopIndicate(BleDevice bleDevice,
String uuid_service,
String uuid_indicate,
boolean useCharacteristicDescriptor)`
BleManager.getInstance().stopIndicate(uuid_service, uuid_characteristic_indicate);
- ### 写数据
`void write(BleDevice bleDevice,
String uuid_service,
String uuid_write,
byte[] data,
BleWriteCallback callback)`
`void write(BleDevice bleDevice,
String uuid_service,
String uuid_write,
byte[] data,
boolean split,
BleWriteCallback callback)`
`void write(BleDevice bleDevice,
String uuid_service,
String uuid_write,
byte[] data,
boolean split,
boolean sendNextWhenLastSuccess,
long intervalBetweenTwoPackage,
BleWriteCallback callback)`
BleManager.getInstance().write(
bleDevice,
uuid_service,
uuid_characteristic_write,
data,
new BleWriteCallback() {
@Override
public void onWriteSuccess(int current, int total, byte[] justWrite) {
}
@Override
public void onWriteFailure(BleException exception) {
}
});
Tips:
—如果需要发送大于20字节的长数据,则不需要扩展MTU,也不需要扩展MTU的无效。参数“boolean split”表示是否使用包传送;默认情况下,不带“boolean split”参数的“write”方法被分包到数据中超过20字节。
—在' onwritessuccess '回调方法上:' current '表示当前发送的数据包数量,' total '表示这次的数据包总数,' justWrite '表示刚刚发送成功的数据包。
- ### 读数据
`void read(BleDevice bleDevice,
String uuid_service,
String uuid_read,
BleReadCallback callback)`
BleManager.getInstance().read(
bleDevice,
uuid_service,
uuid_characteristic_read,
new BleReadCallback() {
@Override
public void onReadSuccess(byte[] data) {
}
@Override
public void onReadFailure(BleException exception) {
}
});
- ### 获取 Rssi
`void readRssi(BleDevice bleDevice, BleRssiCallback callback)`
BleManager.getInstance().readRssi(
bleDevice,
new BleRssiCallback() {
@Override
public void onRssiFailure(BleException exception) {
}
@Override
public void onRssiSuccess(int rssi) {
}
});
小贴士:
—获取设备的信号强度必须在设备连接完成后进行。
—有些设备可能因为超时而不能读取Rssi,不回调onrssissuccess(),或者回调onRssiFailure()。
- ### 设置Mtu
`void setMtu(BleDevice bleDevice,
int mtu,
BleMtuChangedCallback callback)`
BleManager.getInstance().setMtu(bleDevice, mtu, new BleMtuChangedCallback() {
@Override
public void onSetMTUFailure(BleException exception) {
}
@Override
public void onMtuChanged(int mtu) {
}
});
Tips:
—设置MTU需要在连接设备后进行操作。
—该方法的MTU设置为23,最大设置为512。
—并不是所有设备都支持MTU的扩展,MTU的扩展需要双方通信,也就是说,设备硬件的需要也支持MTU的扩展。调用此方法后,您可以通过onMtuChanged (int MTU)看到在最终设置后设备的最大传输单元被扩展到多少。如果设备不支持,无论多少设置,最终的MTU都是23。
- ### 连接优先级
`boolean requestConnectionPriority(BleDevice bleDevice,int connectionPriority)`
Tips:
- Request a specific connection priority. Must be one of{@link BluetoothGatt#CONNECTION_PRIORITY_BALANCED}, {@link BluetoothGatt#CONNECTION_PRIORITY_HIGH} or {@link BluetoothGatt#CONNECTION_PRIORITY_LOW_POWER}.
- ### 设备切换
`BleDevice convertBleDevice(BluetoothDevice bluetoothDevice)`
`BleDevice convertBleDevice(ScanResult scanResult)`
Tips:
- The completed BleDevice object is still unconnected, if necessary, advanced connection.
- ### 获取所有连接的设备
`List getAllConnectedDevice()`
BleManager.getInstance().getAllConnectedDevice();
- ### 获得一个连接设备的BluetoothGatt
`BluetoothGatt getBluetoothGatt(BleDevice bleDevice)`
- ### 获取连接设备的所有服务
`List getBluetoothGattServices(BleDevice bleDevice)`
- ### 获取服务的所有特征
`List getBluetoothGattCharacteristics(BluetoothGattService service)`
- ### 确定设备是否已连接
`boolean isConnected(BleDevice bleDevice)`
BleManager.getInstance().isConnected(bleDevice);
`boolean isConnected(String mac)`
BleManager.getInstance().isConnected(mac);
- ### 确定设备的当前连接状态
`int getConnectState(BleDevice bleDevice)`
BleManager.getInstance().getConnectState(bleDevice);
- ### 断开一个设备
`void disconnect(BleDevice bleDevice)`
BleManager.getInstance().disconnect(bleDevice);
- ### 断开所有设备
`void disconnectAllDevice()`
BleManager.getInstance().disconnectAllDevice();
- ### 资源销毁
`void destroy()`
BleManager.getInstance().destroy();
- ### HexUtil
数据操作工具类
`String formatHexString(byte[] data, boolean addSpace)`
`byte[] hexStringToBytes(String hexString)`
`char[] encodeHex(byte[] data, boolean toLowerCase)`
## BleDevice
BLE设备对象是该框架中扫描、连接和操作的最小单位对象。
`String getName()` Bluetooth broadcast name
`String getMac()` Bluetooth MAC
`byte[] getScanRecord()` Broadcast data
`int getRssi()` Initial signal intensity
## 版本迭代
版本号:1.0.0
支持与外围BLE设备进行扫描、连接、读、写、通知订阅与取消等基本操作
1. 初始化
2. 扫描
3. 连接
4. 取消扫描
5. 打开蓝牙
6. 关闭蓝牙
7. 读Characteristic
8. 写Characteristic
9. 打开Notify
10. 停止Notify
11. 设置Mtu
## 版权和许可信息
- Apache Licence