Andorid 對接BLE藍牙設備(連接篇) End

藍牙低能耗(Bluetooth Low Energy,或稱Bluetooth LEBLE,舊商標Bluetooth Smart)也稱低功耗藍牙,是藍牙技術聯盟設計和銷售的一種個人局域網技術,旨在用於醫療保健、運動健身、信標、安防、家庭娛樂等領域的新興應用。相較經典藍牙,低功耗藍牙旨在保持同等通信範圍的同時顯著降低功耗和成本。

筆者前段時間做了一個功能,需要對接一個藍牙設備,該藍牙設備使用的就是BLE藍牙。這裏給大家分享一下我的實現。這篇文章主要是實現程序與BLE藍牙設備的連接,交互和設置、測試工具等請期待下一篇文章。

如何獲取附近的藍牙設備列表:

 /**
     * 開始掃描 藍牙設備
     */
    fun scanBle() {
        var intent=Intent(RulerService.CONNECTING)
        activity.sendBroadcast(intent)
        val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
        if (bluetoothAdapter == null) {//沒有藍牙驅動
            var intent=Intent(RulerService.FAILURE)
            intent.putExtra("data","本機沒有找到藍牙硬件或驅動!")
            activity.sendBroadcast(intent)
            return
        } else {
            if (!bluetoothAdapter.isEnabled) {//藍牙沒有開啓
                //直接開啓藍牙
                bluetoothAdapter.enable()
                reConnect()
            }else{//藍牙正常,開始掃描
                bluetoothLeScanner = bluetoothAdapter.bluetoothLeScanner
                // Android5.0新增的掃描API,掃描返回的結果更友好,比如BLE廣播數據以前是byte[] scanRecord,而新API幫我們解析成ScanRecord類
                bluetoothLeScanner.startScan(mScanCallback)
                Thread(Runnable {
                    Thread.sleep(5000)
                    bluetoothLeScanner.stopScan(mScanCallback) //停止掃描
                    if (!isSearchDev) {
                        var intent=Intent(RulerService.FAILURE)
                        intent.putExtra("data","未能識別到靠尺設備")
                        activity.sendBroadcast(intent)
                    }
                }).start()
            }
        }
    }

BluetoothAdapter是Android爲我們準備好的藍牙對接類,在設備有藍牙驅動和硬件的情況下,就會有值。我們首先利用它去檢測設備是否有藍牙驅動,設備藍牙是否打開等信息,並優化用戶體驗。滿足以上條件後,我們可以開始掃描附近的藍牙設備。核心代碼:

 bluetoothLeScanner = bluetoothAdapter.bluetoothLeScanner
 bluetoothLeScanner.startScan(mScanCallback)

在源碼中,筆者做了一個查詢5秒,未能查詢到指定藍牙設備時,停職掃描並且發送查詢失敗廣播的線程。如果你是想獲取全部列表,可以自行修改。
mScanCallback是我們的結果返回類,開始掃描和停止掃描都需要用到它。

 private val mScanCallback = @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    object : ScanCallback() {
        // 掃描Callback
        @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
        override fun onScanResult(callbackType: Int, result: ScanResult) {
            val dev = BleDev(result.device, result)
            Log.i("wsy",dev.dev.name?:"")
            if (dev.dev.name == RulerService.DEVNAME) {
                rulerService.putExtra("dev", dev.dev)
                activity.startService(rulerService)
                isSearchDev=true
                bluetoothLeScanner.stopScan(this) //停止掃描
            }
        }
    }

callback中會在藍牙掃描開啓後,持續的返回查詢到的藍牙設備信息,由於筆者只需要連接特定名字的指定藍牙設備,所以用名字做了判斷,成功查詢到時,關閉藍牙掃描並且將設備信息發送到筆者創建的藍牙交互服務中,這個會在下篇文章講到。

到此,我們就獲取到了附近所有的使用BLE藍牙的設備的設備信息。至於如何交互?如何篩選BLE藍牙設備的指定權限服務?筆者會在下篇一一道來,並且會上傳一個筆者做的藍牙測試工具。感謝閱讀

End

筆者的Github Blog,希望各位大大提意見,點個star,謝謝
傳送門:WusyBlog

求互粉互贊,互贊所有文章可以私聊我。哈哈,希望我們的原創文章能讓更多朋友看到,一起變強。

筆者新開通了微信公衆號——飲水思源|wusy 計劃持續運營,每日爲您分享Android乾貨、原創文章。微信掃描下方的二維碼關注我,開發學習路上不迷路。謝謝各位


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章