Flutter 蓝牙智能硬件操作示例

"我在用Flutter开发一个需要操作蓝牙智能硬件的App,目前遇到几个问题想请教:

  1. 在Android和iOS上实现蓝牙连接和通信的最佳实践有哪些?
  2. 有没有推荐的Flutter蓝牙插件,flutter_blue_plus和flutter_reactive_ble哪个更稳定?
  3. 如何处理不同蓝牙设备的协议差异,特别是数据传输格式不统一的情况?
  4. 在断开重连时经常出现设备无法识别的问题,该怎么优化重连机制?希望有实际项目经验的大神能分享下解决方案。"
3 回复

以下是一个简单的Flutter蓝牙智能硬件操作示例:

  1. 添加依赖:
dependencies:
  flutter_blue: ^0.8.0
  1. 请求权限: 在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  1. 示例代码:
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BluetoothPage(),
    );
  }
}

class BluetoothPage extends StatefulWidget {
  @override
  _BluetoothPageState createState() => _BluetoothPageState();
}

class _BluetoothPageState extends State<BluetoothPage> {
  FlutterBlue flutterBlue = FlutterBlue.instance;
  List<ScanResult> devicesList = [];

  @override
  void initState() {
    super.initState();
    startScan();
  }

  void startScan() async {
    flutterBlue.startScan(timeout: Duration(seconds: 4));
    flutterBlue.scanResults.listen((results) {
      setState(() {
        devicesList = results;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('蓝牙设备扫描')),
      body: ListView.builder(
        itemCount: devicesList.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(devicesList[index].device.name),
            subtitle: Text(devicesList[index].device.id.toString()),
          );
        },
      ),
    );
  }
}

该示例展示了如何扫描附近的蓝牙设备并列出设备名称和ID。

更多关于Flutter 蓝牙智能硬件操作示例的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


以下是一个简单的Flutter蓝牙智能硬件操作示例,使用flutter_blue插件:

import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BluetoothPage(),
    );
  }
}

class BluetoothPage extends StatefulWidget {
  @override
  _BluetoothPageState createState() => _BluetoothPageState();
}

class _BluetoothPageState extends State<BluetoothPage> {
  FlutterBlue flutterBlue = FlutterBlue.instance;
  List<ScanResult> scanResults = [];

  @override
  void initState() {
    super.initState();
    startScan();
  }

  void startScan() async {
    flutterBlue.startScan(timeout: Duration(seconds: 4));
    flutterBlue.scanResults.listen((results) {
      setState(() {
        scanResults = results;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('蓝牙设备扫描')),
      body: ListView.builder(
        itemCount: scanResults.length,
        itemBuilder: (context, index) {
          var device = scanResults[index].device;
          return ListTile(
            title: Text(device.name.isEmpty ? '未知设备' : device.name),
            subtitle: Text(device.id.toString()),
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (_) => DevicePage(device: device),
                ),
              );
            },
          );
        },
      ),
    );
  }
}

class DevicePage extends StatefulWidget {
  final BluetoothDevice device;

  DevicePage({required this.device});

  @override
  _DevicePageState createState() => _DevicePageState();
}

class _DevicePageState extends State<DevicePage> {
  BluetoothDevice? device;
  BluetoothConnection? connection;

  @override
  void initState() {
    super.initState();
    connectToDevice();
  }

  Future<void> connectToDevice() async {
    connection = await BluetoothConnection.toAddress(widget.device.id.toString());
    setState(() {
      device = widget.device;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('${device?.name}')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            if (connection != null && connection!.isConnected) {
              connection!.input?.listen(null).onDone(() {
                print('Device disconnected');
              });
            }
          },
          child: Text('连接'),
        ),
      ),
    );
  }
}

此代码实现了蓝牙设备的扫描和连接功能。注意需添加flutter_blue依赖并在Android和iOS中进行相关权限配置。

以下是一个简单的 Flutter 蓝牙操作示例,使用 flutter_blue_plus 插件进行蓝牙设备连接和数据读写:

import 'package:flutter_blue_plus/flutter_blue_plus.dart';

// 1. 初始化蓝牙适配器
FlutterBluePlus flutterBlue = FlutterBluePlus.instance;

// 2. 扫描设备
void scanDevices() {
  flutterBlue.startScan(timeout: Duration(seconds: 4));
  flutterBlue.scanResults.listen((results) {
    for (ScanResult result in results) {
      print('发现设备: ${result.device.name} (${result.device.id})');
    }
  });
}

// 3. 连接设备
Future connectToDevice(BluetoothDevice device) async {
  await device.connect(autoConnect: false);
  print('已连接到 ${device.name}');
  
  // 4. 发现服务
  List<BluetoothService> services = await device.discoverServices();
  for (BluetoothService service in services) {
    print('发现服务: ${service.uuid}');
    
    // 5. 获取特征值
    for (BluetoothCharacteristic characteristic in service.characteristics) {
      print('特征值: ${characteristic.uuid}');
      
      // 6. 读取数据示例
      if(characteristic.properties.read) {
        List<int> value = await characteristic.read();
        print('读取值: $value');
      }
      
      // 7. 写入数据示例
      if(characteristic.properties.write) {
        await characteristic.write([0x12, 0x34]);
        print('写入成功');
      }
    }
  }
}

// 使用示例
void main() async {
  runApp(MyApp());
  scanDevices();
  
  // 假设已经通过扫描获得了设备对象
  BluetoothDevice targetDevice = ...; 
  await connectToDevice(targetDevice);
}

注意事项:

  1. 需要在 pubspec.yaml 添加依赖:
dependencies:
  flutter_blue_plus: ^1.0.0
  1. Android需要BLUETOOTH和BLUETOOTH_ADMIN权限
  2. iOS需要在Info.plist添加NSBluetoothAlwaysUsageDescription

完整实现还需要处理设备断开、错误回调等情况,以上是基础操作的核心代码片段。

回到顶部