项目作者: hgncxzy

项目描述 :
BLE-SDK 是 BLE 蓝牙连接以及发送数据的库,里面包含了一个使用的 Demo。
高级语言: Java
项目地址: git://github.com/hgncxzy/BLE-SDK.git
创建时间: 2019-04-02T10:25:22Z
项目社区:https://github.com/hgncxzy/BLE-SDK

开源协议:

下载


BLE-SDK

注意:如果该 SDK 出现无法接收蓝牙从设备返回的数据,请使用我的这个项目:RxAndroidBluetooth 或者我的这个项目:AndroidBleTools

调试工具请参考 AndroidBleTools 或者 Xbluetooth

BLE 蓝牙 SDK 接入教程

1. 简介

通过该蓝牙SDK,可以实现与相关蓝牙硬件模组传感器之间的连接与通信,使用了 kotlin 和 低功耗蓝牙通信等技术。

2. 接入方式

2.1. 引入 aar

baseble-release.aar 导入项目的 libs 文件夹下。

2.2. 修改 build.gradle 配置文件

添加

  1. repositories {
  2. flatDir {
  3. dirs 'libs'
  4. }
  5. }

这个是添加一个本地仓库,并把 libs 目录作为仓库的地址。

2.3. 修改 dependencies 添加依赖

添加一行:

  1. implementation(name:'baseble-release', ext:'aar')

其中 name 就是 libs 目录下 baseble-release.aar 文件名称,ext,就是 baseble-release.aar 的扩展名。构建完后就可以直接使用该库的功能了。

3. 使用介绍

下面介绍蓝牙 SDK 的具体用法。

3.1. 权限配置

蓝牙操作针对 6.0 以下系统需要配置如下权限:

  1. <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
  2. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

而 6.0 以上系统还需要增加模糊定位权限:

  1. <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission-sdk-23>

为了简便操作,库中对蓝牙操作需要的权限都做了相关设置不需要重复设置,但 6.0 以上系统需要动态申请模糊定位权限。

动态申请权限以及蓝牙使能检查的代码如下:

  1. private fun checkPermissionAndBleEnable(){
  2. if (Build.VERSION.SDK_INT >= 6.0) {
  3. PermissionUtil.checkPermission(this,MY_PERMISSION_REQUEST_CONSTANT)
  4. }
  5. if (BleUtil.isSupportBle(this)) {
  6. if (!BleUtil.isBleEnable(this)) {
  7. BleUtil.enableBluetooth(this, REQUEST_ENABLE_BT)
  8. } else {
  9. // todo(逻辑代码)
  10. }
  11. } else {
  12. Toast.makeText(this, "该设备不支持 ble", Toast.LENGTH_SHORT).show()
  13. }
  14. }

其中 PermissionUtil 与 BleUtil 均已经在 SDK 中封装好,直接调用即可。

3.2. 初始化 SDK

在使用该库前需要进行初始化,初始化代码如下所示:

  1. //蓝牙相关配置修改
  2. BaseBle.config()!!
  3. .setscanBleTimeout(-1)//扫描超时时间,这里设置为永久扫描
  4. .setconnectBleTimeout(10 * 1000)//连接超时时间
  5. .setoperateBleTimeout(5 * 1000)//设置数据操作超时时间
  6. .setconnectBleRetryCount(3)//设置连接失败重试次数
  7. .setconnectBleRetryInterval(1000)//设置连接失败重试间隔时间
  8. .setoperateBleRetryCount(1)//设置数据操作失败重试次数
  9. .setoperateBleRetryInterval(1000000000)//设置数据操作失败重试间隔时间
  10. .setmaxConnectBleCount(1)//设置最大连接设备数量
  11. .setBleServiceUUID("0000ffe0-0000-1000-8000-00805f9b34fb")// 服务 UUID
  12. .setBleCharacteristicUUID("0000ffe1-0000-1000-8000-00805f9b34fb")// 特征码 UUID
  13. .setBleDescriptorUUID("0000ffe1-0000-1000-8000-00805f9b34fb") // 描述 UUID
  14. //蓝牙信息初始化,全局唯一,必须在应用初始化时调用
  15. BaseBle.getInstance()!!.init(this)

初始化可以是在 Application 中也可以是在 MainActivity 中,只需要是在使用蓝牙功能前就行。还有需要注意的是,蓝牙配置必须在蓝牙初始化前进行修改,如果默认配置满足要求也可以不修改配置。最后面三个方法中的 UUID 请硬件工程师提供后,修改即可。

3.3. 注册广播

定义广播接收器,接收从 SDK 发过来的广播消息。

3.3.1. 定义广播接收器

定义广播接收器,详见 sample-ble

  1. inner class MyReceiver : BroadcastReceiver(){
  2. @SuppressLint("SetTextI18n")
  3. override fun onReceive(context: Context?, intent: Intent?) {
  4. val action = intent?.action
  5. when {
  6. SEND_CMD_SUCCESS == action -> {
  7. val bundle = intent.getBundleExtra("bundle_data")
  8. val data = bundle.getByteArray("byte_array_data")!!
  9. mSendDataTv?.text = "发送数据:"+HexUtil.parseBytesToHexString(data)
  10. Log.d(TAG,"发送数据成功"+ HexUtil.parseBytesToHexString(data))
  11. }
  12. SEND_CMD_FAILED == action -> Log.d(TAG,"发送数据失败")
  13. RECEIVE_DATA_SUCCESS == action -> {
  14. val bundle = intent.getBundleExtra("bundle_data")
  15. val data = bundle.getByteArray("byte_array_data")!!
  16. mReceiveDataTv?.text ="接收数据:"+ HexUtil.parseBytesToHexString(data)
  17. Log.d(BleConfig.TAG, "正常--收到数据:" + HexUtil.parseBytesToHexString(data))
  18. }
  19. RECEIVE_DATA_FAILED == action -> Log.d(TAG,"")
  20. }
  21. }
  22. }
3.3.2. 注册广播

调用以下方法注册,详见 sample-ble

  1. private fun registerMyReceiver(){
  2. val intentFilter = IntentFilter()
  3. intentFilter.addAction(SEND_CMD_SUCCESS)
  4. intentFilter.addAction(SEND_CMD_FAILED)
  5. intentFilter.addAction(RECEIVE_DATA_SUCCESS)
  6. intentFilter.addAction(RECEIVE_DATA_FAILED)
  7. registerReceiver(myReceiver,intentFilter)
  8. }
3.3.3. 反注册广播
  1. override fun onDestroy() {
  2. super.onDestroy()
  3. unregisterReceiver(myReceiver) // 反注册广播
  4. BleConfig.getInstance()?.deviceMirror?.unregisterNotify(true)
  5. BaseBle.getInstance()!!.disconnect()
  6. BaseBle.getInstance()!!.clear()
  7. }

3.4. 通过 MAC 地址直连

  1. BaseBle.getInstance()!!.connectByMac(deviceMac, object : IConnectCallback {
  2. override fun onConnectSuccess(deviceMirror: DeviceMirror) {
  3. val disposable = Flowable.just(1)
  4. .doOnNext {
  5. Log.d("test","状态:已连接")
  6. mConnStatusTv!!.text = "状态:已连接"
  7. // 更新设备镜像
  8. BleConfig.getInstance()?.deviceMirror = deviceMirror
  9. }
  10. .subscribeOn(AndroidSchedulers.mainThread())
  11. .observeOn(AndroidSchedulers.mainThread())
  12. .subscribe({ }, { throwable -> Log.e("error", ""+throwable.message) })
  13. mCompositeDisposable.add(disposable)
  14. }
  15. override fun onConnectFailure(exception: BleException) {
  16. val disposable = Flowable.just(1)
  17. .doOnNext {
  18. mConnStatusTv!!.text = "状态:连接失败"
  19. Log.e("test","状态:连接失败")
  20. }
  21. .subscribeOn(AndroidSchedulers.mainThread())
  22. .observeOn(AndroidSchedulers.mainThread())
  23. .subscribe({ }, { Log.e("error", ""+exception.description) })
  24. mCompositeDisposable.add(disposable)
  25. }
  26. override fun onDisconnect(isActive: Boolean) {
  27. val disposable = Flowable.just(1)
  28. .doOnNext {
  29. mConnStatusTv!!.text = "状态:断开连接"
  30. Log.e("test","状态:连接失败")
  31. }
  32. .subscribeOn(AndroidSchedulers.mainThread())
  33. .observeOn(AndroidSchedulers.mainThread())
  34. .subscribe({ }, { Log.e("error", "isActive:$isActive") })
  35. mCompositeDisposable.add(disposable)
  36. }
  37. })

在连接成功的回调函数(onConnectSuccess)中,别忘了设置当前连接设备的镜像:

  1. BleConfig.getInstance()?.deviceMirror = deviceMirror

3.5. 发送数据

将发送数据封装成 byte[],调用以下方法即可发送:

  1. Command.write(cmd: ByteArray)

3.6.接收数据

通过广播接收器接收数据,见 3.3.1.

3.5. 断开设备

退出应用时,断开连接。

  1. BaseBle.getInstance()!!.disconnect()

3.6. 释放资源

退出应用时,清除资源。

  1. BaseBle.getInstance()!!.clear()

3.7. 参考资料

  1. 参考了这个 git 项目
  2. Android 蓝牙权限
  3. 关于经典蓝牙和低功耗蓝牙的区别
  4. BLE、BR、EDR 等特定术语解读

3.8. 作者

  1. ID : hgncxzy

  2. 邮箱:hgncxzy@qq.com

  3. 项目地址:https://github.com/hgncxzy/BLE-SDK