• Stars
    star
    102
  • Rank 335,584 (Top 7 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created over 5 years ago
  • Updated over 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

经典(传统)蓝牙快速开发框架,A fast develop frame of classic bluetooth

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?) {
                    [email protected]=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