#socket-can #async #iso-tp #isotp #linux #sockets #iso-15762-2

tokio-socketcan-isotp

基于 socketcan-isotp 构建的异步 tokio ISO-TP 库

2 个不稳定版本

0.2.0 2024年5月1日
0.1.0 2024年1月9日

#615 in Unix APIs


用于 uds-rs

自定义许可

31KB
550 代码行数,不包括注释

tokio-socketcan-isotp

此库在 socketcan-isotp 周围创建异步包装器

目前不依赖于原始库,而是依赖于修改过的 socketcan-isotp 库,该库增加了 read_to_vec 方法,以防止在读取时对套接字进行可变借用。

在写入时遇到 io::Error:WouldBlock 时,您可能会遇到忙等待或软锁。这是由于 Linux 内核的错误,现在已被 解决,但您的 Linux 内核维护者可能尚未发布。我在 6.6.5 主线内核上进行了测试,一切正常。如果您遇到提到的错误并且无法升级到较新内核,请参考 src/lib.rs 文件中的 IsoTpWriteFuture 的 poll 方法,那里建议的编辑可能有助于您的情况。

vcan0 上的基本回显服务器示例

use tokio_socketcan_isotp::{IsoTpSocket, StandardId, Error};

#[tokio::main]
async fn main() -> Result<(), Error> {
    let mut socket = IsoTpSocket::open(
        "vcan0",
        StandardId::new(0x123).expect("Invalid src id"),
        StandardId::new(0x321).expect("Invalid src id")
            )?;
            
    while let Ok(packet) = socket.read_packet().await {
        println!("{:?}", packet);
        let rx = socket.write_packet(packet).await;
    }
}

要设置 vcan0,请运行以下命令

sudo modprobe can
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

依赖关系

~5–14MB
~159K SLoC