Skip to content

AlexLiuSheng/EasyBluetoothFrame

Repository files navigation

EasyBluetoothFrame

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

框架适用范围

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

导入

version=

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

蓝牙连接流程


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

  • 如果设备充当Server端,那么监听流程如下:

    • 蓝牙权限获取
    • 设置设备可被发现
    • 设置监听UUID
    • 注册为Server
    • 等待配对、连接、传输数据
  • 如果设备充当Client,本框架蓝牙的连接流程一般为:

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

蓝牙权限获取

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

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,当然可以自定义

BleManager.getInstance().setConnectionUUID()

设置设备可被扫描发现

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

  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?) {
        }
    })

传输数据

NewFeature自定义一个完整数据包包头、包尾

   connect?.setReadPacketVerifyListener(object : PacketDefineListener {
            override fun getPacketStart(): ByteArray {
                return start

            }

            override fun getPacketEnd(): ByteArray {
                return end

            }
        })

  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