Skip to main content

rsiot/components_config/mqtt_client/
mod.rs

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