#frame #linux #sockets #bus #async-io #dataframe #controller

bin+lib socketcan

Linux SocketCAN库。在Linux上通过CAN总线发送和接收CAN帧。

17个稳定版本

3.3.0 2023年10月27日
3.0.0 2023年9月19日
2.1.0 2023年9月19日
2.0.0 2023年4月6日
1.2.1 2016年7月14日

网络编程类中排名100

Download history · Rust 包仓库 5916/week @ 2024-04-12 · Rust 包仓库 6218/week @ 2024-04-19 · Rust 包仓库 6396/week @ 2024-04-26 · Rust 包仓库 5766/week @ 2024-05-03 · Rust 包仓库 6458/week @ 2024-05-10 · Rust 包仓库 6649/week @ 2024-05-17 · Rust 包仓库 5842/week @ 2024-05-24 · Rust 包仓库 6967/week @ 2024-05-31 · Rust 包仓库 5865/week @ 2024-06-07 · Rust 包仓库 6627/week @ 2024-06-14 · Rust 包仓库 6591/week @ 2024-06-21 · Rust 包仓库 6169/week @ 2024-06-28 · Rust 包仓库 6555/week @ 2024-07-05 · Rust 包仓库 6153/week @ 2024-07-12 · Rust 包仓库 6837/week @ 2024-07-19 · Rust 包仓库 6502/week @ 2024-07-26 · Rust 包仓库

每月下载量26,879
用于30个Crate(25个直接使用)

MIT许可证

190KB
3.5K SLoC

Rust SocketCAN

此库通过SocketCAN子系统在Linux上实现控制器局域网(CAN)通信。它为CAN总线提供网络套接字接口。

Linux SocketCAN

有关此库提供的Rust API的详细信息,请参阅文档

最新消息

3.0版本增加了对async/await的集成支持,包括最流行的运行时tokio, async-stdsmol。我们将tokio-socketcan crate合并到这个版本中,并实现了async-io

不幸的是,这需要对现有API进行轻微的破坏性更改,因此我们将版本号提升到3.0。

异步支持是可选的,可以通过目标运行时的功能启用:tokioasync-stdsmol

在3.1版本中增加了对CAN接口Netlink控制的额外实现,允许应用程序执行设置接口比特率、设置控制模式、重启接口等操作。

3.2版本通过Netlink增加了接口配置覆盖范围,允许应用程序设置大多数接口CAN参数并查询它们。

3.3版本的新功能

  • #53 为tokio添加了对CanFD的支持
  • 序列化tokio单元测试并将它们放在"vcan_tests"功能后面

3.2版本的新功能

  • #32 扩展了Netlink功能
    • 添加了大多数附加接口CAN参数的设置器
    • 查询接口CAN参数的能力
    • InterfaceDetails扩展到包括CAN特定参数
    • 将低级类型与neli更好地集成
    • nl模块进行了重大清理
    • nl 模块拆分为针对高级和低级代码的独立源文件

下一步

仍有若干项内容未能包含在本次发布中。这些内容将在即将到来的 v3.x 版本中添加。

  • 问题 #22 时间戳,包括可选的硬件时间戳
  • 更好的文档。此 README 将扩展基本使用信息,以及更好的文档注释,也许还会创建维基。

最低支持的 Rust 版本 (MSRV)

该软件包当前版本针对 Rust 版本 2021,最低支持 Rust v1.65.0。

请注意,目前最低支持版本主要取决于在实用工具和示例应用程序中管理命令行参数时使用 clap v4.0 软件包。如果需要,核心库可以与更早版本的编译器一起构建。

异步支持

Tokio

tokio-socketcan 软件包已被合并到本软件包中,以提供使用 tokio 的 CANbus 异步支持。

这通过可选功能 tokio 启用。

使用 tokio 的示例桥接

这是一个从一个 CAN 接口向另一个接口发送数据帧的简单示例。它作为示例应用程序中的 tokio_bridge.rs 包括在内。

use futures_util::StreamExt;
use socketcan::{tokio::CanSocket, CanFrame, Result};
use tokio;

#[tokio::main]
async fn main() -> Result<()> {
    let mut sock_rx = CanSocket::open("vcan0")?;
    let sock_tx = CanSocket::open("can0")?;

    while let Some(Ok(frame)) = sock_rx.next().await {
        if matches!(frame, CanFrame::Data(_)) {
            sock_tx.write_frame(frame)?.await?;
        }
    }

    Ok(())
}

async-io (async-std & smol)

添加了对 async-io 运行时的新支持,支持 async-stdsmol 运行时。

这通过可选功能 async-io 启用。它也可以通过 async-stdsmol 功能启用。任一特定运行时标志将简单地构建 async-io 支持,然后还将 async-io 子模块与特定功能/运行时名称别名。这只是为了方便。

此外,当构建示例时,如果指定了 async-stdsmol 功能,将构建特定运行时的具体示例。

使用 async-std 的示例桥接

这是一个从一个 CAN 接口向另一个接口发送数据帧的简单示例。它作为示例应用程序中的 async_std_bridge.rs 包括在内。

use socketcan::{async_std::CanSocket, CanFrame, Result};

#[async_std::main]
async fn main() -> Result<()> {
    let sock_rx = CanSocket::open("vcan0")?;
    let sock_tx = CanSocket::open("can0")?;

    loop {
        let frame = sock_rx.read_frame().await?;
        if matches!(frame, CanFrame::Data(_)) {
            sock_tx.write_frame(&frame).await?;
        }
    }
}

测试

将完整的测试套件集成到 CI 系统中是非平凡的,因为它依赖于存在 vcan0 虚拟 CAN 设备。使用 root 权限将其添加到大多数 Linux 系统中相当容易,但将 vcan 设备附加到 CI 容器中似乎很难实现。

因此,需要 vcan0 的测试被放置在可选功能 vcan_tests 之后。

scripts/vcan.sh 脚本中包含安装和添加虚拟接口到 Linux 的步骤。使用 root 权限运行它,然后运行测试

$ sudo ./scripts/vcan.sh
$ cargo test --features=vcan_tests

依赖项

~2–17MB
~185K SLoC