Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Linux SocketCAN access in Rust

License

NotificationsYou must be signed in to change notification settings

socketcan-rs/socketcan-rs

Repository files navigation

This library implements Controller Area Network (CAN) communications on Linux using the SocketCAN subsystem. This provides a network socket interface to the CAN bus.

Linux SocketCAN

Please see thedocumentation for details about the Rust API provided by this library.

Latest News

Version 3.x adds integrated async/await, improved Netlink coverage, and more!

Version 3.0 adds integrated support for async/await, with the most popular runtimes,tokio, async-std, andsmol. We have merged thetokio-socketcan crate into this one and implementedasync-io.

Unfortunaly this required a minor breaking change to the existing API, so we bumped the version to 3.0.

The async support is optional, and can be enabled with a feature for the target runtime:tokio,async-std, orsmol.

Additional implementation of the netlink control of the CAN interface was added in v3.1 allowing an application to do things like set the bitrate on the interface, set control modes, restart the inteface, etc.

v3.2 increased the interface configuration coverage with Netlink, allowing an application to set most interface CAN parameters and query them all back.

What's New in Version 3.3

  • #53 Added CanFD support for tokio
  • Serialized tokio unit tests and put them behind the "vcan_tests" feature

What's New in Version 3.2

  • #32 Further expanded netlink functionality:
    • Added setters for most additional interface CAN parameters
    • Ability to query back interface CAN parameters
    • ExpandedInterfaceDetails to include CAN-specific parameters
    • Better integration of low-level types withneli
    • Significant cleanup of thenl module
    • Split thenl module into separate sources for higher and lower-level code

Next Steps

A number of items still did not make it into a release. These will be added in v3.x, coming soon.

  • Issue#22 Timestamps, including optional hardware timestamps
  • Better documentation. This README will be expanded with basic usage information, along with better doc comments, and perhaps creation of the wiki

Minimum Supported Rust Version (MSRV)

The current version of the crate targets Rust Edition 2021 with an MSRV of Rust v1.65.0.

Note that, at this time, the MSRV is mostly diven by use of theclap v4.0 crate for managing command-line parameters in the utilities and example applications. The core library could likely be built with an earlier version of the compiler if required.

Async Support

Tokio

Thetokio-socketcan crate was merged into this one to provide async support for CANbus using tokio.

This is enabled with the optional feature,tokio.

Example bridge withtokio

This is a simple example of sending data frames from one CAN interface to another. It is included inthe example applications astokio_bridge.rs.

use futures_util::StreamExt;use socketcan::{tokio::CanSocket,CanFrame,Result};use tokio;#[tokio::main]asyncfnmain() ->Result<()>{letmut sock_rx =CanSocket::open("vcan0")?;let sock_tx =CanSocket::open("can0")?;whileletSome(Ok(frame)) = sock_rx.next().await{ifmatches!(frame,CanFrame::Data(_)){            sock_tx.write_frame(frame)?.await?;}}Ok(())}

async-io (async-std &smol)

New support was added for theasync-io runtime, supporting theasync-std andsmol runtimes.

This is enabled with the optional feature,async-io. It can also be enabled with either feature,async-std orsmol. Either of those specific runtime flags will simply build theasync-io support but then also alias theasync-io submodule with the specific feature/runtime name. This is simply for convenience.

Additionally, when building examples, the specific examples for the runtime will be built if specifying theasync-std orsmol feature(s).

Example bridge withasync-std

This is a simple example of sending data frames from one CAN interface to another. It is included inthe example applications asasync_std_bridge.rs.

use socketcan::{async_std::CanSocket,CanFrame,Result};#[async_std::main]asyncfnmain() ->Result<()>{let sock_rx =CanSocket::open("vcan0")?;let sock_tx =CanSocket::open("can0")?;loop{let frame = sock_rx.read_frame().await?;ifmatches!(frame,CanFrame::Data(_)){            sock_tx.write_frame(&frame).await?;}}}

Testing

Integrating the full suite of tests into a CI system is non-trivial as it relies on avcan0 virtual CAN device existing. Adding it to most Linux systems is pretty easy with root access, but attaching a vcan device to a container for CI seems difficult to implement.

Therefore, tests requiringvcan0 were placed behind an optional feature,vcan_tests.

The steps to install and add a virtual interface to Linux are in thescripts/vcan.sh script. Run it with root proveleges, then run the tests:

$ sudo ./scripts/vcan.sh$ cargotest --features=vcan_tests

About

Linux SocketCAN access in Rust

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors21


[8]ページ先頭

©2009-2025 Movatter.jp