Flutter USB设备管理插件usb_device的使用

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

Flutter USB设备管理插件usb_device的使用

🚀  Overview

usb_device 是一个Flutter插件,它允许通过WebUSB API从Flutter Web访问USB设备。该插件提供了以下功能:

  • 📱 获取设备信息及配置
  • 🔌 使用过滤器配对设备
  • 📤 向USB设备发送数据
  • 📥 从USB设备接收数据
  • 🎛️ 更改USB设备配置

💻  Platform Support

平台 支持情况
Android
iOS
MacOS
Web ✔️
Linux
Windows

📖  Installation

安装插件

flutter pub add usb_device

导入插件

import 'package:usb_device/usb_device.dart';

🚀  Get Started

初始化插件

import 'package:usb_device/usb_device.dart';

final UsbDevice usbDevice = UsbDevice();

常用方法

// 获取已配对设备
final pairedDevices = await usbDevice.pairedDevices;

// 配对设备(使用过滤器)
final pairedDevice = await usbDevice.requestDevices([DeviceFilter(vendorId : 0x00, productId: 0x00)]);

// 获取设备配置
List<USBConfiguration> availableConfigurations = await usbDevice.getAvailableConfigurations(pairedDevice);

// 获取设备信息
USBDeviceInfo deviceInfo = await usbDevice.getPairedDeviceInfo(pairedDevice);

// 开始会话
await usbDevice.open(pairedDevice);

// 结束会话
await usbDevice.close(pairedDevice);

📚  Methods

USB 方法列表

名称 描述 返回值类型
pairedDevices 获取已配对的连接设备 Future<List<dynamic>>
requestDevice(List<DeviceFilter> filters) 根据过滤器配对设备 Future<dynamic>
isSupported() 检查是否支持WebUSB Future<bool>
open() 开始会话 Future
close() 结束会话 Future
claimInterface(dynamic device, int interfaceNumber) 请求接口独占访问权限 Future
releaseInterface(dynamic device, int interfaceNumber) 释放已请求的接口 Future
reset(dynamic device) 重置设备 Future
selectConfiguration(dynamic device, int configurationValue) 选择指定配置 Future
clearHalt(dynamic device, String direction, int endpointNumber) 清除端点停止状态 Future
controlTransferIn(dynamic device, SetupParam setup, {int? length}) 返回命令结果 Future<USBInTransferResult>
controlTransferOut(dynamic device, SetupParam setup, {dynamic data}) 向设备发送命令 Future<USBOutTransferResult>
transferIn(dynamic device, int endpointNumber, int length) 从设备返回数据 Future<USBInTransferResult>
transferOut(dynamic device, int endpointNumber, dynamic data) 向设备发送数据 Future<USBOutTransferResult>
isochronousTransferIn(dynamic device, int endpointNumber, List<int> packetLengths) 当时间敏感信息传输到(由)USB设备时解析 Future<USBIsochronousInTransferResult>
isochronousTransferOut(dynamic device, int endpointNumber, List<int> packetLengths) 当时间敏感信息从USB设备传输时解析 Future<USBIsochronousOutTransferResult>
setOnConnectCallback(Function(dynamic) onConnect) 连接回调 Future
setOnDisconnectCallback(Function(dynamic) onDisconnect) 断开连接回调 Future
getSelectedConfiguration(dynamic pairedDevice) 获取选定的配置 Future<USBConfiguration?>
getAvailableConfigurations(dynamic pairedDevice) 获取设备可用配置 Future<List<USBConfiguration>>
getPairedDeviceInfo(dynamic pairedDevice) 获取配对设备信息 Future<USBDeviceInfo>

示例代码

下面是一个完整的示例代码,演示了如何使用usb_device插件来管理和操作USB设备。

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

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

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

class MainPage extends StatefulWidget {
  @override
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  final UsbDevice usbDevice = UsbDevice();
  bool isSupported = false;
  dynamic pairedDevice;
  bool isLoading = false;

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

  Future<void> initUsbDevice() async {
    setState(() {
      isLoading = true;
    });
    isSupported = await usbDevice.isSupported();
    if (isSupported) {
      pairedDevice = await usbDevice.requestDevices([
        DeviceFilter(vendorId: 0x1234, productId: 0x5678)
      ]);
    }
    setState(() {
      isLoading = false;
    });
  }

  Future<void> startSession() async {
    if (pairedDevice != null) {
      await usbDevice.open(pairedDevice);
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Session started')),
      );
    }
  }

  Future<void> closeSession() async {
    if (pairedDevice != null) {
      await usbDevice.close(pairedDevice);
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Session closed')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Flutter USB Demo"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              "Web USB supported: $isSupported",
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            if (pairedDevice != null)
              ElevatedButton(
                onPressed: () {
                  startSession();
                },
                child: Text('Start Session'),
              )
            else
              ElevatedButton(
                onPressed: () {
                  initUsbDevice();
                },
                child: Text('Request Device'),
              ),
            if (pairedDevice != null)
              ElevatedButton(
                onPressed: () {
                  closeSession();
                },
                child: Text('Close Session'),
              ),
            if (isLoading)
              CircularProgressIndicator()
          ],
        ),
      ),
    );
  }
}

这个示例展示了如何初始化usb_device插件,检查WebUSB支持情况,请求和配对USB设备,以及开始和结束与设备的会话。希望这个示例能帮助你更好地理解和使用usb_device插件。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用usb_device插件来管理USB设备的示例代码。这个插件允许你枚举连接的USB设备,并与它们进行通信。以下是一个基本的示例,展示了如何列出连接的USB设备。

前提条件

  1. 确保你的Flutter环境已经正确设置。
  2. 在你的pubspec.yaml文件中添加usb_device插件依赖。
dependencies:
  flutter:
    sdk: flutter
  usb_device: ^x.y.z  # 请替换为最新版本号
  1. 运行flutter pub get来安装依赖。

示例代码

以下是一个简单的Flutter应用示例,它使用usb_device插件来列出连接的USB设备。

主文件:main.dart

import 'package:flutter/material.dart';
import 'package:usb_device/usb_device.dart';
import 'package:usb_device/usb_interface.dart';
import 'package:usb_device/usb_endpoint.dart';

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

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

class UsbDeviceScreen extends StatefulWidget {
  @override
  _UsbDeviceScreenState createState() => _UsbDeviceScreenState();
}

class _UsbDeviceScreenState extends State<UsbDeviceScreen> {
  List<UsbDevice> _devices = [];

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

  Future<void> _listUsbDevices() async {
    try {
      UsbManager manager = UsbManager.getInstance(context);
      List<UsbDevice> devices = await manager.getDeviceList();
      
      setState(() {
        _devices = devices;
      });
    } catch (e) {
      print("Error listing USB devices: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('USB Device Manager'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: ListView.builder(
          itemCount: _devices.length,
          itemBuilder: (context, index) {
            UsbDevice device = _devices[index];
            return ListTile(
              title: Text("Device ${index + 1}: ${device.deviceName}"),
              subtitle: Text("Vendor ID: ${device.vendorId}, Product ID: ${device.productId}"),
              trailing: IconButton(
                icon: Icon(Icons.arrow_forward),
                onPressed: () {
                  // 这里可以添加进一步的设备详细信息或通信代码
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => DeviceDetailScreen(device: device)),
                  );
                },
              ),
            );
          },
        ),
      ),
    );
  }
}

class DeviceDetailScreen extends StatelessWidget {
  final UsbDevice device;

  DeviceDetailScreen({required this.device});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Device Details'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text("Device Name: ${device.deviceName}"),
            Text("Vendor ID: ${device.vendorId}"),
            Text("Product ID: ${device.productId}"),
            // 这里可以添加更多设备详细信息
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 权限:确保你的应用有访问USB设备的权限。在Android上,你可能需要在AndroidManifest.xml中添加相应的权限声明,并处理运行时权限请求。

  2. 设备兼容性:不同的USB设备可能需要不同的处理逻辑,具体取决于设备的类型和用途。

  3. 错误处理:在生产代码中,你应该添加更多的错误处理逻辑,以确保应用的健壮性。

  4. 进一步通信:上面的示例只展示了如何列出USB设备。要与设备进行通信,你需要进一步处理USB接口(UsbInterface)和端点(UsbEndpoint)。

这个示例提供了一个基本的框架,你可以在此基础上进行扩展,以满足你的具体需求。

回到顶部