项目作者: okbean

项目描述 :
BLE客户端框架,使BLE请求像HTTP请求一样简单易用(A library of Android BLE Client, make the BLE request as easy as okhttp)
高级语言: Java
项目地址: git://github.com/okbean/OkBle.git
创建时间: 2020-12-15T01:56:35Z
项目社区:https://github.com/okbean/OkBle

开源协议:Apache License 2.0

下载


OkBle

BLE客户端框架,使BLE请求像HTTP请求一样简单易用(A library of BLE Client, make the BLE request as easy as HTTP request)

功能和特点

1/ 提供异步和非异步,阻塞和非阻塞的BLE请求接口

  1. 提供多样化的接口,可以选择你习惯和喜欢的

2/ 实现带优先级的BLE请求队列

  1. 带优先级的队列在一些场景比较需要,比如来电时候需要马上通知到设备

3/ 支持多设备同时连接

4/ 支持读写特征值

5/ 支持读写描述符

6/ 支持大字节数组发送

  1. 包括写特征值和写描述符都支持大字节数组发送。
  2. 框架自动帮你进行分包数据发送,也可以通过实现框架提供的分包接口进行自定义的分包发送。
  3. 通过实现分包接口可以支持文件发送。

7/ 支持打开和关闭通知

8/ 支持设置MTU大小

9/ 支持读取RSSI

10/ 支持读取和设置PHY

11/ 支持设置蓝牙连接参数的优先级

新建BLE客户端

  1. final OkBleClient client = new OkBleClient.Builder()
  2. .context(getApplication())
  3. .debuggable(true)
  4. .device(device)
  5. .build();

连接设备

  1. client.connect();
  2. 或者
  3. final ConnectionRequest request = new ConnectionRequest.Builder().build();
  4. final OkBleTask<Void> task = client.newTask(request);
  5. task.addOnCompleteListener(new OnCompleteListener<Void>(){
  6. @Override
  7. public void onComplete(OkBleTask<Void> task) {
  8. if(task.isSuccess()){
  9. //连接成功
  10. }else{
  11. //连接失败
  12. }
  13. }
  14. }).enqueue();

监听连接状态变化

  1. client.addOnConnectionStateChangedListener(new OnConnectionStateChangedListener(){
  2. @Override
  3. public void onConnectionStateChanged(OkBleClient client, ConnectionState newState, ConnectionState lastState) {
  4. Log.i(TAG, "onConnectionStateChanged." + "newState:" + newState.toString() + " lastState:" + lastState.toString());
  5. if(newState == ConnectionState.Connected){
  6. //已连接
  7. }else if(newState == ConnectionState.Disconnected){
  8. //连接断开
  9. }else if(newState == ConnectionState.Connecting){
  10. //连接中
  11. }
  12. }
  13. });

断开与设备的连接

  1. client.close();

打开通知

  1. final UUID service = xxx;
  2. final UUID characteristic = xxx;
  3. final EnableNotificationRequest request = new EnableNotificationRequest.Builder()
  4. .service(service)
  5. .characteristic(characteristic)
  6. .notificationType(NotificationType.Indication)
  7. .build();
  8. final OkBleTask<Void> task = client.newTask(request);
  9. task.addOnCompleteListener(new OnCompleteListener<Void>(){
  10. @Override
  11. public void onComplete(OkBleTask<Void> task) {
  12. if(task.isSuccess()){
  13. //打开通知成功
  14. }else{
  15. //打开通知失败
  16. }
  17. }
  18. }).enqueue();

监听/接收通知数据

  1. client.addOnDataReceivedListener(new OnDataReceivedListener(){
  2. @Override
  3. public void onDataReceived(OkBleClient client, CharacteristicData data) {
  4. Log.i(TAG, "onDataReceived: (0x) " + Hex.toString(data.data(), '-'));
  5. }
  6. });

关闭通知

  1. final UUID service = xxx;
  2. final UUID characteristic = xxx;
  3. final DisableNotificationRequest request = new DisableNotificationRequest.Builder()
  4. .service(service)
  5. .characteristic(characteristic)
  6. .build();
  7. final OkBleTask<Void> task = client.newTask(request);
  8. task.addOnCompleteListener(new OnCompleteListener<Void>(){
  9. @Override
  10. public void onComplete(OkBleTask<Void> task) {
  11. if(task.isSuccess()){
  12. //关闭通知成功
  13. }else{
  14. //关闭通知失败
  15. }
  16. }
  17. }).enqueue();

写特征值(发送数据)

  1. final UUID service = xxx;
  2. final UUID characteristic = xxx;
  3. final byte[] data = xxx;
  4. final WriteCharacteristicRequest req = new WriteCharacteristicRequest.Builder()
  5. .service(service)
  6. .characteristic(characteristic)
  7. .writeType(WriteType.WriteNoResponse)
  8. .packetSenderFactory( data, 20)//每包最大20个字节,超过20个字节将会分包发送
  9. .build();
  10. final OkBleTask<Void> task = client.newTask(req);
  11. task.addOnCompleteListener(new OnCompleteListener<Void>(){
  12. @Override
  13. public void onComplete(OkBleTask<Void> task) {
  14. if(task.isSuccess()){
  15. //发送成功
  16. }else{
  17. //发送失败
  18. }
  19. }
  20. }).enqueue();

写描述符

  1. final UUID service = xxx;
  2. final UUID characteristic = xxx;
  3. final UUID descriptor = xxx;
  4. final byte[] data = xxx;
  5. final ReadDescriptorRequest req = new ReadDescriptorRequest.Builder()
  6. .service(service)
  7. .characteristic(characteristic)
  8. .descriptor(descriptor)
  9. .packetSenderFactory( data, 20)//每包最大20个字节,超过20个字节将会分包发送
  10. .build();
  11. final OkBleTask<Void> task = client.newTask(req);
  12. task.addOnCompleteListener(new OnCompleteListener<Void>(){
  13. @Override
  14. public void onComplete(OkBleTask<Void> task) {
  15. if(task.isSuccess()){
  16. //发送成功
  17. }else{
  18. //发送失败
  19. }
  20. }
  21. }).enqueue();

读特征值

  1. final UUID service = xxx;
  2. final UUID characteristic = xxx;
  3. final ReadCharacteristicRequest req = new ReadCharacteristicRequest.Builder()
  4. .service(service)
  5. .characteristic(characteristic)
  6. .build();
  7. final OkBleTask<byte[]> task = client.newTask(req);
  8. task.addOnSuccessListener(new OnSuccessListener<byte[]>(){
  9. @Override
  10. public void onSuccess(OkBleTask<byte[]> task, byte[] bytes) {
  11. //读取成功,收到数据bytes
  12. }
  13. });
  14. task.addOnFailedListener(new OnFailedListener<byte[]>(){
  15. @Override
  16. public void onFailed(OkBleTask<byte[]> task, OkBleException ex) {
  17. //读取失败,收到异常ex
  18. }
  19. });
  20. task.enqueue();

读描述符

  1. final UUID service = xxx;
  2. final UUID characteristic = xxx;
  3. final UUID descriptor = xxx;
  4. final ReadDescriptorRequest req = new ReadDescriptorRequest.Builder()
  5. .service(service)
  6. .characteristic(characteristic)
  7. .descriptor(descriptor)
  8. .build();
  9. final OkBleTask<byte[]> task = client.newTask(req);
  10. task.addOnSuccessListener(new OnSuccessListener<byte[]>(){
  11. @Override
  12. public void onSuccess(OkBleTask<byte[]> task, byte[] bytes) {
  13. //读取成功,收到数据bytes
  14. }
  15. });
  16. task.addOnFailedListener(new OnFailedListener<byte[]>(){
  17. @Override
  18. public void onFailed(OkBleTask<byte[]> task, OkBleException ex) {
  19. //读取失败,收到异常ex
  20. }
  21. });
  22. task.enqueue();

设置MTU

  1. final SetMtuRequest req = new SetMtuRequest.Builder()
  2. .mtu(512).build();
  3. final OkBleTask<Mtu> task = client.newTask(req);
  4. task.addOnCompleteListener(new OnCompleteListener<Mtu>(){
  5. @Override
  6. public void onComplete(OkBleTask<Mtu> task) {
  7. if(task.isSuccess()){
  8. //设置成功,返回与设备协商好的MTU,可能比预设的MTU要小
  9. final Mtu mtu = task.getResult();
  10. }else{
  11. //设置失败
  12. }
  13. }
  14. }).enqueue();

读取RSSI

  1. final ReadRemoteRssiRequest req = new ReadRemoteRssiRequest.Builder().build();
  2. final OkBleTask<Rssi> task = client.newTask(req);
  3. task.addOnCompleteListener(new OnCompleteListener<Rssi>(){
  4. @Override
  5. public void onComplete(OkBleTask<Rssi> task) {
  6. if(task.isSuccess()){
  7. //读取成功
  8. final Rssi rssi = task.getResult();
  9. }else{
  10. //读取失败
  11. }
  12. }
  13. }).enqueue();

读取PHY

  1. final ReadPhyRequest req = new ReadPhyRequest.Builder().build();
  2. final OkBleTask<Phy> task = client.newTask(req);
  3. task.addOnCompleteListener(new OnCompleteListener<Phy>(){
  4. @Override
  5. public void onComplete(OkBleTask<Phy> task) {
  6. if(task.isSuccess()){
  7. //读取成功
  8. final Phy phy = task.getResult();
  9. }else{
  10. //读取失败
  11. }
  12. }
  13. }).enqueue();

如何接入

直接引用OkBle.jar, 或者复制ble目录下的源码到工程,然后在build.gradle添加implementation project(‘:OkBle’),

或者以下两个步骤:

1.在工程根目录的build.gradle添加:

  1. allprojects {
  2. repositories {
  3. maven { url 'https://www.jitpack.io' }
  4. }
  5. }

2.在依赖OkBle模块的build.gradle添加:

  1. dependencies {
  2. implementation 'com.github.okbean:OkBle:2.1.4
  3. }