flipper-rpc

Crates.ioflipper-rpc
lib.rsflipper-rpc
version0.9.4
created_at2025-06-07 22:31:27.557684+00
updated_at2025-06-29 18:38:10.207866+00
descriptionFlipper Zero Remote Procedure Call Library (RPC) – A Rust πŸ¦€ library enabling apps to remotely control a Flipper Zero device, similar to qFlipper. Built using the official Flipper Zero protobuf definitions.
homepage
repositoryhttps://github.com/elijah629/flipper-rpc
max_upload_size
id1704475
size149,603
elijah629 (elijah629)

documentation

https://docs.rs/flipper-rpc

README

flipper-rpc – Serial RPC Control for the Flipper Zero

Crates.io Version Crates.io License docs.rs Crates.io MSRV Crates.io License Crates.io Downloads (recent) GitHub Repo stars

Finally! A Rust library to control a Flipper Zero through RPC commands.

flipper-rpc is a Rust library for sending and receiving RPC messages to and from a Flipper Zero over a serial connection.


✨ Features

  • tokio-tracing compatible
  • Automatic Flipper detection
  • Full flipperzero-protobuf support
  • Serial-based RPC interface
  • Full filesystem support
  • Ergonomic, user-friendly API so you don't have to use raw protobuf messages.

🚧 Tentative

  • Bluetooth support (maybe 🀞)

πŸ§ͺ Planned

Nothing for now... Add an issue if you want something cool added!


Features

Feature Description
default minimal
full Enables *-all
minimal Just proto
proto Protobuf encoding/decoding
easy-rpc High‑level RPC helper API
fs-all Enables all filesystem operations
fs-read Read files from Flipper Zero
fs-write Write files to Flipper Zero
fs-readdir List directory contents
fs-remove Remove files or directories
fs-createdir Create directories on device
transport-all All available transport mechanisms
transport-any Base transport support
transport-serial Serial‑port communication
transport-serial-optimized Optimized serial transport with a better varint decoder
tracing Enable logging via tokio-tracing

πŸ“¦ Installation

[!IMPORTANT] Please decide on features, and don't just use the full feature since you are lazy. Actually read the table above and enable what you need as it will significantly decrease compile time.

Run this command

cargo add flipper-rpc --features <FEATURES>

Or add this to your Cargo.toml:

[dependencies]
flipper-rpc = { features = [], version = "0.9.0" } # Replace with the latest version from crates.io

πŸš€ Usage

Playing an alert

let ports = list_flipper_ports()?;
let port = &ports[0].port_name;

let mut cli = SerialRpcTransport::new(port.to_string())?;

let response = cli.send_and_receive(Request::SystemPlayAudiovisualAlert)?;

πŸ“š Flipper Zero RPC Protocol Documentation

After far too much searching for usable documentation on this API (and finding nothing), I decided to write my own. Enjoy!

[!NOTE] Read the source code for information about actual communication, the following information is only for serial transport (BLE COMING SOON)


πŸ”Œ Connecting

  1. Make a serial connection. Use your preferred serial library. This crate uses serialport, which is simple and only requires the port path and a baud rate.

  2. Baud rate... Apparently doesn't matter Serial over USB (CDC-ACM) abstracts baud rate away, it must be reasonable and capable by the hardware and software.

  3. Drain the buffer. Keep reading until you see the shell prompt string ">: ". This clears old buffer content, since reads begin from the buffer start β€” not your last write.

  4. Enter RPC mode. Write the string: start_rpc_session\r

    Note: \r\n does not work here. I do not know why.

  5. Drain again. Read until you receive \n, which indicates that the Flipper has accepted the command.


πŸ“€ Sending RPC Commands

  1. Encode the request using protobuf.
  2. Prefix the message with its length (encoded as a Varint, not a regular byte).

πŸ”’ Varint is a variable-length integer encoding. The Flipper expects this as the first byte(s) of your message.

Example: Sending PingRequest with [1, 2, 3, 4]

Raw request bytes:

[8, 42, 6, 10, 4, 1, 2, 3, 4]
  • 8 is the Varint-encoded length of the rest of the message.

πŸ“₯ Receiving RPC Responses

  1. Read the length prefix The length is a Varint and can be up to 10 bytes.

    • Slow way: Read byte-by-byte until the MSB is 1.
    • Fast way: See my optimized logic in src/transport/serial/rpc.rs, read_raw(...) as it is too long to mention here.
  2. Read and decode Once the length is known, read that many bytes, then decode with your protobuf deserializer.

Example response for the ping

[8, 50, 6, 10, 4, 1, 2, 3, 4]

πŸ€” Why This Exists

This crate was built to support another project I'm working on: πŸ‘‰ flippy – a CLI tool for updating firmware and databases on the Flipper Zero from remote sources.

Since there was no existing way to speak RPC to the Flipper in Rust, I split that functionality into this standalone library.

πŸ’« Shameless plug: If you find this useful, give it a star ⭐ β€” I'd appreciate it!

Credits

This project would not be possible without two amazing repos:

  • flipwire. Gave amazing examples in source code that helped me implement the codec even better.
  • flipperzero_protobuf_py More source-code examples, although in python, this library demonstrates the serial API very well and exactly how to use it and handle it properly.
Commit count: 22

cargo fmt