Документация rsiot
Документация для крейта rsiot.
Целевые платформы
target triple | Описание | Документация API |
---|---|---|
aarch64-linux-android | Android | ссылка |
aarch64-unknown-linux-gnu | ссылка | |
riscv32imc-esp-espidf | Микроконтроллеры ESP32-C3 | ссылка |
x86_64-linux-android | Android | |
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_http_client_wasm
- cmp_http_client
- cmp_modbus_client
- cmp_websocket_client_wasm
- cmp_websocket_client
Сервера:
Брокеры сообщений:
Интерфейс пользователя:
Авторизация:
Сохранение данных:
Взаимодействие с аппаратной частью
Логика исполнения
Систеная информация
Служебные компоненты:
- cmp_add_input_stream
- cmp_add_output_stream
- cmp_derive
- cmp_external_fn_process
- cmp_inject_periodic
- cmp_logger
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
Таргеты
- wasm32-unknown-unknown
- aarch64-linux-android (Tauri / Android)
- armv7-linux-androideabi (Tauri / Android)
- i686-linux-android (Tauri / Android)
- x86_64-linux-android (Tauri / Android)
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