Simple RPC implementation for Arduino.

https://img.shields.io/github/last-commit/jfjlaros/simpleRPC.svg https://github.com/jfjlaros/simpleRPC/actions/workflows/arduino-package.yml/badge.svg https://readthedocs.org/projects/simplerpc/badge/?version=latest https://img.shields.io/github/release-date/jfjlaros/simpleRPC.svg https://img.shields.io/github/release/jfjlaros/simpleRPC.svg https://www.ardu-badge.com/badge/simpleRPC.svg https://img.shields.io/github/languages/code-size/jfjlaros/simpleRPC.svg https://img.shields.io/github/languages/count/jfjlaros/simpleRPC.svg https://img.shields.io/github/languages/top/jfjlaros/simpleRPC.svg https://img.shields.io/github/license/jfjlaros/simpleRPC.svg

This library provides a simple way to export Arduino functions as remote procedure calls. The exported method definitions are communicated to the host, which is then able to generate an API interface.

Features:

  • For each method, only one line of code is needed for exporting.

  • Automatic parameter- and return type inference.

  • Support for all native C types and strings.

  • Support for arbitrary functions and class methods.

  • Optional function and parameter naming and documentation.

  • Support for PROGMEM’s F() macro to reduce memory footprint.

  • Support for compound data structures like Tuples, Objects (Tuples with internal structure), Vectors and arbitrary combinations of these.

  • Support for reading multidimensional C arrays (e.g., int**).

  • Support for different types of I/O interfaces via plugins, e.g.,

    • Bluetooth.

    • Ethernet (untested).

    • Hardware serial.

    • RS485 serial.

    • Software serial (untested).

    • USB serial.

    • WiFi.

    • Wire (untested).

  • Support for using multiple interfaces at the same time.

The Arduino library is independent of any host implementation, a Python API client library is provided as a reference implementation.

Please see ReadTheDocs for the latest documentation.

Quick start

Export any function e.g., digitalRead() and digitalWrite() using the interface() function.

#include <simpleRPC.h>

void setup() {
  Serial.begin(9600);
}

void loop() {
  interface(Serial, digitalRead, "", digitalWrite, "");
}

These functions are now available on the host under names method0() and method1().

The documentation string can be used to name and describe the method.

interface(
  Serial,
  digitalRead,
    "digital_read: Read digital pin. @pin: Pin number. @return: Pin value.",
  digitalWrite,
    "digital_write: Write to a digital pin. @pin: Pin number. @value: Pin value.");

This is reflected on the host, where the methods are now named digital_read() and digital_write() and where the provided API documentation is also available. In the client reference implementation documentation, contains an example on how this works.

Further reading

Please read section Usage for more information about exporting normal functions, class member functions and documentation conventions.

If you want to create your own host library implementation for other programming languages, the section Protocol should help you on your way.