Coder Social home page Coder Social logo

jackyzjk / socketcan-rs Goto Github PK

View Code? Open in Web Editor NEW

This project forked from socketcan-rs/socketcan-rs

0.0 0.0 0.0 351 KB

Linux SocketCAN access in Rust

Home Page: https://crates.io/crates/socketcan

License: MIT License

Shell 1.49% Rust 98.51%

socketcan-rs's Introduction

Rust SocketCAN

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

Linux SocketCAN

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

Latest News

Version 3.x adds integrated async/await!

Version 3.0 adds integrated support for async/await, with the most popular runtimes, tokio, async-std, and smol. To get started we have already merged the tokio-socketcan crate into this one and implemented async-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, or smol.

What's New in Version 3.0

  • Support for Rust async/await
    • All of tokio-socketcan has been merged into this crate and will be available with an async-tokio build feature.
    • #41 Added initial support for async-io for use with async-std and smol
    • Split SocketOptions trait out of Socket trait for use with async (breaking)
    • Added cargo build features for tokio or async-io.
    • Also created specific build features for async-std and smol which just bring in the async-io module and alias the module name to async-std or smol, respectively, and build examples for each.

What's New in Version 2.1

  • Made CanAddr pulic and added functions to help interact with low-level sockaddr types. Sockets can now be opened with an address.
  • Can create an Error directly from a CanErrorFrame or std::io::ErrorKind.
  • #46 Applications can create error frames:
    • CanErrorFrame::new() now works.
    • CanErrorFrame::new_error() is similar but more intuitive using a raw ID word.
    • From<CanError> for CanErrorFrame to create an error frame from a CanError.
  • Added Frame::from_raw_id() and Frame::remote_from_raw_id()
  • Bumped MSRV to 1.65.0

Next Steps

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

  • Issue #22 Timestamps, including optional hardware timestamps
  • Issue #32 Better coverage of the Netlink API to manipulate the CAN interfaces programatically.
  • 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 the clap 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

The tokio-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 with tokio

This is a simple example of sending data frames from one CAN interface to another. It is included in the example applications as 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)

New support was added for the async-io runtime, supporting the async-std and smol runtimes.

This is enabled with the optional feature, async-io. It can also be enabled with either feature, async-std or smol. Either of those specific runtime flags will simply build the async-io support but then also alias the async-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 the async-std or smol feature(s).

Example bridge with async-std

This is a simple example of sending data frames from one CAN interface to another. It is included in the example applications as 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?;
        }
    }
}

Testing

Integrating the full suite of tests into a CI system is non-trivial as it relies on a vcan0 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 requiring vcan0 were placed behind an optional feature, vcan_tests.

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

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

socketcan-rs's People

Contributors

mbr avatar fpagliughi avatar marcelbuesing avatar jreppnow avatar nnarain avatar almini avatar andresv avatar mchodzikiewicz avatar hmvp avatar jmagnuson avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.