flipper-rpc β Serial RPC Control for the Flipper Zero
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-tracingcompatible- 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
fullfeature since you are lazy. Actually read the table above and enable what you need as it will significantly decrease compile time.
Run this command
Or add this to your Cargo.toml:
[]
= { = [], = "0.9.0" } # Replace with the latest version from crates.io
π Usage
Playing an alert
let ports = list_flipper_ports?;
let port = &ports.port_name;
let mut cli = new?;
let response = cli.send_and_receive?;
π 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
-
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. -
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. -
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. -
Enter RPC mode. Write the string:
start_rpc_session\rNote:
\r\ndoes not work here. I do not know why. -
Drain again. Read until you receive
\n, which indicates that the Flipper has accepted the command.
π€ Sending RPC Commands
- Encode the request using protobuf.
- 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]
8is the Varint-encoded length of the rest of the message.
π₯ Receiving RPC Responses
-
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.
- Slow way: Read byte-by-byte until the MSB is
-
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.