Flutter 鸿蒙蓝牙设备扫描实现:蓝牙权限与设备发现

欢迎加入开源鸿蒙跨平台社区! https://openharmonycrossplatform.csdn.net

效果展示

在这里插入图片描述
在这里插入图片描述

蓝牙扫描演示

扫描功能

  • 附近设备发现
  • 设备信息显示
  • 信号强度指示
  • 设备类型识别

连接管理

  • 设备连接
  • 连接状态显示
  • 断开连接
  • 已连接设备列表

设备信息展示

设备详情

  • 设备名称
  • MAC地址
  • 设备类型
  • 信号强度 (RSSI)

实现步骤

1. 蓝牙管理器实现

核心类设计

class BluetoothManager {
  static final BluetoothManager _instance = BluetoothManager._internal();
  factory BluetoothManager() => _instance;
  
  final FlutterBluePlus _bluetooth = FlutterBluePlus.instance;
  
  Future<bool> isAvailable() async {
    return await _bluetooth.isAvailable;
  }
  
  Future<bool> isEnabled() async {
    return await _bluetooth.isOn;
  }
  
  Stream<ScanResult> startScan() {
    _bluetooth.startScan(timeout: Duration(seconds: 10));
    return _bluetooth.scanResults;
  }
}

2. 权限处理

蓝牙权限

Future<bool> requestBluetoothPermission() async {
  if (Platform.isAndroid) {
    final status = await Permission.bluetoothScan.request();
    if (!status.isGranted) return false;
    
    final status2 = await Permission.bluetoothConnect.request();
    if (!status2.isGranted) return false;
  }
  
  return true;
}

3. 设备扫描

扫描实现

StreamSubscription? _scanSubscription;

void startScanning() {
  setState(() {
    isScanning = true;
    devices.clear();
  });
  
  _scanSubscription = FlutterBluePlus.scanResults.listen((results) {
    for (var result in results) {
      addOrUpdateDevice(result);
    }
  });
  
  FlutterBluePlus.startScan(timeout: Duration(seconds: 10));
}

4. 设备连接

连接管理

Future<void> connectToDevice(BluetoothDevice device) async {
  try {
    await device.connect(timeout: Duration(seconds: 10));
    
    setState(() {
      connectedDevices.add(device);
    });
    
    // 发现服务
    List<BluetoothService> services = await device.discoverServices();
    
  } catch (e) {
    print('连接失败: $e');
  }
}

功能特性

1. 设备发现

扫描控制

void startScan() {
  FlutterBluePlus.startScan(
    timeout: Duration(seconds: 10),
    allowDuplicates: false,
  );
}

void stopScan() {
  FlutterBluePlus.stopScan();
}

2. 设备信息

设备模型

class BluetoothDevice {
  final String name;
  final String address;
  final String type;
  final int rssi;
  final bool isConnectable;
  bool isConnected;
  
  BluetoothDevice({
    required this.name,
    required this.address,
    required this.type,
    required this.rssi,
    this.isConnectable = true,
    this.isConnected = false,
  });
}

3. 信号强度

RSSI显示

Widget buildSignalStrength(int rssi) {
  Color color;
  IconData icon;
  
  if (rssi > -50) {
    color = Colors.green;
    icon = Icons.signal_cellular_alt;
  } else if (rssi > -70) {
    color = Colors.lightGreen;
    icon = Icons.signal_cellular_alt_2_bar;
  } else if (rssi > -85) {
    color = Colors.orange;
    icon = Icons.signal_cellular_alt_1_bar;
  } else {
    color = Colors.red;
    icon = Icons.signal_cellular_0_bar;
  }
  
  return Row(
    children: [
      Icon(icon, color: color),
      Text('$rssi dBm', style: TextStyle(color: color)),
    ],
  );
}

4. 设备类型

类型识别

IconData getDeviceIcon(String type) {
  switch (type) {
    case 'Phone':
      return Icons.phone_android;
    case 'Computer':
      return Icons.computer;
    case 'Headphone':
      return Icons.headphones;
    case 'Watch':
      return Icons.watch;
    case 'Speaker':
      return Icons.speaker;
    case 'Fitness':
      return Icons.fitness_center;
    default:
      return Icons.devices;
  }
}

使用说明

基本使用

  1. 检查蓝牙状态

    • 检查蓝牙是否可用
    • 检查蓝牙是否开启
    • 请求必要权限
  2. 扫描设备

    • 点击扫描按钮
    • 等待扫描完成
    • 查看设备列表
  3. 连接设备

    • 选择目标设备
    • 点击连接按钮
    • 等待连接成功

高级功能

设备过滤

List<BluetoothDevice> filterDevices(
  List<BluetoothDevice> devices, {
  String? nameFilter,
  int? minRssi,
}) {
  return devices.where((device) {
    if (nameFilter != null && !device.name.contains(nameFilter)) {
      return false;
    }
    if (minRssi != null && device.rssi < minRssi) {
      return false;
    }
    return true;
  }).toList();
}

技术要点

1. 蓝牙状态

状态监听

StreamSubscription? _stateSubscription;

void listenToBluetoothState() {
  _stateSubscription = FlutterBluePlus.state.listen((state) {
    switch (state) {
      case BluetoothState.on:
        onBluetoothEnabled();
        break;
      case BluetoothState.off:
        onBluetoothDisabled();
        break;
      default:
        break;
    }
  });
}

2. 连接状态

状态管理

device.state.listen((state) {
  if (state == BluetoothDeviceState.connected) {
    onDeviceConnected(device);
  } else if (state == BluetoothDeviceState.disconnected) {
    onDeviceDisconnected(device);
  }
});

3. 性能优化

扫描优化

FlutterBluePlus.startScan(
  timeout: Duration(seconds: 10),
  allowDuplicates: false,
  filterDuplicates: true,
);

最佳实践

1. 权限处理

Android权限

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

2. 错误处理

异常捕获

try {
  await device.connect();
} on PlatformException catch (e) {
  if (e.code == 'connect_failed') {
    showError('连接失败,请重试');
  }
} catch (e) {
  showError('未知错误: $e');
}

3. 资源释放

及时清理


void dispose() {
  _scanSubscription?.cancel();
  _stateSubscription?.cancel();
  
  for (var device in connectedDevices) {
    device.disconnect();
  }
  
  super.dispose();
}

应用场景

1. 智能家居

设备配对

void pairSmartDevice(BluetoothDevice device) async {
  await device.connect();
  
  final service = await device.discoverServices();
  // 配对逻辑
}

2. 健康设备

数据同步

void syncHealthData(BluetoothDevice device) async {
  final heartRate = await readHeartRate(device);
  final steps = await readSteps(device);
  
  saveToDatabase(heartRate, steps);
}

3. 音频设备

音频连接

void connectAudioDevice(BluetoothDevice device) async {
  await device.connect();
  
  // 切换音频输出
  AudioManager.setOutput(device);
}

总结

Flutter鸿蒙蓝牙设备扫描功能实现了完整的蓝牙设备管理解决方案,包括:

  • ✅ 蓝牙权限处理
  • ✅ 设备扫描发现
  • ✅ 设备连接管理
  • ✅ 信号强度显示
  • ✅ 设备类型识别

该功能为Flutter for OpenHarmony应用提供了专业的蓝牙设备扫描能力,适用于智能家居、健康设备等场景。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐