Crate rsiot

source ·
Expand description

Компоненты для построения системы сбора данных Документация

§Зачем это надо

§Обзор

<sodipodi:namedview id=“namedview1” pagecolor=“#ffffff” bordercolor=“#000000” borderopacity=“0.25” inkscape:showpageshadow=“2” inkscape:pageopacity=“0.0” inkscape:pagecheckerboard=“0” inkscape:deskcolor=“#d1d1d1” inkscape:zoom=“0.69842878” inkscape:cx=“411.63825” inkscape:cy=“481.07983” inkscape:window-width=“2560” inkscape:window-height=“988” inkscape:window-x=“0” inkscape:window-y=“0” inkscape:window-maximized=“1” inkscape:current-layer=“g1”> <inkscape:page x=“0” y=“0” inkscape:label=“1” id=“page1” width=“793.70087” height=“1122.5197” margin=“0” bleed=“0” /> </sodipodi:namedview>

§Компоненты

§Взаимодействие с устройствами нижнего уровня

modbus-client

Взаимодейтсвие с устройствами, поддерживающими протокол Modbus TCP сервер / Modbus RTU slave.

http-client

Взаимодействие с устройствами, имеющими HTTP API.

websocket-client

Взаимодействие с устройствами, поддерживющими функциональность Websocket сервера.

TODO opcua-client

Взаимодействие с контроллерами, имеющими функциональность OPC UA сервера.

TODO s7-client

Взаимодействие с контроллерами Siemens по протоколу S7.

esp

Компоненты для взаимодействия с HAL (hardware access level) микроконтроллера ESP32.

§Взаимодействие с системами верхнего уровня

http-server

Поддержка HTTP API, через который внешние клиенты могут получать и вводить данные.

websocket-server

Поддержка Websocket сервера, к которому могут подключаться внешние клиенты.

TODO telegram

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

redis-client

Подписка и публикация сообщения в Redis.

TODO mqtt

§Сохранение данных в БД

timescaledb-storing

Сохрание сообщений в виде временных рядов в TimescaleDB.

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

TODO leptos

§Вспомогательные крейты

plc

Выполнение произвольной логики в “стиле PLC”.

env-vars

Чтение конфигурации из файла .env.

logging

Настройка логгирования

§Описание

Компоненты представляют собой асинхронные функции. У всех функций три аргумента:

async fn component<TMessage, TConfig>(
    input: Option<tokio::sync::mpsc::Receiver<TMessage>>,
    output: Option<tokio::sync::mpsc::Sender<TMessage>>,
    config: TConfig,
) -> ()
where
    TMessage: IMessage
{}

Сообщения между компонентами передаются через каналы “many producers to a single consumer” библиотеки tokio.

Входной или выходной потоки могут быть не заданы, поэтому каналы обернуты в Option.

Структура конфигурации типа TConfig у каждого компонента своя.

Компоненты ничего не возвращают (точнее, возвращают тип ()). Если в компоненте возникает ошибка, логику перезапуска необходимо реализовать внутри данной функции. TODO - пересмотреть, возможно стоит возвращать Result при критических ошибках.

Сообщения представляют собой тип enum, например:

use rsiot_messages_core::IMessage;
use serde::{Deserialize, Serialize};

[derive(Clone, Debug, Deserialize, Serialize)]
enum Message {
    /// Текущее значение температуры
    Temperature(f64),
    /// Задание уставки
    ChangeSetpoint(f64),
}

impl IMessage for Message {}

Трейт IMessage реализует основные методы - см. документацию по крейту rsiot-messages-core

Для упрощения компоненты можно создавать и объединять в цепочку компонентов.

TODO - компонент для симуляции

  • может генерировать сообщения как на основе входных сообщений
  • может генерировать сообщения периодически

§Флаги feature:

  • components — Базовые компоненты
  • env-vars — Конфигурирование через переменные
  • http-client — Компонент http-клиент
  • http-client-wasm — Компонент http-клиент для платформы WASM
  • http-server — Компонент http-сервер
  • influxdb — Компонент сохранения в БД InfluxDB
  • leptos — Компонент для создания интерфейсов на базе Leptos
  • modbus-client — Компонент Modbus клиент
  • redis-client — Компонент клиента Redis
  • timescaledb-storing — Компонент сохранения в БД TimescaleDB
  • websocket-client — Компонент websocket клиента
  • websocket-client-wasm — Компонент websocket клиента
  • websocket-server — Компонент websocket сервера
  • single-thread — Работа в одном потоке, в LocalSet TODO Написать про роутинг сообщений

Modules§