前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Andorid 对接BLE蓝牙设备(连接篇)

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

作者头像
饮水思源为名
发布2019-10-16 11:18:38
1.5K0
发布2019-10-16 11:18:38
举报
文章被收录于专栏:Android小菜鸡Android小菜鸡

蓝牙低能耗(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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.10.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何获取附近的蓝牙设备列表:
  • End
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档