flutter_blue_plus 蓝牙BLE插件使用流程

4,361 阅读1分钟

FlutterBluePlus 使用流程

1. 设置扫描结果、扫描状态监听器

late StreamSubscription<List<ScanResult>> _scanRetsSubscription;
late StreamSubscription<bool> _isScanningSubscription;
@override
void initState() {
  super.initState();
  print('_Task2PageState.build 设置监听器');
  _scanRetsSubscription = FlutterBluePlus.scanResults.listen((rets) {
    _scanRets = rets;
    print(rets.toString());
    if(mounted){
      setState(() {
      });
    }
  }, onError: (err){
    print("scan error: $err");
  });
  _isScanningSubscription = FlutterBluePlus.isScanning.listen((event) {
    if(mounted){
      setState(() {
      });
    }
  });
}

2.扫描BLE设备

try{
  var divisor = Platform.isAndroid ? 8:1;
  await FlutterBluePlus.startScan(
    timeout: const Duration(seconds: 15),
    continuousUpdates: true,
    continuousDivisor: divisor
  );
}catch (e){
  print("Stop Scan. Error: $e");
}

3.选择相应的蓝牙设备进行操作

3.1 监听蓝牙连接状态

@override
void initState() {
  super.initState();
  _connectionStateSubscription = device.connectionState.listen((state) async {
    _connectionState = state;
    if(state == BluetoothConnectionState.connected){
      _services = []; //must rediscover services
    }
    if(mounted){
      setState(() {
      });
    }
  });
}

3.2 蓝牙连接

device.disconnect();

3.3 获取服务集

_services = await device.discoverServices();

3.4 从服务集里面找到 特定的服务

3.4.1 从 服务中的特性集里面 找到 读、写特性

3.4.2 订阅读特性,并监听通道信息

@override
void initState() {
  super.initState();
  for (var itemC in service.characteristics) {
    //找到 M220 相应特性
    if(itemC.uuid.str.toLowerCase().compareTo("49535343-8841-43f4-a8d4-ecbe34729bb3") == 0){//字符串相等
      writeC = itemC;
      print('_InteractionPageState.initState 找到写特性');
    }else if(itemC.uuid.str.toLowerCase().compareTo("49535343-1e4d-4bd9-ba61-23c647249616") == 0){
      readC = itemC;
      print('_InteractionPageState.initState 找到读特性');
    }
  }

  readC.setNotifyValue(true); //设置成能通知状态
  rcListen = readC.onValueReceived.listen((value) {//监听返回值
    _value = value;
    print('_InteractionPageState.initState mounted:$mounted rec value:$value');
    if(mounted){
      setState(() {
      });
    }
  });
}

3.4.3 通过写特性向连接设备发送消息

await _writeC?.write(data, withoutResponse: _writeC!.properties.writeWithoutResponse);