Документация rsiot

Документация для крейта rsiot.

Целевые платформы

target tripleОписаниеДокументация API
aarch64-linux-androidAndroidссылка
aarch64-unknown-linux-gnuссылка
riscv32imc-esp-espidfМикроконтроллеры ESP32-C3ссылка
x86_64-linux-androidAndroid
x86_64-unknown-linux-gnuссылка
wasm32-unknown-unknownБраузерыссылка

Подробнее в официальной документации

Платформы

ПлатформаПоддержка
aarch64-linux-android-
aarch64-unknown-linux-gnu-
riscv32imc-esp-espidf-
x86_64-linux-android-
x86_64-unknown-linux-gnu-
wasm32-unknown-unknown-

Компоненты

Клиентское подключение:

Сервера:

Брокеры сообщений:

Интерфейс пользователя:

Авторизация:

Сохранение данных:

Взаимодействие с аппаратной частью

Логика исполнения

Систеная информация

Служебные компоненты:

cmp_add_input_stream

cmp_add_output_stream

cmp_auth

Компонент авторизации пользователей

Платформы

target tripleПоддержка
aarch64-linux-android-
aarch64-unknown-linux-gnu+
riscv32imc-esp-espidf-
x86_64-linux-android-
x86_64-unknown-linux-gnu+
wasm32-unknown-unknown-

Конфигурация

Config

secret_key

Секретный ключ для валидации токенов

store

Хранилище данных доступа

Примеры

#![allow(unused)]
fn main() {
store: cmp_auth::ConfigStore::Local(vec![cmp_auth::ConfigStoreLocalItem {
    login: "admin".into(),
    password: "admin".into(),
    role: AuthPermissions::Admin,
}]),
}

cmp_derive

cmp_esp_adc

cmp_esp_gpio

Компонент для работы с входами и выходами GPIO микроконтроллера ESP

Платформы

ПлатформаПоддержка
aarch64-linux-android-
aarch64-unknown-linux-gnu-
riscv32imc-esp-espidf+
x86_64-linux-android-
x86_64-unknown-linux-gnu-
wasm32-unknown-unknown-

Конфигурация

Config

inputs

Конфигурация входов

Примеры

#![allow(unused)]
fn main() {
inputs: vec![cmp_esp_gpio::ConfigGpioInput {
    peripherals: peripherals.pins.gpio9.into(),
    fn_output: |value| Message::new_custom(Custom::EspBootButton(value)),
}],
}

outputs

Конфигурация выходов

Примеры

#![allow(unused)]
fn main() {
outputs: vec![cmp_esp_gpio::ConfigGpioOutput {
    peripherals: peripherals.pins.gpio1.into(),
    fn_input: |msg| match msg.data {
        MsgData::Custom(Custom::EspRelay(value)) => Some(value),
        _ => None,
    },
    is_low_triggered: false,
}],
}

cmp_esp_mqtt_client

Клиент MQTT микроконтроллера ESP32

Платформы

ПлатформаПоддержка
aarch64-linux-android-
aarch64-unknown-linux-gnu-
riscv32imc-esp-espidf+
x86_64-linux-android-
x86_64-unknown-linux-gnu-
wasm32-unknown-unknown-

cmp_esp_nvs

cmp_esp_wifi

cmp_external_fn_process

cmp_http_client

cmp_http_client_wasm

cmp_http_server

cmp_http_server_esp

cmp_influxdb

cmp_inject_periodic

cmp_leptos

Компонент для интеграции веб-приложения на основе фреймворка Leptos.

Платформы

ПлатформаПоддержка
aarch64-linux-android-
aarch64-unknown-linux-gnu-
riscv32imc-esp-espidf-
x86_64-linux-android-
x86_64-unknown-linux-gnu-
wasm32-unknown-unknown+

Конфигурация

Config

body_component

Корневой компонент для монтирования

Примеры

#![allow(unused)]
fn main() {
body_component: || view! { <App/> }
}

hostname

Имя хоста, на котором развернуто веб-приложение

cmp_logger

cmp_modbus_client

cmp_mqtt_client

cmp_plc

cmp_raspberrypi_gpio

Компонент для работы с GPIO Raspberry Pi

Обертка над библиотекой rppal

Запускать программу скорее всего нужно из-под sudo.

Распиновка

Платформы

ПлатформаПоддержка
aarch64-linux-android-
aarch64-unknown-linux-gnu+
riscv32imc-esp-espidf-
x86_64-linux-android-
x86_64-unknown-linux-gnu-
wasm32-unknown-unknown-

Конфигурация

Config

inputs

Обработка входов

Примеры

  • Чтение входа с 4 пина
#![allow(unused)]
fn main() {
inputs: vec![cmp_raspberrypi_gpio::ConfigInput {
    pin_number: 4,
    fn_output: |value| Message::new_custom(Custom::Input4State(value)),
}],
}

outputs

Обработка выходов

Примеры

  • Управление вторым выходом
#![allow(unused)]
fn main() {
outputs: vec![cmp_raspberrypi_gpio::ConfigOutput {
    pin_number: 2,
    fn_input: |msg| match msg.data {
        MsgData::Custom(Custom::SetOutput2(value)) => Some(value),
        _ => None,
    },
}],
}

cmp_redis_client

cmp_slint

cmp_surrealdb

cmp_system_info

cmp_timescaledb

cmp_websocket_client

cmp_websocket_client_wasm

cmp_websocket_server

cmp_webstorage

Хранение и загрузка сообщений используя LocalStorage или SessionStorage браузера. Подробнее на MDN.

Платформы

ПлатформаПоддержка
aarch64-linux-android-
aarch64-unknown-linux-gnu-
riscv32imc-esp-espidf-
x86_64-linux-android-
x86_64-unknown-linux-gnu-
wasm32-unknown-unknown+

Конфигурация

Config

kind

Вид хранилища - localStorage или sessionStorage.

fn_input

Сохранение сообщений в хранилище

Примеры

  • Сохранять все сообщения
#![allow(unused)]
fn main() {
fn_input: Some,
}

fn_output

Загрузка сообщений из хранилища (LocalStorage)

Примеры

  • Ничего не загружать
#![allow(unused)]
fn main() {
fn_output: |_| None,
}

ConfigKind

Вид хранилища

LocalStorage

Сохраняет данные при перезапуске браузера.

SessionStorage

Сохраняет данные. При перезапуске браузера данные теряются.

Подготовка среды разработки

ARM

sudo apt install g++-aarch64-linux-gnu

Slint

sudo apt-get install qtbase5-dev

Android

sudo apt install openjdk-21-jdk

$env.JAVA_HOME = /snap/android-studio/current/jbr/

$env.ANDROID_HOME = "/home/konstantin/Android/Sdk"
$env.ANDROID_NDK_ROOT = $"($env.ANDROID_HOME)/ndk/26.2.11394342"

$env.TOOLCHAIN = $"($env.ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/linux-x86_64"
$env.TARGET = aarch64-linux-android
$env.API = 33

$env.AR = $"($env.TOOLCHAIN)/bin/llvm-ar"
$env.CC = $"($env.TOOLCHAIN)/bin/($env.TARGET)($env.API)-clang"
$env.AS = $env.CC
$env.CXX = $"($env.TOOLCHAIN)/bin/($env.TARGET)($env.API)-clang++"
$env.LD = $"($env.TOOLCHAIN)/bin/ld"
$env.RANLIB = $"($env.TOOLCHAIN)/bin/llvm-ranlib"
$env.STRIP = $"($env.TOOLCHAIN)/bin/llvm-strip"

Tauri

Официальный гайд - https://beta.tauri.app/guides/prerequisites/

sudo apt update
sudo apt install libwebkit2gtk-4.1-dev \
  build-essential \
  curl \
  wget \
  file \
  libssl-dev \
  libayatana-appindicator3-dev \
  librsvg2-dev

Установка Android Studio

sudo snap install android-studio --classic

Запустить Android Studio, поставить пакеты по-умолчанию. Открыть SDK Manager и установить NDK (Side by side) и Android SDK CLI.

Добавить target:

rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android wasm32-unknown-unknown

Переменные среды

Необходимо задать переменные среды.

Nushell

Задать переменные среды в файле ~/.config/nushell/config.nu. Проверить версию NDK

$env.JAVA_HOME = /snap/android-studio/current/jbr/
$env.ANDROID_HOME = "/home/konstantin/Android/Sdk"
$env.NDK_HOME = $"($env.ANDROID_HOME)/ndk/26.2.11394342"

По компонентам

cmp_leptos

Таргеты

Trunk

cargo install trunk

Tauri

Если требуется разработка приложения Tauri (https://beta.tauri.app/guides/prerequisites/).

(sudo apt install libwebkit2gtk-4.1-dev
  build-essential
  curl
  wget
  file
  libssl-dev
  libayatana-appindicator3-dev
  librsvg2-dev)

Tauri CLI

cargo install tauri-cli --version "^2.0.0-beta"

Create tauri apps

cargo install create-tauri-app

Env variables

~/.config/nushell/config.nu:

$env.JAVA_HOME = "/snap/android-studio/current/jbr"
$env.ANDROID_HOME = "/home/konstantin/Android/Sdk"
$env.NDK_HOME = $"($env.ANDROID_HOME)/ndk/26.2.11394342"

Проверить пути

cmp_slint

cargo apk

cargo install cargo-apk

Java

sudo apt install openjdk-21-jdk

Или более новую, что есть в репозиториях

По платформам

aarch64-linux-android

Таргет

rustup target add aarch64-linux-android

Android Studio

sudo snap install android-studio --classic

Запустить android studio, поставить пакеты по-умолчанию. Открыть SDK Manager и установить:

  • Android SDK Platform
  • Android SDK Build-Tools
  • NDK (Side by side)
  • Android SDK CLI
  • Android SDK Platform-Tools

ADB

sudo apt install adb

aarch64-unknown-linux-gnu

Ставим библиотеки:

sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

Добавляем таргет:

rustup target add aarch64-unknown-linux-gnu

armv7-linux-androideabi

Таргет

rustup target add armv7-linux-androideabi

i686-linux-android

Таргет

rustup target add i686-linux-android

riscv32imc-esp-espidf

toolchain

rustup toolchain install nightly-2024-02-01-x86_64-unknown-linux-gnu --component rust-src

TODO - обновить когда пофиксят

ESP-IDF

Зависимости для ESP-IDF (https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/linux-macos-setup.html#for-linux-users):

sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0

ldproxy

cargo install ldproxy

LLVM

sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"

espflash

sudo usermod -a -G dialout $USER

sudo apt install libudev-dev

cargo install espflash

wasm32-unknown-unknown

Добавляем таргет:

rustup target add wasm32-unknown-unknown

x86_64-linux-android

Таргет

rustup target add x86_64-linux-android

Создание проекта

Tauri

cargo create-tauri-app --beta

Поддержка android

cargo tauri android init

Добавить настройку для rast-analyzer в .vscode/settings.json

"rust-analyzer.cargo.target": "wasm32-unknown-unknown"

По компонентам

cmp_leptos

.vscode/settings.json

{
  "rust-analyzer.cargo.target": "wasm32-unknown-unknown"
}

Tauri

cargo create-tauri-app --beta

# добавить поддержку Android
cargo tauri android init

Tailwind

npm install -D tailwindcss
npm install -D @tailwindcss/forms
npx tailwindcss init

tailwind.config.js

module.exports = {
  content: {
    files:  [
      "*.html",
    "./src/**/*.rs",
    "../../rsiot/src/components/cmp_leptos/components/tailwind/**/*.rs"
    ],
  },
  plugins: [require('@tailwindcss/forms'),],
}

Создать файл input.css в корне проекта:

@tailwind base;
@tailwind components;
@tailwind utilities;

Добавить в index.html:

<html>
  <head>
    <!-- Подключаем стили, которые компилирует Tailwind -->
    <link data-trunk rel="tailwind-css" href="input.css" />
  </head>
</html>

Rustiwind

Для сортировки классов Tailwind можно поставить утилиту:

cargo install rustywind

Вызов:

rustywind --write src/

По платформам

aarch64-linux-android

Добавить настройку для rast-analyzer в .vscode/settings.json

{
  "rust-analyzer.cargo.target": "aarch64-linux-android"
}

Tauri

Проверить путь установки, версию NDK (26.2.11394342).

Slint

Задать переменные в файле .cargo/config.toml:

[env]
ANDROID_HOME = "/home/konstantin/Android/Sdk"
ANDROID_NDK_ROOT = "/home/konstantin/Android/Sdk/ndk/26.2.11394342"
JAVA_HOME = "/snap/android-studio/current/jbr/"

CC_aarch64-linux-android = "/home/konstantin/Android/Sdk/ndk/26.2.11394342/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang"
CCX_aarch64-linux-android = "/home/konstantin/Android/Sdk/ndk/26.2.11394342/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang"
AR_aarch64-linux-android = "/home/konstantin/Android/Sdk/ndk/26.2.11394342/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar"
RANLIB_aarch64-linux-android = "/home/konstantin/Android/Sdk/ndk/26.2.11394342/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib"

Проверить путь установки, версию NDK (26.2.11394342), версию платформы (34).

aarch64-unknown-linux-gnu

В файле .cargo/config.toml:

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"

riscv32imc-esp-espidf

cargo new project_name

.vscode/settings.json

{
  "rust-analyzer.cargo.target": "riscv32imc-esp-espidf"
}

.cargo/config.toml

[build]
target = "riscv32imc-esp-espidf"

[target.riscv32imc-esp-espidf]
linker = "ldproxy"
runner = "espflash flash --monitor"
rustflags = [
    "--cfg",
    "espidf_time64",
    "--cfg",
    "mio_unsupported_force_poll_poll", # https://github.com/tokio-rs/tokio/issues/5866
]

[unstable]
build-std = ["std", "panic_abort"]

[env]
MCU = "esp32c3"
# install all libraries globally, in folder ~/.espressif
ESP_IDF_TOOLS_INSTALL_DIR = "global"
# check current version on https://docs.espressif.com/projects/esp-idf/en/latest/esp32/index.html
ESP_IDF_VERSION = "v5.2.1"

build.rs

fn main() {
    embuild::espidf::sysenv::output();
}

rust-toolchain.toml

[toolchain]
channel = "nightly-2024-02-01"
components = ["rust-src"]

sdkconfig.defaults

# Rust often needs a bit of an extra main task stack size compared to C (the default is 3K)
CONFIG_ESP_MAIN_TASK_STACK_SIZE=8000

# Use this to set FreeRTOS kernel tick frequency to 1000 Hz (100 Hz by default).
# This allows to use 1 ms granuality for thread sleeps (10 ms by default).
#CONFIG_FREERTOS_HZ=1000

# Workaround for https://github.com/espressif/esp-idf/issues/7631
#CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n
#CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=n

CONFIG_HTTPD_WS_SUPPORT=y

# Настройка логгирования
CONFIG_LOG_DEFAULT_LEVEL_VERBOSE=y
CONFIG_LOG_DEFAULT_LEVEL=5
CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y
CONFIG_LOG_MAXIMUM_LEVEL=5
CONFIG_LOG_COLORS=y

Config.toml

[dependencies]
esp-idf-svc = { version = "*" }

[build-dependencies]
embuild = { version = "*", features = ["espidf"] }

main.rs

Первой строкой в функции main():

#![allow(unused)]
fn main() {
esp_idf_svc::sys::link_patches()
}

Отладка

По платформам

aarch64-linux-android

Получить отфильтрованные логи из телефона:

adb logcat RustStdoutStderr:I *:S

Выводить только сообщения от Rust с уровнем Info и выше.

Уровни фильтрации:

  • V: Verbose (lowest priority)
  • D: Debug
  • I: Info
  • W: Warning
  • E: Error
  • F: Fatal
  • S: Silent (highest priority, where nothing is ever printed)

x86_64-linux-android

Получить отфильтрованные логи из телефона:

adb logcat RustStdoutStderr:I *:S

Выводить только сообщения от Rust с уровнем Info и выше.

Уровни фильтрации:

  • V: Verbose (lowest priority)
  • D: Debug
  • I: Info
  • W: Warning
  • E: Error
  • F: Fatal
  • S: Silent (highest priority, where nothing is ever printed)

Релиз

По платформам

riscv32imc-esp-espidf

cargo run --release