Flutter USB通信插件quick_usb的使用

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

Flutter USB通信插件quick_usb的使用

quick_usb 是一个跨平台(Android/Windows/macOS/Linux)的USB插件,适用于Flutter应用。本文将介绍如何使用这个插件进行基本的USB设备操作,包括列出设备、打开/关闭设备、获取/设置配置等。

使用示例

以下是一个完整的Flutter应用程序示例,展示了如何使用quick_usb插件进行USB通信。

主要功能

  • 列出连接的USB设备
  • 获取设备描述信息
  • 打开和关闭设备
  • 获取和设置设备配置
  • 声明和释放接口
  • 进行批量数据传输

完整代码示例

import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';

import 'package:convert/convert.dart';
import 'package:flutter/material.dart';
import 'package:quick_usb/quick_usb.dart';

void main() {
  runApp(const MyHome());
}

class MyHome extends StatelessWidget {
  const MyHome({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: const MyApp(),
      ),
    );
  }
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return _buildColumn();
  }

  void log(String info) {
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(info)));
  }

  Widget _buildColumn() {
    return Column(
      children: [
        _init_exit(),
        _getDeviceList(),
        _getDevicesWithDescription(),
        _getDeviceDescription(),
        if (Platform.isLinux) _setAutoDetachKernelDriver(),
        _has_request(),
        _open_close(),
        _get_set_configuration(),
        _claim_release_interface(),
        _bulk_transfer(),
      ],
    );
  }

  // 初始化和退出
  Widget _init_exit() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        ElevatedButton(
          child: const Text('init'),
          onPressed: () async {
            var init = await QuickUsb.init();
            log('init $init');
          },
        ),
        ElevatedButton(
          child: const Text('exit'),
          onPressed: () async {
            await QuickUsb.exit();
            log('exit');
          },
        ),
      ],
    );
  }

  List<UsbDevice>? _deviceList;

  // 获取设备列表
  Widget _getDeviceList() {
    return ElevatedButton(
      child: const Text('getDeviceList'),
      onPressed: () async {
        _deviceList = await QuickUsb.getDeviceList();
        log('deviceList $_deviceList');
      },
    );
  }

  // 检查和请求权限
  Widget _has_request() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        ElevatedButton(
          child: const Text('hasPermission'),
          onPressed: () async {
            var hasPermission = await QuickUsb.hasPermission(_deviceList!.first);
            log('hasPermission $hasPermission');
          },
        ),
        ElevatedButton(
          child: const Text('requestPermission'),
          onPressed: () async {
            await QuickUsb.requestPermission(_deviceList!.first);
            log('requestPermission');
          },
        ),
      ],
    );
  }

  // 打开和关闭设备
  Widget _open_close() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        ElevatedButton(
          child: const Text('openDevice'),
          onPressed: () async {
            var openDevice = await QuickUsb.openDevice(_deviceList!.first);
            log('openDevice $openDevice');
          },
        ),
        ElevatedButton(
          child: const Text('closeDevice'),
          onPressed: () async {
            await QuickUsb.closeDevice();
            log('closeDevice');
          },
        ),
      ],
    );
  }

  UsbConfiguration? _configuration;

  // 获取和设置配置
  Widget _get_set_configuration() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        ElevatedButton(
          child: const Text('getConfiguration'),
          onPressed: () async {
            _configuration = await QuickUsb.getConfiguration(0);
            log('getConfiguration $_configuration');
          },
        ),
        ElevatedButton(
          child: const Text('setConfiguration'),
          onPressed: () async {
            var setConfiguration =
                await QuickUsb.setConfiguration(_configuration!);
            log('setConfiguration $setConfiguration');
          },
        ),
      ],
    );
  }

  // 声明和释放接口
  Widget _claim_release_interface() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        ElevatedButton(
          child: const Text('claimInterface'),
          onPressed: () async {
            var claimInterface =
                await QuickUsb.claimInterface(_configuration!.interfaces[0]);
            log('claimInterface $claimInterface');
          },
        ),
        ElevatedButton(
          child: const Text('releaseInterface'),
          onPressed: () async {
            var releaseInterface =
                await QuickUsb.releaseInterface(_configuration!.interfaces[0]);
            log('releaseInterface $releaseInterface');
          },
        ),
      ],
    );
  }

  // 批量传输
  Widget _bulk_transfer() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        ElevatedButton(
          child: const Text('bulkTransferIn'),
          onPressed: () async {
            var endpoint = _configuration!.interfaces[0].endpoints
                .firstWhere((e) => e.direction == UsbEndpoint.DIRECTION_IN);
            var bulkTransferIn = await QuickUsb.bulkTransferIn(endpoint, 1024);
            log('bulkTransferIn ${hex.encode(bulkTransferIn)}');
          },
        ),
        ElevatedButton(
          child: const Text('bulkTransferOut'),
          onPressed: () async {
            var data = Uint8List.fromList(utf8.encode('Hello, USB!'));
            var endpoint = _configuration!.interfaces[0].endpoints
                .firstWhere((e) => e.direction == UsbEndpoint.DIRECTION_OUT);
            var bulkTransferOut =
                await QuickUsb.bulkTransferOut(endpoint, data);
            log('bulkTransferOut $bulkTransferOut');
          },
        ),
      ],
    );
  }

  // 获取带有描述的设备列表
  Widget _getDevicesWithDescription() {
    return ElevatedButton(
      child: const Text('getDevicesWithDescription'),
      onPressed: () async {
        var descriptions = await QuickUsb.getDevicesWithDescription();
        _deviceList = descriptions.map((e) => e.device).toList();
        log('descriptions $descriptions');
      },
    );
  }

  // 获取设备描述
  Widget _getDeviceDescription() {
    return ElevatedButton(
      child: const Text('getDeviceDescription'),
      onPressed: () async {
        var description =
            await QuickUsb.getDeviceDescription(_deviceList!.first);
        log('description ${description.toMap()}');
      },
    );
  }

  bool _autoDetachEnabled = false;
  
  // 设置自动分离内核驱动程序(仅限Linux)
  Widget _setAutoDetachKernelDriver() {
    return ElevatedButton(
      child: const Text('setAutoDetachKernelDriver'),
      onPressed: () async {
        await QuickUsb.setAutoDetachKernelDriver(!_autoDetachEnabled);
        _autoDetachEnabled = !_autoDetachEnabled;
        log('setAutoDetachKernelDriver: $_autoDetachEnabled');
      },
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用quick_usb插件进行USB通信的代码示例。quick_usb是一个Flutter插件,它允许你与连接的USB设备进行通信。请注意,这个插件可能需要在Android和iOS平台上进行一些额外的配置。

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

dependencies:
  flutter:
    sdk: flutter
  quick_usb: ^最新版本号  # 请替换为实际可用的最新版本号

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

1. Android配置

在Android项目中,你需要在AndroidManifest.xml中添加USB权限和USB主机功能:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-feature android:name="android.hardware.usb.host" />
    <uses-permission android:name="android.permission.USB_PERMISSION" />

    <application
        ...>
        ...
    </application>
</manifest>

2. iOS配置

对于iOS,你可能需要在Info.plist中添加一些权限说明,但通常quick_usb插件已经处理了大部分配置。不过,确保你的ios/Podfile是最新的,并且运行了pod install

3. Flutter代码示例

以下是一个基本的Flutter代码示例,展示如何使用quick_usb插件进行USB通信:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter USB Communication',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: UsbCommunicationPage(),
    );
  }
}

class UsbCommunicationPage extends StatefulWidget {
  @override
  _UsbCommunicationPageState createState() => _UsbCommunicationPageState();
}

class _UsbCommunicationPageState extends State<UsbCommunicationPage> {
  String _usbStatus = "No USB device connected";
  List<UsbDevice> _usbDevices = [];

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

  void initUsb() async {
    try {
      // 请求USB权限
      bool hasPermission = await QuickUsb.requestUsbPermission();
      if (hasPermission) {
        // 获取连接的USB设备
        _usbDevices = await QuickUsb.getUsbDevices();
        if (_usbDevices.isNotEmpty) {
          setState(() {
            _usbStatus = "USB device connected: ${_usbDevices.first.deviceName}";
          });

          // 打开USB设备
          UsbDevice device = _usbDevices.first;
          UsbDeviceConnection connection = await device.open();
          
          // 示例:向USB设备发送数据(需要根据你的设备协议)
          Uint8List dataToSend = Uint8List.fromList([0x01, 0x02, 0x03]);
          await connection.bulkTransfer(device.endpoints[0].address, dataToSend, dataToSend.length, 0);

          // 示例:从USB设备接收数据(需要根据你的设备协议)
          Uint8List buffer = Uint8List(64);  // 创建一个接收缓冲区
          int receivedLength = await connection.bulkTransfer(device.endpoints[1].address, buffer, buffer.length, 1000);
          List<int> receivedData = buffer.sublist(0, receivedLength);
          print("Received data: $receivedData");

          // 关闭连接
          await connection.close();
        } else {
          setState(() {
            _usbStatus = "No USB device connected";
          });
        }
      } else {
        setState(() {
          _usbStatus = "USB permission denied";
        });
      }
    } catch (e) {
      setState(() {
        _usbStatus = "Error: ${e.toString()}";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('USB Communication Example'),
      ),
      body: Center(
        child: Text(_usbStatus),
      ),
    );
  }
}

注意事项

  1. 设备兼容性:确保你的USB设备和Flutter应用兼容,并且了解设备的通信协议。
  2. 权限处理:在Android上,你可能需要处理运行时权限请求。
  3. 错误处理:在实际应用中,添加更多的错误处理逻辑,以应对各种可能的异常情况。

这个示例代码提供了一个基本的框架,展示了如何使用quick_usb插件进行USB通信。根据你的具体需求,你可能需要调整代码,特别是与USB设备通信的部分。

回到顶部