Flutter Linux硬件接口访问插件hid_linux的使用

在Linux系统上,访问硬件接口可以通过使用hid_linux插件来实现。hid_linux是 hid的Linux实现,允许开发者通过Flutter应用程序与支持HID(Human Interface Device)的硬件设备进行交互。

以下是一个完整的示例,展示如何在Flutter中使用 hid_linux 插件来访问硬件接口。


插件hid_linux的使用步骤

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 hid_linux 依赖:

dependencies:
  hid_linux: ^0.1.0

然后运行以下命令以安装依赖:

flutter pub get

2. 编写代码

创建一个简单的Flutter应用程序,用于扫描和读取HID设备的信息。

完整示例代码

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:hid_linux/hid_linux.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HidDeviceScanner(),
    );
  }
}

class HidDeviceScanner extends StatefulWidget {
  [@override](/user/override)
  _HidDeviceScannerState createState() => _HidDeviceScannerState();
}

class _HidDeviceScannerState extends State<HidDeviceScanner> {
  List<String> devices = [];
  bool isLoading = true;

  [@override](/user/override)
  void initState() {
    super.initState();
    scanDevices();
  }

  Future<void> scanDevices() async {
    final hid = HidLinux(); // 创建HidLinux实例
    final deviceList = await hid.getDevices(); // 获取所有HID设备列表

    setState(() {
      devices = deviceList.map((device) => device.path).toList();
      isLoading = false;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('HID设备扫描'),
      ),
      body: isLoading
          ? Center(child: CircularProgressIndicator())
          : devices.isEmpty
              ? Center(child: Text('未找到HID设备'))
              : ListView.builder(
                  itemCount: devices.length,
                  itemBuilder: (context, index) {
                    return ListTile(
                      title: Text(devices[index]),
                      onTap: () {
                        Navigator.push(
                          context,
                          MaterialPageRoute(
                            builder: (context) => HidDeviceInfo(path: devices[index]),
                          ),
                        );
                      },
                    );
                  },
                ),
    );
  }
}

class HidDeviceInfo extends StatelessWidget {
  final String path;

  const HidDeviceInfo({required this.path});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('设备信息'),
      ),
      body: FutureBuilder(
        future: HidLinux().openDevice(path),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Center(child: CircularProgressIndicator());
          }

          final device = snapshot.data as HidLinuxDevice;
          return Padding(
            padding: const EdgeInsets.all(16.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text('设备路径: ${device.path}'),
                SizedBox(height: 8),
                Text('厂商ID: ${device.vendorId}'),
                SizedBox(height: 8),
                Text('产品ID: ${device.productId}'),
                SizedBox(height: 8),
                Text('序列号: ${device.serialNumber ?? '无'}'),
                SizedBox(height: 8),
                ElevatedButton(
                  onPressed: () {
                    device.read().then((data) {
                      showDialog(
                        context: context,
                        builder: (context) => AlertDialog(
                          title: Text('读取数据'),
                          content: Text(data.toString()),
                        ),
                      );
                    }).catchError((error) {
                      showDialog(
                        context: context,
                        builder: (context) => AlertDialog(
                          title: Text('错误'),
                          content: Text(error.toString()),
                        ),
                      );
                    });
                  },
                  child: Text('读取数据'),
                ),
              ],
            ),
          );
        },
      ),
    );
  }
}

更多关于Flutter Linux硬件接口访问插件hid_linux的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Linux硬件接口访问插件hid_linux的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中访问硬件接口(如 HID 设备)通常需要使用平台通道(Platform Channels)来调用原生代码。对于 Linux 平台,hid_linux 插件可以帮助你与 HID 设备进行交互。以下是如何使用 hid_linux 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 hid_linux 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  hid_linux: ^0.0.1  # 请检查最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 hid_linux 插件:

import 'package:hid_linux/hid_linux.dart';

3. 初始化 HID 设备

使用 HidLinux 类来发现并初始化 HID 设备。以下是一个简单的示例:

void initHidDevice() async {
  // 获取所有连接的 HID 设备
  List<HidDeviceInfo> devices = await HidLinux.enumerate();

  if (devices.isNotEmpty) {
    // 选择第一个设备
    HidDeviceInfo deviceInfo = devices.first;

    // 打开设备
    HidDevice device = await HidLinux.open(deviceInfo.vendorId, deviceInfo.productId);

    // 读取数据
    device.listen((data) {
      print('Received data: $data');
    });

    // 发送数据
    List<int> dataToSend = [0x01, 0x02, 0x03];
    await device.write(dataToSend);

    // 关闭设备
    await device.close();
  } else {
    print('No HID devices found.');
  }
}

4. 处理数据

listen 方法中,你可以处理从 HID 设备接收到的数据。write 方法用于向设备发送数据。

5. 清理资源

在使用完设备后,确保调用 close 方法来释放资源。

6. 处理权限问题

在 Linux 系统上,访问 HID 设备可能需要 root 权限。你可以通过以下方式解决权限问题:

  • 使用 sudo 运行你的 Flutter 应用。
  • 或者,创建一个 udev 规则来允许非 root 用户访问特定的 HID 设备。

例如,创建一个 /etc/udev/rules.d/99-hid.rules 文件,并添加以下内容:

SUBSYSTEM=="hidraw", MODE="0666"

然后重新加载 udev 规则:

sudo udevadm control --reload-rules

7. 在 Flutter 中调用

你可以在 Flutter 的 initState 或其他生命周期方法中调用 initHidDevice 来初始化和使用 HID 设备。

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
    initHidDevice();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('HID Linux Example'),
        ),
        body: Center(
          child: Text('Check the console for HID device data.'),
        ),
      ),
    );
  }
}
回到顶部