Flutter控制器局域网通信插件linux_can的使用

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

Flutter控制器局域网通信插件linux_can的使用

插件介绍

linux_can 是一个用于在 Linux 上使用 CAN(Controller Area Network)的 Dart 包。 它已经测试并能在 ARM32 平台上正常工作,但理论上也应该能在其他 32 位和 64 位的 Linux 平台上正常工作。

该包使用 ffi 直接与内核 SocketCAN API 进行交互。它不包含任何原生代码,并且除了 libc 外没有平台依赖性。

特性

  • 支持同步和异步((Stream) 发送和接收 CAN 帧。
  • 支持 CAN 2.0 标准和扩展帧。
  • 查询 CAN 接口属性。
  • 查询接口的一般属性(操作状态、标志、发送/接收队列等。
  • 查询比特率及支持的比特率、比特定时及比特定时限制、时钟频率、总线错误计数器、终端及支持的终端、控制器模式等。

使用示例

import 'package:linux_can/linux_can.dart';

Future<void> main() async {
  final linuxcan = LinuxCan.instance;

  // 找到名称为 `can0` 的的 CAN 接口。
  final device = linuxcan.devices.singleWhere((device) => device.networkInterface.name == 'can0');

  // 如果接口未启用,则需要启用。
  if (!device.isUp) {
    throw StateError('CAN 接口未启用.');
  }

  // 查询接口属性。
  final attributes = device.queryAttributes();

  print('CAN 设备属性: $attributes');
  print('CAN 设备硬件名称: ${device.hardwareName}');

  // 实际打开设备,以便可以发送/接收帧。
  final socket = device.open();

  // 发送一些示例 CAN 帧。
  socket.send(CanFrame.standard(id: 0x123, data: [0x01, 0x02, 0x03, 0x04]));

  // 阻塞读取 CAN 帧。这将等待帧到达。
  //
  // 没有内部排队。receiveSingle() 只会在方法内部开始监听新帧。
  // 如果在我们调用 receiveSingle() 之前帧到达了套接字,我们将不会收到它。
  final frame = await socket.receiveSingle();

  // 我们收到了帧。
  switch (frame) {
    case CanDataFrame(:final id, :final data):
      print('接收到数据帧,ID: $id 和 数据: $data');
    case CanRemoteFrame _:
      print('接收到远程帧: $frame');
  }

  // 监听 CAN 帧流
  await for (final frame in socket.receive()) {
    print('接收到帧: $frame');
    break;
  }

  // 关闭套接字以释放所有资源。
  await socket.close();
}

更多关于Flutter控制器局域网通信插件linux_can的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter控制器局域网通信插件linux_can的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,若要在Linux平台上使用linux_can插件进行控制器局域网(CAN)通信,你需要先确保已经正确安装了Flutter开发环境以及必要的依赖。以下是一个基本的代码示例,展示了如何在Flutter应用中使用linux_can插件进行CAN通信。

步骤 1: 添加依赖

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

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

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

步骤 2: 配置Linux权限

由于CAN通信通常需要访问特定的设备文件(如/dev/can0),你可能需要在Linux系统中配置相应的权限。这通常涉及将用户添加到dialout组或设置设备文件的权限。

sudo usermod -aG dialout $USER
newgrp dialout  # 更新当前会话的组信息

步骤 3: 使用linux_can插件

以下是一个简单的Flutter应用示例,展示了如何使用linux_can插件来初始化CAN接口、发送和接收CAN帧。

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  CanInterface? _canInterface;
  String _status = "Initializing...";

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

  Future<void> _initializeCanInterface() async {
    try {
      // 初始化CAN接口,这里以'/dev/can0'为例
      _canInterface = await CanInterface.open('/dev/can0');
      // 设置CAN位速率,例如500kbps
      await _canInterface!.setBitrate(500000);
      setState(() {
        _status = "CAN Interface Initialized";
      });

      // 开始接收CAN帧
      _canInterface!.frames.listen((frame) {
        print("Received CAN frame: $frame");
      });

      // 发送示例CAN帧
      var frame = CanFrame()
        ..id = 0x123
        ..data = Uint8List.fromList([0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88]);
      _canInterface!.send(frame).then((_) {
        print("Sent CAN frame: $frame");
      }).catchError((error) {
        print("Failed to send CAN frame: $error");
      });

    } catch (e) {
      setState(() {
        _status = "Error: ${e.toString()}";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter CAN Communication'),
        ),
        body: Center(
          child: Text(_status),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _canInterface?.close();
    super.dispose();
  }
}

注意事项

  1. 权限:确保你的应用有足够的权限访问CAN设备文件。
  2. 设备文件/dev/can0是示例设备文件,实际使用中可能需要根据你的系统配置进行调整。
  3. 错误处理:示例代码中包含基本的错误处理,但在生产环境中,你可能需要更详细的错误日志和恢复机制。
  4. 依赖版本:确保你使用的是linux_can插件的最新版本,并查阅其官方文档以获取最新的API信息和示例代码。

通过上述步骤和代码示例,你应该能够在Flutter应用中实现基本的CAN通信功能。

回到顶部