Andorid 对接BLE蓝牙设备(连接篇)

2019-10-16 11:18:38 浏览数 (1)

蓝牙低能耗(Bluetooth Low Energy,或称Bluetooth LEBLE,旧商标Bluetooth Smart)也称低功耗蓝牙,是蓝牙技术联盟设计和销售的一种个人局域网技术,旨在用于医疗保健、运动健身、信标、安防、家庭娱乐等领域的新兴应用。相较经典蓝牙,低功耗蓝牙旨在保持同等通信范围的同时显著降低功耗和成本。

笔者前段时间做了一个功能,需要对接一个蓝牙设备,该蓝牙设备使用的就是BLE蓝牙。这里给大家分享一下我的实现。这篇文章主要是实现程序与BLE蓝牙设备的连接,交互和设置、测试工具等请期待下一篇文章。

如何获取附近的蓝牙设备列表:

代码语言:javascript复制
 /**
     * 开始扫描 蓝牙设备
     */
    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为我们准备好的蓝牙对接类,在设备有蓝牙驱动和硬件的情况下,就会有值。我们首先利用它去检测设备是否有蓝牙驱动,设备蓝牙是否打开等信息,并优化用户体验。满足以上条件后,我们可以开始扫描附近的蓝牙设备。核心代码:

代码语言:javascript复制
 bluetoothLeScanner = bluetoothAdapter.bluetoothLeScanner
 bluetoothLeScanner.startScan(mScanCallback)

在源码中,笔者做了一个查询5秒,未能查询到指定蓝牙设备时,停职扫描并且发送查询失败广播的线程。如果你是想获取全部列表,可以自行修改。 mScanCallback是我们的结果返回类,开始扫描和停止扫描都需要用到它。

代码语言:javascript复制
 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

0 人点赞