一、写在前面的话
本文主要介绍在Flutter环境下开发BLE应用。主要包含以下内容:判断蓝牙是否开启、判断是否有位置权限、扫描设备、
连接设备、监听设备上报的数据(Notify)、向设备发送数据、监听设备的断开等。内容虽然简单,但是很详细。
二、开始
1、使用到的库
flutter_blue: ^0.7.1+1
permission_handler: "^3.2.0" # 权限
众所周知,Flutter要使用原生的能力,就需要有原生库的支持,这里我们使用了flutter_blue来开发跟BLE相关的功能,permission_handler来开发权限检测以及申请权限的功能。在使用flutter_blue开启扫描的时候,插件会弹出系统的权限申请窗口,但是点击授权以后报了一个空指针,可能是插件存在的一个BUG,所以这里我们用permission_handler插件来处理权限相关的问题。(友情提示:在Android上扫描Ble需要位置权限)
2、flutter_blue的用法
import 'package:flutter_blue/flutter_blue.dart';
FlutterBlue flutterBlue = FlutterBlue.instance;
导包和初始化。
3、判断蓝牙是否开启
@override
void initState() {
super.initState();
flutterBlue.state.listen((state){
if(state == BluetoothState.on){
print('蓝牙状态为开启');
isBleOn = true;
}else if(state == BluetoothState.off){
print('蓝牙状态为关闭');
isBleOn = false;
}
});
}
在路由初始化的时候开启对蓝牙状态的监听。
if(!isBleOn){
ToastUtils.toast(context, "手机蓝牙未打开,请打开后再扫描设备");
return;
}
在开始之前对蓝牙开启状态进行判断。
4、判断位置权限
PermissionUtils.checkPermissions(PermissionGroup.location).then((v) {
if (v) {
Navigator.pushNamed(context, "/device_page");
} else {
PermissionUtils.showDialog(context, "提示", "扫描蓝牙需要位置权限", () async {
Navigator.pop(context);
await PermissionHandler()
.requestPermissions([PermissionGroup.location]);