rsiot/components_config/mqtt_client/
mod.rs

1//! Настройки коммуникации с MQTT-брокером
2
3mod mqtt_msg;
4mod mqtt_msg_gen;
5
6pub use mqtt_msg::MqttMsg;
7pub use mqtt_msg_gen::MqttMsgGen;
8
9use crate::{
10    message::{Message, MsgDataBound},
11    serde_utils::SerdeAlgKind,
12};
13
14/// Преобразование входящих сообщений в данные для публикации в брокере
15pub type FnPublish<TMsg> = fn(&TMsg, &MqttMsgGen) -> anyhow::Result<Option<MqttMsg>>;
16
17/// Преобразование данных от брокера сообщений в исходящие сообщения
18pub type FnSubscribe<TMsg> =
19    fn(&MqttMsg, &MqttMsgGen) -> anyhow::Result<Option<Vec<Message<TMsg>>>>;
20
21/// Конфигурация cmp_mqtt_client
22#[derive(Clone)]
23pub struct Config<TMsg>
24where
25    TMsg: MsgDataBound,
26{
27    /// Алгоритм сериализации / десериализации
28    pub serde_alg: SerdeAlgKind,
29
30    /// Идентификатор клиента MQTT
31    pub client_id: String,
32
33    /// Адрес брокера
34    ///
35    /// Примеры:
36    /// - `localhost`
37    pub host: String,
38
39    /// Порт брокера.
40    ///
41    /// По-умолчанию - 1883
42    pub port: u16,
43
44    /// Ёмкость клиента.
45    ///
46    /// Можно задать 100
47    pub client_capacity: usize,
48
49    /// Настройка публикации данных в брокере
50    pub publish: ConfigPublish<TMsg>,
51
52    /// Настройка подписки на данные из брокера
53    pub subscribe: ConfigSubscribe<TMsg>,
54}
55
56/// Конфигурация настроек публикации на брокере
57#[derive(Clone)]
58pub enum ConfigPublish<TMsg>
59where
60    TMsg: MsgDataBound,
61{
62    /// Не публиковать
63    NoPublish,
64    /// Публиковать
65    Publish {
66        /// Функция принимает входящие сообщения и возвращает возможную структуру для публикации в
67        /// брокере
68        fn_publish: FnPublish<TMsg>,
69    },
70}
71
72/// Конфигурация настроек подписки на сообщения из брокера
73#[derive(Clone)]
74pub enum ConfigSubscribe<TMsg>
75where
76    TMsg: MsgDataBound,
77{
78    /// Не подписываться
79    NoSubscribe,
80    /// Подписаться
81    Subscribe {
82        /// Токен
83        token: String,
84        /// Функция принимает сообщения из брокера и формирует возможный массив исходящих сообщений
85        fn_subscribe: FnSubscribe<TMsg>,
86    },
87}