一款經典藍牙快速開發框架

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

相關文章
相關標籤/搜索