蓝牙低能耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标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为我们准备好的蓝牙对接类,在设备有蓝牙驱动和硬件的情况下,就会有值。我们首先利用它去检测设备是否有蓝牙驱动,设备蓝牙是否打开等信息,并优化用户体验。满足以上条件后,我们可以开始扫描附近的蓝牙设备。核心代码:
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