一、写在前面的话
本文主要介绍在Flutter环境下开发BLE应用。主要包含以下内容:判断蓝牙是否开启、判断是否有位置权限、扫描设备、
连接设备、监听设备上报的数据(Notify)、向设备发送数据、监听设备的断开等。内容虽然简单,但是很详细。
二、开始
1、使用到的库
flutter_blue: ^0.7.1+1permission_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、判断蓝牙是否开启
@overridevoid 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]);