一款经典蓝牙快速开发框架

EasyBluetoothFrame

这是一个适用于经典蓝牙通信的快速开发框架。html

框架适用范围

本框架只适用于支持蓝牙3.0协议的设备进行数据链接传输,也就是一般说的经典蓝牙,一般手机与手机之间的链接都属于经典蓝牙模式范畴,而通常链接外设耳机等设备,大多 属于BLE蓝牙(低功耗蓝牙),这两种蓝牙除了名字有相同以外,通讯方式、原理、协议彻底不同。android

导入

version=git

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}
dependencies {
      implementation 'com.github.AlexLiuSheng:EasyBluetoothFrame:version'
}

复制代码

蓝牙链接流程


经典蓝牙采用C/S模式,因此同一个设备,只能做为Client端或者Server端的其中一个,github

  • 若是设备充当Server端,那么监听流程以下:api

    • 蓝牙权限获取
    • 设置设备可被发现
    • 设置监听UUID
    • 注册为Server
    • 等待配对、链接、传输数据
  • 若是设备充当Client,本框架蓝牙的链接流程通常为:bash

    • 蓝牙权限获取
    • 扫描设备
    • 配对、绑定设备
    • 创建链接
    • 传输数据

蓝牙权限获取

可使用库BluetoothPermissionHandler来辅助获取蓝牙权限或者开发者本身动态获取权限,BluetoothPermissionHandler用法以下:app

private val permissionCallBack=BluetoothPermissionHandler(this,this)
  override fun onCreate(savedInstanceState: Bundle?) {
     permissionCallBack.start();
  }
  override fun permissionFailed() {
  }
  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
      super.onActivityResult(requestCode, resultCode, data)
      permissionCallBack.onActivityResult(requestCode, resultCode, data)
  }
override  fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults)
      permissionCallBack.onRequestPermissionsResult(requestCode, permissions, grantResults)
  }
  override fun onBlueToothEnabled() {


  }
复制代码

初始化以及相关方法


  • 初始化操做能够放到任何地方 BleManager.getInstance().init(application)
  • 使用前台service传输数据 BleManager.getInstance().setForegroundService(true)
  • 若是使用ForegroundService模式,可自定义通知栏 BleManager.getInstance().setNotification(notification)
  • 获取全部配对过的设备 BleManager.getInstance().getPairedDevices()

链接

无论是服务端仍是客户端都须要获取蓝牙权限,而且进行初始化BleManager。若是使用BluetoothPermissionHandler,应该在onBlueToothEnabled回调中作 扫描链接等操做。框架

设置为Server端


设置UUID

默认使用00001101-0000-1000-8000-00805F9B34FB,固然能够自定义maven

BleManager.getInstance().setConnectionUUID()
复制代码

设置设备可被扫描发现

传入参数为可被发现的时间,单位秒ide

BleManager.getInstance().enableDiscoverable(300)
复制代码

注册为Server

注册为Server端以后,当有设备链接成功后,会回调connectSuccess方法,咱们能够保存回调回来的 Connect为全局,方便读写操做

BleManager.getInstance().registerServerConnection(object: ConnectResultlistner {
                override fun connectSuccess(connect: Connect?) {
                    this@MainActivity.connect=connect
                    read()
                }

                override fun connectFailed(e: Exception?) {

                }

            })
复制代码

设置为Client端


扫描设备

配置扫描时间,而后扫描,在扫描回调中,一般操做是将回调的蓝牙设备添加到列表并显示,须要注意的是,回调的蓝牙设备可能会重复,所以须要手动去重

//配置扫描时间
 val config=ScanConfig(5000)
 BleManager.getInstance().scan(config,object :ScanResultListener{
                override fun onDeviceFound(device: BluetoothDevice?) {
                  
                }

                override fun onFinish() {
                }

                override fun onError() {
                }
            })
复制代码

设置UUID

默认使用00001101-0000-1000-8000-00805F9B34FB,固然能够自定义

BleManager.getInstance().setConnectionUUID()
复制代码

配对(若是已经配对,跳过此步)

若是没有配对,须要先进行设备配对,若是已经配对,那么能够直接进行链接操做 判断是否已经配对,能够用BleManager.getInstance().getPairedDevices()返回的集合进行判断 配对代码以下:

BleManager.getInstance().pin(data[p1],object:PinResultListener{
                    override fun paired(device: BluetoothDevice?) {
                        connect(context,data[p1])
                    }

                    override fun startPair(device: BluetoothDevice?) {
                        super.startPair(device)
                    }

                    override fun pairing(device: BluetoothDevice?) {
                        super.pairing(device)
                    }

                    override fun pairFailed(device: BluetoothDevice?) {
                        super.pairFailed(device)
                    }
                })
复制代码

链接Server

当有设备链接成功后,会回调connectSuccess方法,咱们能够保存回调回来的 Connect为全局,方便读写操做

BleManager.getInstance().connect(d, object : ConnectResultlistner {
        override fun connectSuccess(connect: Connect?) {
        }

        override fun connectFailed(e: Exception?) {
        }
    })
复制代码

传输数据

connect?.read(object: TransferProgressListener {
            override fun transferSuccess(bytes: ByteArray?) {
                bytes?.let { it1 ->
                    tvReceive.text=String(it1)
                }
                CLog.e("read string")
            }
            override fun transferFailed(msg:String) {
                t(msg)
            }
            override fun transfering(progress: Int) {
                CLog.e("read progress:$progress")
            }
        })
复制代码

connect?.write(text.toByteArray(), object : TransferProgressListener {
            override fun transferSuccess(bytes: ByteArray?) {

            }

            override fun transferFailed(msg:String) {
                t(msg)
            }

            override fun transfering(progress: Int) {
                CLog.e("write progress:$progress")
            }
        })
复制代码

断开链接

BleManager.getInstance().destory()
复制代码

API Function

全部功能接口

void init(Context context);
    void setConnectionUUID(String uuid);

    boolean isSupported();

    void setResultListener(ScanResultListener resultListener);

    Set<BluetoothDevice> getPairedDevices();

    void scan(ScanConfig scanConfig, ScanResultListener scanResultListener);

    void stopSearch();

    void connect(BluetoothDevice device, ConnectResultlistner connectResultlistner);
    void destory();
    void pin(BluetoothDevice device, PinResultListener resultListener);
    void cancelPin(BluetoothDevice device, ResultListener resultListener);
    void setServerConnectResultListener(ConnectResultlistner connectResultListener);
    void registerServerConnection(ConnectResultlistner connectResultListener);

    void setForegroundService(boolean foregroundService);
    void setNotification(Notification notification);
    void enableDiscoverable(long time);
复制代码

demo

TODO

  • 传输数据进度完善

Last

  • 详细适用请看demo,初版可能还有些不完善,持续完善中
  • 欢迎PR或Issues
  • 若是使用过程当中以为还不错,请不要吝啬你的star,哈哈。

License


Apache 2.0

相关文章
相关标签/搜索