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
每月下载量26,879
用于30个Crate(25个直接使用)
190KB
3.5K SLoC
Rust SocketCAN
此库通过SocketCAN子系统在Linux上实现控制器局域网(CAN)通信。它为CAN总线提供网络套接字接口。
有关此库提供的Rust API的详细信息,请参阅文档。
最新消息
3.x版本增加了集成async/await、改进的Netlink覆盖范围等功能!
3.0版本增加了对async/await的集成支持,包括最流行的运行时tokio, async-std和smol。我们将tokio-socketcan crate合并到这个版本中,并实现了async-io
。
不幸的是,这需要对现有API进行轻微的破坏性更改,因此我们将版本号提升到3.0。
异步支持是可选的,可以通过目标运行时的功能启用:tokio
、async-std
或smol
。
在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-std 和 smol 运行时。
这通过可选功能 async-io
启用。它也可以通过 async-std
或 smol
功能启用。任一特定运行时标志将简单地构建 async-io
支持,然后还将 async-io
子模块与特定功能/运行时名称别名。这只是为了方便。
此外,当构建示例时,如果指定了 async-std
或 smol
功能,将构建特定运行时的具体示例。
使用 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