Flutter蓝牙通信插件flutter_blue的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter蓝牙通信插件flutter_blue的使用

FlutterBlue是一个用于Flutter应用的蓝牙插件,支持跨平台(iOS和Android)的低功耗蓝牙(BLE)操作。本文将介绍如何使用flutter_blue插件进行蓝牙设备的扫描、连接、服务发现以及读写特性等操作。

Alpha版本警告

此库正在积极开发中,并且API可能会在发展过程中发生变化。请确保准备应对可能的破坏性变更。并且该插件必须在真实设备上测试。

跨平台蓝牙LE功能

通过FlutterBlue实例,您可以扫描并连接附近的设备(BluetoothDevice)。一旦连接到设备,可以通过BluetoothDevice对象发现服务(BluetoothService)、特征(BluetoothCharacteristic)和描述符(BluetoothDescriptor),然后直接与这些特征和描述符进行交互。

设置

更改Android的minSdkVersion

由于flutter_blue仅兼容19及以上版本的Android SDK,请在android/app/build.gradle文件中修改如下:

android {
  defaultConfig {
     minSdkVersion: 19
  }
}

添加蓝牙权限

需要添加蓝牙和位置访问权限:

Android

android/app/src/main/AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

iOS

ios/Runner/Info.plist中添加以下权限:

<dict>
    <key>NSBluetoothAlwaysUsageDescription</key>
    <string>Need BLE permission</string>
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>Need BLE permission</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>Need Location permission</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Need Location permission</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Need Location permission</string>
</dict>

使用示例

获取FlutterBlue实例

FlutterBlue flutterBlue = FlutterBlue.instance;

扫描设备

// 开始扫描
flutterBlue.startScan(timeout: Duration(seconds: 4));

// 监听扫描结果
var subscription = flutterBlue.scanResults.listen((results) {
    for (ScanResult r in results) {
        print('${r.device.name} found! rssi: ${r.rssi}');
    }
});

// 停止扫描
flutterBlue.stopScan();

连接到设备

await device.connect();
// 断开连接
device.disconnect();

发现服务

List<BluetoothService> services = await device.discoverServices();
services.forEach((service) {
    // 处理每个服务
});

读写特征值

// 读取所有特征值
var characteristics = service.characteristics;
for(BluetoothCharacteristic c in characteristics) {
    List<int> value = await c.read();
    print(value);
}

// 写入一个特征值
await c.write([0x12, 0x34]);

设置通知并监听变化

await characteristic.setNotifyValue(true);
characteristic.value.listen((value) {
    // 处理新值
});

示例完整代码

以下是完整的示例程序,展示了如何构建用户界面来管理蓝牙设备的搜索、连接和服务探索等功能。

import 'dart:async';
import 'dart:math';

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

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

class FlutterBlueApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      color: Colors.lightBlue,
      home: StreamBuilder<BluetoothState>(
          stream: FlutterBlue.instance.state,
          initialData: BluetoothState.unknown,
          builder: (c, snapshot) {
            final state = snapshot.data;
            if (state == BluetoothState.on) {
              return FindDevicesScreen();
            }
            return BluetoothOffScreen(state: state);
          }),
    );
  }
}

// 其他部分省略,参照提供的示例代码实现...

请注意,上述代码片段是简化版,具体实现细节可以参考完整的示例代码


更多关于Flutter蓝牙通信插件flutter_blue的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter蓝牙通信插件flutter_blue的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter蓝牙通信插件flutter_blue的代码示例。这个示例展示了如何扫描附近的蓝牙设备、连接到某个设备、发现服务和特征值,以及读写特征值。

首先,确保你已经在pubspec.yaml文件中添加了flutter_blue依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_blue: ^0.13.0  # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤进行蓝牙通信:

1. 初始化FlutterBlue实例

在你的主文件(通常是main.dart)中,初始化FlutterBlue实例:

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: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Blue Example'),
        ),
        body: BluetoothScreen(),
      ),
    );
  }
}

class BluetoothScreen extends StatefulWidget {
  @override
  _BluetoothScreenState createState() => _BluetoothScreenState();
}

class _BluetoothScreenState extends State<BluetoothScreen> {
  final FlutterBlue flutterBlue = FlutterBlue.instance;

  @override
  void initState() {
    super.initState();
    flutterBlue.startScan(timeout: Duration(seconds: 4));
    flutterBlue.scanResults.listen((results) {
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ListTile(
          leading: Icon(Icons.bluetooth_searching),
          title: Text('Scanning for devices...'),
          subtitle: Text('${flutterBlue.state}'),
        ),
        Expanded(
          child: DeviceList(flutterBlue.scanResults.value),
        ),
      ],
    );
  }
}

class DeviceList extends StatelessWidget {
  final List<ScanResult> devices;

  DeviceList(this.devices);

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: devices.map((device) => ListTile(
        leading: (device.advertisementData.icon != null)
            ? Image.memory(device.advertisementData.icon)
            : Icon(Icons.device_unknown),
        title: Text(device.device.name ?? 'Unknown device'),
        subtitle: Text(device.device.address.toString()),
        trailing: IconButton(
          icon: Icon(Icons.bluetooth_connected),
          onPressed: () {
            // Connect to the device
            connectToDevice(device.device);
          },
        ),
      )).toList(),
    );
  }

  void connectToDevice(BluetoothDevice device) {
    device.connect().then((_) {
      // Discover services after connecting
      device.discoverServices().then((services) {
        // Here you can find services and characteristics
        services.forEach((service) {
          service.characteristics.forEach((characteristic) {
            // You can read or write to characteristics here
            characteristic.read().then((value) {
              // Handle the value read from characteristic
            });

            characteristic.write(Uint8List.fromList([/* byte data */])).then((_) {
              // Handle the write operation completion
            });
          });
        });
      });
    }).catchError((error) {
      // Handle connection error
    });
  }
}

2. 处理权限和状态管理

在实际应用中,你可能需要处理权限请求和更复杂的状态管理。例如,在Android上,你可能需要请求位置权限,因为蓝牙扫描需要使用位置信息。

3. 注意事项

  • 确保在AndroidManifest.xml中添加了必要的权限,例如ACCESS_FINE_LOCATIONBLUETOOTH等。
  • 在iOS上,你需要在Info.plist中添加蓝牙使用描述,并处理蓝牙权限请求。
  • 考虑到蓝牙操作的异步性,使用Futureasync/await来管理异步操作。

4. 运行和调试

将设备连接到你的开发机器,运行Flutter应用,然后观察控制台输出以调试任何潜在的问题。

以上代码提供了一个基本框架,展示了如何使用flutter_blue进行蓝牙设备扫描、连接、服务发现和特征值读写。根据你的具体需求,你可以进一步扩展和修改这些功能。

回到顶部